allow upsert for duplicate key

Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2021-12-17 11:39:25 +03:00
родитель 0b1e9445c8
Коммит ca02fabb91
2 изменённых файлов: 14 добавлений и 6 удалений

Просмотреть файл

@@ -50,15 +50,23 @@ func (s SqlLinkMetadataStore) Save(metadata *model.LinkMetadata) (*model.LinkMet
return nil, errors.Wrap(err, "could not serialize metadataBytes to JSON")
}
query, args, err := s.getQueryBuilder().
query := s.getQueryBuilder().
Insert("LinkMetadata").
Columns("Hash", "URL", "Timestamp", "Type", "Data").
Values(metadata.Hash, metadata.URL, metadata.Timestamp, metadata.Type, string(metadataBytes)).
ToSql()
Values(metadata.Hash, metadata.URL, metadata.Timestamp, metadata.Type, string(metadataBytes))
if s.DriverName() == model.DatabaseDriverMysql {
query = query.SuffixExpr(sq.Expr("ON DUPLICATE KEY UPDATE URL = ?, Timestamp = ?, Type = ?, Data = ?", metadata.URL, metadata.Timestamp, metadata.Type, string(metadataBytes)))
} else {
query = query.SuffixExpr(sq.Expr("ON CONFLICT (hash) DO UPDATE SET URL = ?, Timestamp = ?, Type = ?, Data = ?", metadata.URL, metadata.Timestamp, metadata.Type, string(metadataBytes)))
}
q, args, err := query.ToSql()
if err != nil {
return nil, errors.Wrap(err, "metadata_tosql")
}
_, err = s.GetMasterX().Exec(query, args...)
_, err = s.GetMasterX().Exec(q, args...)
if err != nil && !IsUniqueConstraintError(err, []string{"PRIMARY", "linkmetadata_pkey"}) {
return nil, errors.Wrap(err, "could not save link metadata")
}

Просмотреть файл

@@ -95,7 +95,7 @@ func testLinkMetadataStoreSave(t *testing.T, ss store.Store) {
assert.Equal(t, *metadata, *linkMetadata)
})
t.Run("should not save with duplicate URL and timestamp, but should not return an error", func(t *testing.T) {
t.Run("should save data with duplicate URL and timestamp", func(t *testing.T) {
metadata := &model.LinkMetadata{
URL: "http://example.com",
Timestamp: getNextLinkMetadataTimestamp(),
@@ -116,7 +116,7 @@ func testLinkMetadataStoreSave(t *testing.T, ss store.Store) {
// Should return the original result, not the duplicate one
linkMetadata, err = ss.LinkMetadata().Get(metadata.URL, metadata.Timestamp)
require.NoError(t, err)
assert.Equal(t, &model.PostImage{}, linkMetadata.Data)
assert.NotEqual(t, &model.PostImage{}, linkMetadata.Data)
})
}