diff options
Diffstat (limited to 'vendor/github.com/uptrace/bun/dialect/pgdialect/array.go')
-rw-r--r-- | vendor/github.com/uptrace/bun/dialect/pgdialect/array.go | 96 |
1 files changed, 12 insertions, 84 deletions
diff --git a/vendor/github.com/uptrace/bun/dialect/pgdialect/array.go b/vendor/github.com/uptrace/bun/dialect/pgdialect/array.go index b0d9a2331..058b9f2fb 100644 --- a/vendor/github.com/uptrace/bun/dialect/pgdialect/array.go +++ b/vendor/github.com/uptrace/bun/dialect/pgdialect/array.go @@ -3,13 +3,11 @@ package pgdialect import ( "database/sql" "database/sql/driver" - "encoding/hex" "fmt" "math" "reflect" "strconv" "time" - "unicode/utf8" "github.com/uptrace/bun/dialect" "github.com/uptrace/bun/internal" @@ -146,44 +144,21 @@ func (d *Dialect) arrayElemAppender(typ reflect.Type) schema.AppenderFunc { } switch typ.Kind() { case reflect.String: - return arrayAppendStringValue + return appendStringElemValue case reflect.Slice: if typ.Elem().Kind() == reflect.Uint8 { - return arrayAppendBytesValue + return appendBytesElemValue } } return schema.Appender(d, typ) } -func arrayAppend(fmter schema.Formatter, b []byte, v interface{}) []byte { - switch v := v.(type) { - case int64: - return strconv.AppendInt(b, v, 10) - case float64: - return arrayAppendFloat64(b, v) - case bool: - return dialect.AppendBool(b, v) - case []byte: - return arrayAppendBytes(b, v) - case string: - return arrayAppendString(b, v) - case time.Time: - b = append(b, '"') - b = appendTime(b, v) - b = append(b, '"') - return b - default: - err := fmt.Errorf("pgdialect: can't append %T", v) - return dialect.AppendError(b, err) - } -} - -func arrayAppendStringValue(fmter schema.Formatter, b []byte, v reflect.Value) []byte { - return arrayAppendString(b, v.String()) +func appendStringElemValue(fmter schema.Formatter, b []byte, v reflect.Value) []byte { + return appendStringElem(b, v.String()) } -func arrayAppendBytesValue(fmter schema.Formatter, b []byte, v reflect.Value) []byte { - return arrayAppendBytes(b, v.Bytes()) +func appendBytesElemValue(fmter schema.Formatter, b []byte, v reflect.Value) []byte { + return appendBytesElem(b, v.Bytes()) } func arrayAppendDriverValue(fmter schema.Formatter, b []byte, v reflect.Value) []byte { @@ -191,7 +166,7 @@ func arrayAppendDriverValue(fmter schema.Formatter, b []byte, v reflect.Value) [ if err != nil { return dialect.AppendError(b, err) } - return arrayAppend(fmter, b, iface) + return appendElem(b, iface) } func appendStringSliceValue(fmter schema.Formatter, b []byte, v reflect.Value) []byte { @@ -208,7 +183,7 @@ func appendStringSlice(b []byte, ss []string) []byte { b = append(b, '{') for _, s := range ss { - b = arrayAppendString(b, s) + b = appendStringElem(b, s) b = append(b, ',') } if len(ss) > 0 { @@ -496,7 +471,7 @@ func decodeIntSlice(src interface{}) ([]int, error) { continue } - n, err := strconv.Atoi(bytesToString(elem)) + n, err := strconv.Atoi(internal.String(elem)) if err != nil { return nil, err } @@ -545,7 +520,7 @@ func decodeInt64Slice(src interface{}) ([]int64, error) { continue } - n, err := strconv.ParseInt(bytesToString(elem), 10, 64) + n, err := strconv.ParseInt(internal.String(elem), 10, 64) if err != nil { return nil, err } @@ -594,7 +569,7 @@ func scanFloat64Slice(src interface{}) ([]float64, error) { continue } - n, err := strconv.ParseFloat(bytesToString(elem), 64) + n, err := strconv.ParseFloat(internal.String(elem), 64) if err != nil { return nil, err } @@ -610,57 +585,10 @@ func scanFloat64Slice(src interface{}) ([]float64, error) { func toBytes(src interface{}) ([]byte, error) { switch src := src.(type) { case string: - return stringToBytes(src), nil + return internal.Bytes(src), nil case []byte: return src, nil default: return nil, fmt.Errorf("pgdialect: got %T, wanted []byte or string", src) } } - -//------------------------------------------------------------------------------ - -func arrayAppendBytes(b []byte, bs []byte) []byte { - if bs == nil { - return dialect.AppendNull(b) - } - - b = append(b, `"\\x`...) - - s := len(b) - b = append(b, make([]byte, hex.EncodedLen(len(bs)))...) - hex.Encode(b[s:], bs) - - b = append(b, '"') - - return b -} - -func arrayAppendString(b []byte, s string) []byte { - b = append(b, '"') - for _, r := range s { - switch r { - case 0: - // ignore - case '\'': - b = append(b, "''"...) - case '"': - b = append(b, '\\', '"') - case '\\': - b = append(b, '\\', '\\') - default: - if r < utf8.RuneSelf { - b = append(b, byte(r)) - break - } - l := len(b) - if cap(b)-l < utf8.UTFMax { - b = append(b, make([]byte, utf8.UTFMax)...) - } - n := utf8.EncodeRune(b[l:l+utf8.UTFMax], r) - b = b[:l+n] - } - } - b = append(b, '"') - return b -} |