From ca02fabb917dde893f1abbbfaf253a3d8e5dc84f Mon Sep 17 00:00:00 2001 From: Ibrahim Serdar Acikgoz Date: Fri, 17 Dec 2021 11:39:25 +0300 Subject: [PATCH 1/3] allow upsert for duplicate key --- store/sqlstore/link_metadata_store.go | 16 ++++++++++++---- store/storetest/link_metadata_store.go | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/store/sqlstore/link_metadata_store.go b/store/sqlstore/link_metadata_store.go index bfbc173c0c..67413b31da 100644 --- a/store/sqlstore/link_metadata_store.go +++ b/store/sqlstore/link_metadata_store.go @@ -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") } diff --git a/store/storetest/link_metadata_store.go b/store/storetest/link_metadata_store.go index c4a7986af6..0550a56451 100644 --- a/store/storetest/link_metadata_store.go +++ b/store/storetest/link_metadata_store.go @@ -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) }) } From 7f2e60289b8f32ac131d31dfa55f22a7a46babc4 Mon Sep 17 00:00:00 2001 From: Ibrahim Serdar Acikgoz Date: Wed, 22 Dec 2021 12:24:25 +0300 Subject: [PATCH 2/3] reflect review comments --- store/storetest/link_metadata_store.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/store/storetest/link_metadata_store.go b/store/storetest/link_metadata_store.go index 0550a56451..b6b2df2872 100644 --- a/store/storetest/link_metadata_store.go +++ b/store/storetest/link_metadata_store.go @@ -107,7 +107,8 @@ 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) @@ -116,7 +117,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.NotEqual(t, &model.PostImage{}, linkMetadata.Data) + assert.Equal(t, newData, linkMetadata.Data) }) } From 6bf646c921bc33b94363e465528a738f70c74a8e Mon Sep 17 00:00:00 2001 From: Ibrahim Serdar Acikgoz Date: Wed, 22 Dec 2021 12:33:56 +0300 Subject: [PATCH 3/3] . --- store/storetest/link_metadata_store.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/store/storetest/link_metadata_store.go b/store/storetest/link_metadata_store.go index b6b2df2872..0a9376225a 100644 --- a/store/storetest/link_metadata_store.go +++ b/store/storetest/link_metadata_store.go @@ -112,7 +112,7 @@ func testLinkMetadataStoreSave(t *testing.T, ss store.Store) { 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)