summaryrefslogtreecommitdiff
path: root/vendor/github.com/uptrace/bun/dialect/pgdialect/elem.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2025-01-14 14:23:28 +0000
committerLibravatar GitHub <noreply@github.com>2025-01-14 14:23:28 +0000
commitb8ef9fc4bcccc6c024edaa8e9c91a6bf87f83dd9 (patch)
tree68eaf966c80237e18993e887c8583355f0943ca7 /vendor/github.com/uptrace/bun/dialect/pgdialect/elem.go
parent[chore] better dns validation (#3644) (diff)
downloadgotosocial-b8ef9fc4bcccc6c024edaa8e9c91a6bf87f83dd9.tar.xz
bump uptrace/bun dependencies from 1.2.6 to 1.2.8 (#3645)
Diffstat (limited to 'vendor/github.com/uptrace/bun/dialect/pgdialect/elem.go')
-rw-r--r--vendor/github.com/uptrace/bun/dialect/pgdialect/elem.go87
1 files changed, 87 insertions, 0 deletions
diff --git a/vendor/github.com/uptrace/bun/dialect/pgdialect/elem.go b/vendor/github.com/uptrace/bun/dialect/pgdialect/elem.go
new file mode 100644
index 000000000..7fbec3778
--- /dev/null
+++ b/vendor/github.com/uptrace/bun/dialect/pgdialect/elem.go
@@ -0,0 +1,87 @@
+package pgdialect
+
+import (
+ "database/sql/driver"
+ "encoding/hex"
+ "fmt"
+ "strconv"
+ "time"
+ "unicode/utf8"
+
+ "github.com/uptrace/bun/dialect"
+)
+
+func appendElem(buf []byte, val interface{}) []byte {
+ switch val := val.(type) {
+ case int64:
+ return strconv.AppendInt(buf, val, 10)
+ case float64:
+ return arrayAppendFloat64(buf, val)
+ case bool:
+ return dialect.AppendBool(buf, val)
+ case []byte:
+ return appendBytesElem(buf, val)
+ case string:
+ return appendStringElem(buf, val)
+ case time.Time:
+ buf = append(buf, '"')
+ buf = appendTime(buf, val)
+ buf = append(buf, '"')
+ return buf
+ case driver.Valuer:
+ val2, err := val.Value()
+ if err != nil {
+ err := fmt.Errorf("pgdialect: can't append elem value: %w", err)
+ return dialect.AppendError(buf, err)
+ }
+ return appendElem(buf, val2)
+ default:
+ err := fmt.Errorf("pgdialect: can't append elem %T", val)
+ return dialect.AppendError(buf, err)
+ }
+}
+
+func appendBytesElem(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 appendStringElem(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
+}