From 61076604838f6a51788fd3624ff1b3b2c8ef5737 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Dieguez Date: Wed, 15 Jul 2020 09:19:51 +0200 Subject: [PATCH] [MM-24088] Use Raw SQL query for PluginStore.Get instead of GORP (#14650) * Use Raw SQL query instead of GORP As part of performance improvements we're moving the top used queries to avoid using gorp and get rid of the overhead caused by the reflection usage --- store/sqlstore/plugin_store.go | 37 +++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/store/sqlstore/plugin_store.go b/store/sqlstore/plugin_store.go index 25b9e7a07f..aec1793d93 100644 --- a/store/sqlstore/plugin_store.go +++ b/store/sqlstore/plugin_store.go @@ -9,6 +9,8 @@ import ( "fmt" "net/http" + sq "github.com/Masterminds/squirrel" + "github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/store" ) @@ -219,16 +221,37 @@ func (ps SqlPluginStore) SetWithOptions(pluginId string, key string, value []byt } func (ps SqlPluginStore) Get(pluginId, key string) (*model.PluginKeyValue, *model.AppError) { - var kv *model.PluginKeyValue currentTime := model.GetMillis() - if err := ps.GetReplica().SelectOne(&kv, "SELECT * FROM PluginKeyValueStore WHERE PluginId = :PluginId AND PKey = :Key AND (ExpireAt = 0 OR ExpireAt > :CurrentTime)", map[string]interface{}{"PluginId": pluginId, "Key": key, "CurrentTime": currentTime}); err != nil { - if err == sql.ErrNoRows { - return nil, model.NewAppError("SqlPluginStore.Get", "store.sql_plugin_store.get.app_error", nil, fmt.Sprintf("plugin_id=%v, key=%v, err=%v", pluginId, key, err.Error()), http.StatusNotFound) - } - return nil, model.NewAppError("SqlPluginStore.Get", "store.sql_plugin_store.get.app_error", nil, fmt.Sprintf("plugin_id=%v, key=%v, err=%v", pluginId, key, err.Error()), http.StatusInternalServerError) + + failure := func(err error, statusCode int) *model.AppError { + return model.NewAppError( + "SqlPluginStore.Get", + "store.sql_plugin_store.get.app_error", + nil, + fmt.Sprintf("plugin_id=%v, key=%v, err=%v", pluginId, key, err.Error()), + statusCode, + ) } - return kv, nil + query := ps.getQueryBuilder().Select("PluginId, PKey, PValue, ExpireAt"). + From("PluginKeyValueStore"). + Where(sq.Eq{"PluginId": pluginId}). + Where(sq.Eq{"PKey": key}). + Where(sq.Or{sq.Eq{"ExpireAt": 0}, sq.Gt{"ExpireAt": currentTime}}) + queryString, args, err := query.ToSql() + if err != nil { + return nil, failure(err, http.StatusInternalServerError) + } + row := ps.GetReplica().Db.QueryRow(queryString, args...) + var kv model.PluginKeyValue + if err := row.Scan(&kv.PluginId, &kv.Key, &kv.Value, &kv.ExpireAt); err != nil { + if err == sql.ErrNoRows { + return nil, failure(err, http.StatusNotFound) + } + return nil, failure(err, http.StatusInternalServerError) + } + + return &kv, nil } func (ps SqlPluginStore) Delete(pluginId, key string) *model.AppError {