mirror of
https://github.com/thomiceli/opengist.git
synced 2025-02-19 01:55:43 -05:00
77 lines
1.4 KiB
Go
77 lines
1.4 KiB
Go
package db
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/schema"
|
|
)
|
|
|
|
type binaryData []byte
|
|
|
|
func (b *binaryData) Value() (driver.Value, error) {
|
|
return []byte(*b), nil
|
|
}
|
|
|
|
func (b *binaryData) Scan(value interface{}) error {
|
|
valBytes, ok := value.([]byte)
|
|
if !ok {
|
|
return fmt.Errorf("failed to unmarshal BinaryData: %v", value)
|
|
}
|
|
*b = valBytes
|
|
return nil
|
|
}
|
|
|
|
func (*binaryData) GormDataType() string {
|
|
return "binary_data"
|
|
}
|
|
|
|
func (*binaryData) GormDBDataType(db *gorm.DB, _ *schema.Field) string {
|
|
switch db.Dialector.Name() {
|
|
case "sqlite":
|
|
return "BLOB"
|
|
case "mysql":
|
|
return "VARBINARY(1024)"
|
|
case "postgres":
|
|
return "BYTEA"
|
|
default:
|
|
return "BLOB"
|
|
}
|
|
}
|
|
|
|
type jsonData json.RawMessage
|
|
|
|
func (j *jsonData) Scan(value interface{}) error {
|
|
bytes, ok := value.([]byte)
|
|
if !ok {
|
|
return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
|
|
}
|
|
|
|
result := json.RawMessage{}
|
|
err := json.Unmarshal(bytes, &result)
|
|
*j = jsonData(result)
|
|
return err
|
|
}
|
|
|
|
func (j *jsonData) Value() (driver.Value, error) {
|
|
if len(*j) == 0 {
|
|
return nil, nil
|
|
}
|
|
return json.RawMessage(*j).MarshalJSON()
|
|
}
|
|
|
|
func (*jsonData) GormDataType() string {
|
|
return "json"
|
|
}
|
|
|
|
func (*jsonData) GormDBDataType(db *gorm.DB, _ *schema.Field) string {
|
|
switch db.Dialector.Name() {
|
|
case "mysql", "sqlite":
|
|
return "JSON"
|
|
case "postgres":
|
|
return "JSONB"
|
|
}
|
|
return ""
|
|
}
|