[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
Этот коммит содержится в:
Mario de Frutos Dieguez
2020-07-15 09:19:51 +02:00
коммит произвёл GitHub
родитель ec78168242
Коммит 6107660483

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

@@ -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 {