summaryrefslogtreecommitdiff
path: root/vendor/github.com/go-pg/pg/v10/orm/composite.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/go-pg/pg/v10/orm/composite.go')
-rw-r--r--vendor/github.com/go-pg/pg/v10/orm/composite.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/vendor/github.com/go-pg/pg/v10/orm/composite.go b/vendor/github.com/go-pg/pg/v10/orm/composite.go
new file mode 100644
index 000000000..d2e48a8b3
--- /dev/null
+++ b/vendor/github.com/go-pg/pg/v10/orm/composite.go
@@ -0,0 +1,100 @@
+package orm
+
+import (
+ "fmt"
+ "reflect"
+
+ "github.com/go-pg/pg/v10/internal/pool"
+ "github.com/go-pg/pg/v10/types"
+)
+
+func compositeScanner(typ reflect.Type) types.ScannerFunc {
+ if typ.Kind() == reflect.Ptr {
+ typ = typ.Elem()
+ }
+
+ var table *Table
+ return func(v reflect.Value, rd types.Reader, n int) error {
+ if n == -1 {
+ v.Set(reflect.Zero(v.Type()))
+ return nil
+ }
+
+ if table == nil {
+ table = GetTable(typ)
+ }
+ if v.Kind() == reflect.Ptr {
+ if v.IsNil() {
+ v.Set(reflect.New(v.Type().Elem()))
+ }
+ v = v.Elem()
+ }
+
+ p := newCompositeParser(rd)
+ var elemReader *pool.BytesReader
+
+ var firstErr error
+ for i := 0; ; i++ {
+ elem, err := p.NextElem()
+ if err != nil {
+ if err == errEndOfComposite {
+ break
+ }
+ return err
+ }
+
+ if i >= len(table.Fields) {
+ if firstErr == nil {
+ firstErr = fmt.Errorf(
+ "pg: %s has %d fields, but composite requires at least %d values",
+ table, len(table.Fields), i)
+ }
+ continue
+ }
+
+ if elemReader == nil {
+ elemReader = pool.NewBytesReader(elem)
+ } else {
+ elemReader.Reset(elem)
+ }
+
+ field := table.Fields[i]
+ if elem == nil {
+ err = field.ScanValue(v, elemReader, -1)
+ } else {
+ err = field.ScanValue(v, elemReader, len(elem))
+ }
+ if err != nil && firstErr == nil {
+ firstErr = err
+ }
+ }
+
+ return firstErr
+ }
+}
+
+func compositeAppender(typ reflect.Type) types.AppenderFunc {
+ if typ.Kind() == reflect.Ptr {
+ typ = typ.Elem()
+ }
+
+ var table *Table
+ return func(b []byte, v reflect.Value, quote int) []byte {
+ if table == nil {
+ table = GetTable(typ)
+ }
+ if v.Kind() == reflect.Ptr {
+ v = v.Elem()
+ }
+
+ b = append(b, "ROW("...)
+ for i, f := range table.Fields {
+ if i > 0 {
+ b = append(b, ',')
+ }
+ b = f.AppendValue(b, v, quote)
+ }
+ b = append(b, ')')
+ return b
+ }
+}