allow upsert for duplicate key
Этот коммит содержится в:
@@ -50,15 +50,23 @@ func (s SqlLinkMetadataStore) Save(metadata *model.LinkMetadata) (*model.LinkMet
|
|||||||
return nil, errors.Wrap(err, "could not serialize metadataBytes to JSON")
|
return nil, errors.Wrap(err, "could not serialize metadataBytes to JSON")
|
||||||
}
|
}
|
||||||
|
|
||||||
query, args, err := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Insert("LinkMetadata").
|
Insert("LinkMetadata").
|
||||||
Columns("Hash", "URL", "Timestamp", "Type", "Data").
|
Columns("Hash", "URL", "Timestamp", "Type", "Data").
|
||||||
Values(metadata.Hash, metadata.URL, metadata.Timestamp, metadata.Type, string(metadataBytes)).
|
Values(metadata.Hash, metadata.URL, metadata.Timestamp, metadata.Type, string(metadataBytes))
|
||||||
ToSql()
|
|
||||||
|
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 {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "metadata_tosql")
|
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"}) {
|
if err != nil && !IsUniqueConstraintError(err, []string{"PRIMARY", "linkmetadata_pkey"}) {
|
||||||
return nil, errors.Wrap(err, "could not save link metadata")
|
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)
|
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{
|
metadata := &model.LinkMetadata{
|
||||||
URL: "http://example.com",
|
URL: "http://example.com",
|
||||||
Timestamp: getNextLinkMetadataTimestamp(),
|
Timestamp: getNextLinkMetadataTimestamp(),
|
||||||
@@ -116,7 +116,7 @@ func testLinkMetadataStoreSave(t *testing.T, ss store.Store) {
|
|||||||
// Should return the original result, not the duplicate one
|
// Should return the original result, not the duplicate one
|
||||||
linkMetadata, err = ss.LinkMetadata().Get(metadata.URL, metadata.Timestamp)
|
linkMetadata, err = ss.LinkMetadata().Get(metadata.URL, metadata.Timestamp)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, &model.PostImage{}, linkMetadata.Data)
|
assert.NotEqual(t, &model.PostImage{}, linkMetadata.Data)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user