Merge pull request #19196 from mattermost/MM-39542
[MM-39542] Allow upsert for duplicate key in LinkMetadataStore
Этот коммит содержится в:
@@ -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(),
|
||||
@@ -107,16 +107,17 @@ func testLinkMetadataStoreSave(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, &model.PostImage{}, linkMetadata.Data)
|
||||
|
||||
metadata.Data = &model.PostImage{Height: 10, Width: 20}
|
||||
newData := &model.PostImage{Height: 10, Width: 20}
|
||||
metadata.Data = newData
|
||||
|
||||
linkMetadata, err = ss.LinkMetadata().Save(metadata)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, linkMetadata.Data, &model.PostImage{Height: 10, Width: 20})
|
||||
assert.Equal(t, newData, linkMetadata.Data)
|
||||
|
||||
// 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.Equal(t, newData, linkMetadata.Data)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user