diff options
Diffstat (limited to 'vendor/github.com/uptrace/bun/schema/append_value.go')
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/append_value.go | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/vendor/github.com/uptrace/bun/schema/append_value.go b/vendor/github.com/uptrace/bun/schema/append_value.go index 5697e35e3..7e9c451db 100644 --- a/vendor/github.com/uptrace/bun/schema/append_value.go +++ b/vendor/github.com/uptrace/bun/schema/append_value.go @@ -58,12 +58,24 @@ func FieldAppender(dialect Dialect, field *Field) AppenderFunc { return appendMsgpack } + fieldType := field.StructField.Type + switch strings.ToUpper(field.UserSQLType) { case sqltype.JSON, sqltype.JSONB: + if fieldType.Implements(driverValuerType) { + return appendDriverValue + } + + if fieldType.Kind() != reflect.Ptr { + if reflect.PtrTo(fieldType).Implements(driverValuerType) { + return addrAppender(appendDriverValue) + } + } + return AppendJSONValue } - return Appender(dialect, field.StructField.Type) + return Appender(dialect, fieldType) } func Appender(dialect Dialect, typ reflect.Type) AppenderFunc { @@ -85,6 +97,8 @@ func appender(dialect Dialect, typ reflect.Type) AppenderFunc { return appendBytesValue case timeType: return appendTimeValue + case timePtrType: + return PtrAppender(appendTimeValue) case ipType: return appendIPValue case ipNetType: @@ -93,15 +107,21 @@ func appender(dialect Dialect, typ reflect.Type) AppenderFunc { return appendJSONRawMessageValue } + kind := typ.Kind() + if typ.Implements(queryAppenderType) { + if kind == reflect.Ptr { + return nilAwareAppender(appendQueryAppenderValue) + } return appendQueryAppenderValue } if typ.Implements(driverValuerType) { + if kind == reflect.Ptr { + return nilAwareAppender(appendDriverValue) + } return appendDriverValue } - kind := typ.Kind() - if kind != reflect.Ptr { ptr := reflect.PtrTo(typ) if ptr.Implements(queryAppenderType) { @@ -116,6 +136,9 @@ func appender(dialect Dialect, typ reflect.Type) AppenderFunc { case reflect.Interface: return ifaceAppenderFunc case reflect.Ptr: + if typ.Implements(jsonMarshalerType) { + return nilAwareAppender(AppendJSONValue) + } if fn := Appender(dialect, typ.Elem()); fn != nil { return PtrAppender(fn) } @@ -141,6 +164,15 @@ func ifaceAppenderFunc(fmter Formatter, b []byte, v reflect.Value) []byte { return appender(fmter, b, elem) } +func nilAwareAppender(fn AppenderFunc) AppenderFunc { + return func(fmter Formatter, b []byte, v reflect.Value) []byte { + if v.IsNil() { + return dialect.AppendNull(b) + } + return fn(fmter, b, v) + } +} + func PtrAppender(fn AppenderFunc) AppenderFunc { return func(fmter Formatter, b []byte, v reflect.Value) []byte { if v.IsNil() { |