From ba9cbae0d5f2a4cf6e112354264e7abb6120ae09 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Fri, 9 Jul 2021 19:36:35 +0530 Subject: [PATCH] PluginStore: Use native upsert for Postgres (#17882) Now that version 10 is minimum, we can start to use advanced postgres features. https://focalboard-community.octo.mattermost.com/workspace/zyoahc9uapdn3xdptac6jb69ic?id=285b80a3-257d-41f6-8cf4-ed80ca9d92e5&v=495cdb4d-c13a-4992-8eb9-80cfee2819a4&c=0445b560-91b9-469b-8f19-febf1881bcd6 ```release-note NONE ``` --- store/sqlstore/plugin_store.go | 35 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/store/sqlstore/plugin_store.go b/store/sqlstore/plugin_store.go index 3aa282a56f..b8767e32ef 100644 --- a/store/sqlstore/plugin_store.go +++ b/store/sqlstore/plugin_store.go @@ -54,32 +54,23 @@ func (ps SqlPluginStore) SaveOrUpdate(kv *model.PluginKeyValue) (*model.PluginKe return kv, nil } + query := ps.getQueryBuilder(). + Insert("PluginKeyValueStore"). + Columns("PluginId", "PKey", "PValue", "ExpireAt"). + Values(kv.PluginId, kv.Key, kv.Value, kv.ExpireAt) if ps.DriverName() == model.DATABASE_DRIVER_POSTGRES { - // Unfortunately PostgreSQL pre-9.5 does not have an atomic upsert, so we use - // separate update and insert queries to accomplish our upsert - if rowsAffected, err := ps.GetMaster().Update(kv); err != nil { - return nil, errors.Wrap(err, "failed to update PluginKeyValue") - } else if rowsAffected == 0 { - // No rows were affected by the update, so let's try an insert - if err := ps.GetMaster().Insert(kv); err != nil { - return nil, errors.Wrap(err, "failed to save PluginKeyValue") - } - } + query = query.SuffixExpr(sq.Expr("ON CONFLICT (pluginid, pkey) DO UPDATE SET PValue = ?, ExpireAt = ?", kv.Value, kv.ExpireAt)) } else if ps.DriverName() == model.DATABASE_DRIVER_MYSQL { - query := ps.getQueryBuilder(). - Insert("PluginKeyValueStore"). - Columns("PluginId", "PKey", "PValue", "ExpireAt"). - Values(kv.PluginId, kv.Key, kv.Value, kv.ExpireAt). - SuffixExpr(sq.Expr("ON DUPLICATE KEY UPDATE PValue = ?, ExpireAt = ?", kv.Value, kv.ExpireAt)) + query = query.SuffixExpr(sq.Expr("ON DUPLICATE KEY UPDATE PValue = ?, ExpireAt = ?", kv.Value, kv.ExpireAt)) + } - queryString, args, err := query.ToSql() - if err != nil { - return nil, errors.Wrap(err, "plugin_tosql") - } + queryString, args, err := query.ToSql() + if err != nil { + return nil, errors.Wrap(err, "plugin_tosql") + } - if _, err := ps.GetMaster().Exec(queryString, args...); err != nil { - return nil, errors.Wrap(err, "failed to upsert PluginKeyValue") - } + if _, err := ps.GetMaster().Exec(queryString, args...); err != nil { + return nil, errors.Wrap(err, "failed to upsert PluginKeyValue") } return kv, nil