Merge pull request #19196 from mattermost/MM-39542

[MM-39542] Allow upsert for duplicate key in LinkMetadataStore
Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2021-12-22 16:31:59 +03:00
коммит произвёл GitHub
родитель 3b89080863 6bf646c921
Коммит 6c42d2816d
2 изменённых файлов: 17 добавлений и 8 удалений

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

@@ -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)
})
}