118 lines
2.5 KiB
Go
118 lines
2.5 KiB
Go
|
package models
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"database/sql/driver"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
)
|
||
|
|
||
|
type SliceString []string
|
||
|
|
||
|
func (c SliceString) Value() (driver.Value, error) {
|
||
|
return GormValueWrap(c)
|
||
|
}
|
||
|
|
||
|
func (c *SliceString) Scan(value interface{}) error {
|
||
|
return GormScanWrap(value, c)
|
||
|
}
|
||
|
|
||
|
type MapStringString map[string]string
|
||
|
|
||
|
func (c MapStringString) Value() (driver.Value, error) {
|
||
|
return GormValueWrap(c)
|
||
|
}
|
||
|
|
||
|
func (c *MapStringString) Scan(value interface{}) error {
|
||
|
return GormScanWrap(value, c)
|
||
|
}
|
||
|
|
||
|
type MapStringInterface map[string]interface{}
|
||
|
|
||
|
func (c MapStringInterface) Value() (driver.Value, error) {
|
||
|
return GormValueWrap(c)
|
||
|
}
|
||
|
|
||
|
func (c *MapStringInterface) Scan(value interface{}) error {
|
||
|
return GormScanWrap(value, c)
|
||
|
}
|
||
|
|
||
|
type MapStringInterfaceUseNumber map[string]interface{}
|
||
|
|
||
|
func (c MapStringInterfaceUseNumber) Value() (driver.Value, error) {
|
||
|
return GormValueWrap(c)
|
||
|
}
|
||
|
|
||
|
func (c *MapStringInterfaceUseNumber) Scan(value interface{}) error {
|
||
|
return GormScanWrapUseNumber(value, c)
|
||
|
}
|
||
|
|
||
|
type MapStringSliceString map[string][]string
|
||
|
|
||
|
func (c MapStringSliceString) Value() (driver.Value, error) {
|
||
|
return GormValueWrap(c)
|
||
|
}
|
||
|
|
||
|
func (c *MapStringSliceString) Scan(value interface{}) error {
|
||
|
return GormScanWrap(value, c)
|
||
|
}
|
||
|
|
||
|
// 全局处理入库数据
|
||
|
func GormValueWrap(c interface{}) (driver.Value, error) {
|
||
|
str, err := json.Marshal(c)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
if str == nil || string(str) == "null" {
|
||
|
return "", nil
|
||
|
}
|
||
|
return string(str), nil
|
||
|
}
|
||
|
|
||
|
func GormScanWrap(value interface{}, ojb interface{}) error {
|
||
|
|
||
|
switch v := value.(type) {
|
||
|
case string:
|
||
|
if v == "" {
|
||
|
return nil
|
||
|
}
|
||
|
err := json.Unmarshal([]byte(v), &ojb)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to unmarshal json str: %v, err: %v", v, err)
|
||
|
}
|
||
|
case []byte:
|
||
|
if string(v) == "" {
|
||
|
return nil
|
||
|
}
|
||
|
err := json.Unmarshal(v, &ojb)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to unmarshal json str: %v, err: %v", v, err)
|
||
|
}
|
||
|
default:
|
||
|
fmt.Errorf("field is not string value: %v, type: %v", value, reflect.TypeOf(value))
|
||
|
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func GormScanWrapUseNumber(value interface{}, ojb interface{}) error {
|
||
|
str, ok := value.(string)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("field is not string value: %v, type: %v", value, reflect.TypeOf(value))
|
||
|
}
|
||
|
if str == "" {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
read := bytes.NewBufferString(str)
|
||
|
decoder := json.NewDecoder(read)
|
||
|
decoder.UseNumber()
|
||
|
err := decoder.Decode(&ojb)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to unmarshal json str: %v, err: %v", str, err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|