You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

union_serializer.go 965 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package db
  2. import (
  3. "context"
  4. "fmt"
  5. "reflect"
  6. "gitlink.org.cn/cloudream/common/utils/serder"
  7. "gorm.io/gorm/schema"
  8. )
  9. type UnionSerializer struct {
  10. }
  11. func (UnionSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error {
  12. fieldValue := reflect.New(field.FieldType)
  13. if dbValue != nil {
  14. var data []byte
  15. switch v := dbValue.(type) {
  16. case []byte:
  17. data = v
  18. case string:
  19. data = []byte(v)
  20. default:
  21. return fmt.Errorf("failed to unmarshal JSONB value: %#v", dbValue)
  22. }
  23. err := serder.JSONToObjectExRaw(data, fieldValue.Interface())
  24. if err != nil {
  25. return err
  26. }
  27. }
  28. field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem())
  29. return nil
  30. }
  31. func (UnionSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) {
  32. return serder.ObjectToJSONEx(fieldValue)
  33. }
  34. func init() {
  35. schema.RegisterSerializer("union", UnionSerializer{})
  36. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。