* Use DB native JSON operations for Delete post https://community-daily.mattermost.com/plugins/focalboard/workspace/zyoahc9uapdn3xdptac6jb69ic/285b80a3-257d-41f6-8cf4-ed80ca9d92e5/495cdb4d-c13a-4992-8eb9-80cfee2819a4?c=cb23f737-89c3-4e19-861e-2466c0a16205 ```release-note NONE ``` * move to adapters ```release-note NONE ``` Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
151 строка
3.9 KiB
Go
151 строка
3.9 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package sqlstore
|
|
|
|
import (
|
|
"bytes"
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/dyatlov/go-opengraph/opengraph"
|
|
"github.com/mattermost/gorp"
|
|
"github.com/mattermost/mattermost-server/v6/model"
|
|
"github.com/mattermost/mattermost-server/v6/shared/i18n"
|
|
"github.com/mattermost/mattermost-server/v6/shared/mlog"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type jsonArray []string
|
|
|
|
func (a jsonArray) Value() (driver.Value, error) {
|
|
var out bytes.Buffer
|
|
if err := out.WriteByte('['); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for i, item := range a {
|
|
if _, err := out.WriteString(strconv.Quote(item)); err != nil {
|
|
return nil, err
|
|
}
|
|
// Skip the last element.
|
|
if i < len(a)-1 {
|
|
out.WriteByte(',')
|
|
}
|
|
}
|
|
|
|
if err := out.WriteByte(']'); err != nil {
|
|
return nil, err
|
|
}
|
|
return out.Bytes(), nil
|
|
}
|
|
|
|
type jsonStringVal string
|
|
|
|
func (str jsonStringVal) Value() (driver.Value, error) {
|
|
return strconv.Quote(string(str)), nil
|
|
}
|
|
|
|
type jsonKeyPath string
|
|
|
|
func (str jsonKeyPath) Value() (driver.Value, error) {
|
|
return "{" + string(str) + "}", nil
|
|
}
|
|
|
|
type TraceOnAdapter struct{}
|
|
|
|
func (t *TraceOnAdapter) Printf(format string, v ...interface{}) {
|
|
originalString := fmt.Sprintf(format, v...)
|
|
newString := strings.ReplaceAll(originalString, "\n", " ")
|
|
newString = strings.ReplaceAll(newString, "\t", " ")
|
|
newString = strings.ReplaceAll(newString, "\"", "")
|
|
mlog.Debug(newString)
|
|
}
|
|
|
|
type JSONSerializable interface {
|
|
ToJson() string
|
|
}
|
|
|
|
type mattermConverter struct{}
|
|
|
|
func (me mattermConverter) ToDb(val interface{}) (interface{}, error) {
|
|
switch t := val.(type) {
|
|
case model.StringMap:
|
|
return model.MapToJson(t), nil
|
|
case map[string]string:
|
|
return model.MapToJson(model.StringMap(t)), nil
|
|
case model.StringArray:
|
|
return model.ArrayToJson(t), nil
|
|
case model.StringInterface:
|
|
return model.StringInterfaceToJson(t), nil
|
|
case map[string]interface{}:
|
|
return model.StringInterfaceToJson(model.StringInterface(t)), nil
|
|
case JSONSerializable:
|
|
return t.ToJson(), nil
|
|
case *opengraph.OpenGraph:
|
|
return json.Marshal(t)
|
|
}
|
|
|
|
return val, nil
|
|
}
|
|
|
|
func (me mattermConverter) FromDb(target interface{}) (gorp.CustomScanner, bool) {
|
|
switch target.(type) {
|
|
case *model.StringMap:
|
|
binder := func(holder, target interface{}) error {
|
|
s, ok := holder.(*string)
|
|
if !ok {
|
|
return errors.New(i18n.T("store.sql.convert_string_map"))
|
|
}
|
|
b := []byte(*s)
|
|
return json.Unmarshal(b, target)
|
|
}
|
|
return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true
|
|
case *map[string]string:
|
|
binder := func(holder, target interface{}) error {
|
|
s, ok := holder.(*string)
|
|
if !ok {
|
|
return errors.New(i18n.T("store.sql.convert_string_map"))
|
|
}
|
|
b := []byte(*s)
|
|
return json.Unmarshal(b, target)
|
|
}
|
|
return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true
|
|
case *model.StringArray:
|
|
binder := func(holder, target interface{}) error {
|
|
s, ok := holder.(*string)
|
|
if !ok {
|
|
return errors.New(i18n.T("store.sql.convert_string_array"))
|
|
}
|
|
b := []byte(*s)
|
|
return json.Unmarshal(b, target)
|
|
}
|
|
return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true
|
|
case *model.StringInterface:
|
|
binder := func(holder, target interface{}) error {
|
|
s, ok := holder.(*string)
|
|
if !ok {
|
|
return errors.New(i18n.T("store.sql.convert_string_interface"))
|
|
}
|
|
b := []byte(*s)
|
|
return json.Unmarshal(b, target)
|
|
}
|
|
return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true
|
|
case *map[string]interface{}:
|
|
binder := func(holder, target interface{}) error {
|
|
s, ok := holder.(*string)
|
|
if !ok {
|
|
return errors.New(i18n.T("store.sql.convert_string_interface"))
|
|
}
|
|
b := []byte(*s)
|
|
return json.Unmarshal(b, target)
|
|
}
|
|
return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true
|
|
}
|
|
|
|
return gorp.CustomScanner{}, false
|
|
}
|