diff options
Diffstat (limited to 'vendor/github.com/uptrace/bun/schema')
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/append.go | 21 | ||||
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/field.go | 5 | ||||
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/formatter.go | 4 | ||||
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/reflect.go | 24 | ||||
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/sqlfmt.go | 14 | ||||
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/table.go | 37 | ||||
-rw-r--r-- | vendor/github.com/uptrace/bun/schema/zerochecker.go | 39 |
7 files changed, 109 insertions, 35 deletions
diff --git a/vendor/github.com/uptrace/bun/schema/append.go b/vendor/github.com/uptrace/bun/schema/append.go index 6f633b101..0cfc1180b 100644 --- a/vendor/github.com/uptrace/bun/schema/append.go +++ b/vendor/github.com/uptrace/bun/schema/append.go @@ -81,7 +81,7 @@ func appendIn(fmter Formatter, b []byte, slice reflect.Value) []byte { sliceLen := slice.Len() if sliceLen == 0 { - return append(b, "NULL"...) + return dialect.AppendNull(b) } for i := 0; i < sliceLen; i++ { @@ -104,3 +104,22 @@ func appendIn(fmter Formatter, b []byte, slice reflect.Value) []byte { } return b } + +//------------------------------------------------------------------------------ + +func NullZero(value interface{}) QueryAppender { + return nullZero{ + value: value, + } +} + +type nullZero struct { + value interface{} +} + +func (nz nullZero) AppendQuery(fmter Formatter, b []byte) (_ []byte, err error) { + if isZero(nz.value) { + return dialect.AppendNull(b), nil + } + return fmter.AppendValue(b, reflect.ValueOf(nz.value)), nil +} diff --git a/vendor/github.com/uptrace/bun/schema/field.go b/vendor/github.com/uptrace/bun/schema/field.go index 283a3b992..a3b086054 100644 --- a/vendor/github.com/uptrace/bun/schema/field.go +++ b/vendor/github.com/uptrace/bun/schema/field.go @@ -5,6 +5,7 @@ import ( "reflect" "github.com/uptrace/bun/dialect" + "github.com/uptrace/bun/internal" "github.com/uptrace/bun/internal/tagparser" ) @@ -50,7 +51,7 @@ func (f *Field) Clone() *Field { } func (f *Field) Value(strct reflect.Value) reflect.Value { - return fieldByIndexAlloc(strct, f.Index) + return internal.FieldByIndexAlloc(strct, f.Index) } func (f *Field) HasNilValue(v reflect.Value) bool { @@ -117,7 +118,7 @@ func (f *Field) ScanValue(strct reflect.Value, src interface{}) error { return nil } - fv := fieldByIndexAlloc(strct, f.Index) + fv := internal.FieldByIndexAlloc(strct, f.Index) return f.ScanWithCheck(fv, src) } diff --git a/vendor/github.com/uptrace/bun/schema/formatter.go b/vendor/github.com/uptrace/bun/schema/formatter.go index 1fba1b59e..1d8d9a9ee 100644 --- a/vendor/github.com/uptrace/bun/schema/formatter.go +++ b/vendor/github.com/uptrace/bun/schema/formatter.go @@ -42,6 +42,10 @@ func (f Formatter) IdentQuote() byte { return f.dialect.IdentQuote() } +func (f Formatter) AppendName(b []byte, name string) []byte { + return dialect.AppendName(b, name, f.IdentQuote()) +} + func (f Formatter) AppendIdent(b []byte, ident string) []byte { return dialect.AppendIdent(b, ident, f.IdentQuote()) } diff --git a/vendor/github.com/uptrace/bun/schema/reflect.go b/vendor/github.com/uptrace/bun/schema/reflect.go index f13826a6c..89be8eeb6 100644 --- a/vendor/github.com/uptrace/bun/schema/reflect.go +++ b/vendor/github.com/uptrace/bun/schema/reflect.go @@ -46,27 +46,3 @@ func fieldByIndex(v reflect.Value, index []int) (_ reflect.Value, ok bool) { } return v, true } - -func fieldByIndexAlloc(v reflect.Value, index []int) reflect.Value { - if len(index) == 1 { - return v.Field(index[0]) - } - - for i, idx := range index { - if i > 0 { - v = indirectNil(v) - } - v = v.Field(idx) - } - return v -} - -func indirectNil(v reflect.Value) reflect.Value { - if v.Kind() == reflect.Ptr { - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - } - return v -} diff --git a/vendor/github.com/uptrace/bun/schema/sqlfmt.go b/vendor/github.com/uptrace/bun/schema/sqlfmt.go index a4ed24af6..7b4a9493f 100644 --- a/vendor/github.com/uptrace/bun/schema/sqlfmt.go +++ b/vendor/github.com/uptrace/bun/schema/sqlfmt.go @@ -27,7 +27,19 @@ func (s Safe) AppendQuery(fmter Formatter, b []byte) ([]byte, error) { //------------------------------------------------------------------------------ -// Ident represents a SQL identifier, for example, table or column name. +// Name represents a single SQL name, for example, a column name. +type Name string + +var _ QueryAppender = (*Name)(nil) + +func (s Name) AppendQuery(fmter Formatter, b []byte) ([]byte, error) { + return fmter.AppendName(b, string(s)), nil +} + +//------------------------------------------------------------------------------ + +// Ident represents a SQL identifier, for example, +// a fully qualified column name such as `table_name.col_name`. type Ident string var _ QueryAppender = (*Ident)(nil) diff --git a/vendor/github.com/uptrace/bun/schema/table.go b/vendor/github.com/uptrace/bun/schema/table.go index 9eb7d1bfe..cd0ff20b2 100644 --- a/vendor/github.com/uptrace/bun/schema/table.go +++ b/vendor/github.com/uptrace/bun/schema/table.go @@ -4,6 +4,7 @@ import ( "database/sql" "fmt" "reflect" + "strconv" "strings" "sync" "time" @@ -806,18 +807,38 @@ func (t *Table) m2mRelation(field *Field) *Relation { return rel } -func (t *Table) inlineFields(field *Field, seen map[reflect.Type]struct{}) { - if seen == nil { - seen = map[reflect.Type]struct{}{t.Type: {}} +type seenKey struct { + Table reflect.Type + FieldIndex string +} + +type seenMap map[seenKey]struct{} + +func NewSeenKey(table reflect.Type, fieldIndex []int) (key seenKey) { + key.Table = table + for _, index := range fieldIndex { + key.FieldIndex += strconv.Itoa(index) + "-" } + return key +} - if _, ok := seen[field.IndirectType]; ok { - return +func (s seenMap) Clone() seenMap { + t := make(seenMap) + for k, v := range s { + t[k] = v + } + return t +} + +func (t *Table) inlineFields(field *Field, seen seenMap) { + if seen == nil { + seen = make(seenMap) } - seen[field.IndirectType] = struct{}{} joinTable := t.dialect.Tables().Ref(field.IndirectType) for _, f := range joinTable.allFields { + key := NewSeenKey(joinTable.Type, f.Index) + f = f.Clone() f.GoName = field.GoName + "_" + f.GoName f.Name = field.Name + "__" + f.Name @@ -834,7 +855,9 @@ func (t *Table) inlineFields(field *Field, seen map[reflect.Type]struct{}) { continue } - if _, ok := seen[f.IndirectType]; !ok { + if _, ok := seen[key]; !ok { + seen = seen.Clone() + seen[key] = struct{}{} t.inlineFields(f, seen) } } diff --git a/vendor/github.com/uptrace/bun/schema/zerochecker.go b/vendor/github.com/uptrace/bun/schema/zerochecker.go index f088b8c2c..f24e51d30 100644 --- a/vendor/github.com/uptrace/bun/schema/zerochecker.go +++ b/vendor/github.com/uptrace/bun/schema/zerochecker.go @@ -11,6 +11,45 @@ type isZeroer interface { IsZero() bool } +func isZero(v interface{}) bool { + switch v := v.(type) { + case isZeroer: + return v.IsZero() + case string: + return v == "" + case []byte: + return v == nil + case int: + return v == 0 + case int64: + return v == 0 + case uint: + return v == 0 + case uint64: + return v == 0 + case float32: + return v == 0 + case float64: + return v == 0 + case int8: + return v == 0 + case int16: + return v == 0 + case int32: + return v == 0 + case uint8: + return v == 0 + case uint16: + return v == 0 + case uint32: + return v == 0 + default: + rv := reflect.ValueOf(v) + fn := zeroChecker(rv.Type()) + return fn(rv) + } +} + type IsZeroerFunc func(reflect.Value) bool func zeroChecker(typ reflect.Type) IsZeroerFunc { |