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 ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
7653100835
Коммит
ba9cbae0d5
@@ -54,32 +54,23 @@ func (ps SqlPluginStore) SaveOrUpdate(kv *model.PluginKeyValue) (*model.PluginKe
|
|||||||
return kv, nil
|
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 {
|
if ps.DriverName() == model.DATABASE_DRIVER_POSTGRES {
|
||||||
// Unfortunately PostgreSQL pre-9.5 does not have an atomic upsert, so we use
|
query = query.SuffixExpr(sq.Expr("ON CONFLICT (pluginid, pkey) DO UPDATE SET PValue = ?, ExpireAt = ?", kv.Value, kv.ExpireAt))
|
||||||
// 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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ps.DriverName() == model.DATABASE_DRIVER_MYSQL {
|
} else if ps.DriverName() == model.DATABASE_DRIVER_MYSQL {
|
||||||
query := ps.getQueryBuilder().
|
query = query.SuffixExpr(sq.Expr("ON DUPLICATE KEY UPDATE PValue = ?, ExpireAt = ?", kv.Value, kv.ExpireAt))
|
||||||
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))
|
|
||||||
|
|
||||||
queryString, args, err := query.ToSql()
|
queryString, args, err := query.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "plugin_tosql")
|
return nil, errors.Wrap(err, "plugin_tosql")
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := ps.GetMaster().Exec(queryString, args...); err != nil {
|
if _, err := ps.GetMaster().Exec(queryString, args...); err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to upsert PluginKeyValue")
|
return nil, errors.Wrap(err, "failed to upsert PluginKeyValue")
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return kv, nil
|
return kv, nil
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user