69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package oracle
|
|
|
|
import (
|
|
"database/sql"
|
|
"reflect"
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func convertCustomType(val interface{}) interface{} {
|
|
rv := reflect.ValueOf(val)
|
|
ri := rv.Interface()
|
|
typeName := reflect.TypeOf(ri).Name()
|
|
if reflect.TypeOf(val).Kind() == reflect.Ptr {
|
|
if rv.IsNil() {
|
|
typeName = rv.Type().Elem().Name()
|
|
} else {
|
|
for rv.Kind() == reflect.Ptr {
|
|
rv = rv.Elem()
|
|
}
|
|
ri = rv.Interface()
|
|
typeName = reflect.TypeOf(ri).Name()
|
|
}
|
|
}
|
|
if typeName == "DeletedAt" {
|
|
// gorm.DeletedAt
|
|
if rv.IsZero() {
|
|
val = sql.NullTime{}
|
|
} else {
|
|
val = getTimeValue(ri.(gorm.DeletedAt).Time)
|
|
}
|
|
} else if m := rv.MethodByName("Time"); m.IsValid() && m.Type().NumIn() == 0 {
|
|
// custom time type
|
|
for _, result := range m.Call([]reflect.Value{}) {
|
|
if reflect.TypeOf(result.Interface()).Name() == "Time" {
|
|
val = getTimeValue(result.Interface().(time.Time))
|
|
}
|
|
}
|
|
}
|
|
return val
|
|
}
|
|
|
|
func ptrDereference(obj interface{}) (value interface{}) {
|
|
if obj == nil {
|
|
return obj
|
|
}
|
|
if t := reflect.TypeOf(obj); t.Kind() != reflect.Ptr {
|
|
return obj
|
|
}
|
|
|
|
v := reflect.ValueOf(obj)
|
|
for v.Kind() == reflect.Ptr && !v.IsNil() {
|
|
v = v.Elem()
|
|
}
|
|
if !v.IsValid() || v.Kind() == reflect.Ptr && v.IsNil() {
|
|
return obj
|
|
}
|
|
value = v.Interface()
|
|
return
|
|
}
|
|
|
|
func getTimeValue(t time.Time) interface{} {
|
|
if t.IsZero() {
|
|
return sql.NullTime{}
|
|
}
|
|
return t
|
|
}
|