summaryrefslogtreecommitdiff
path: root/vendor/github.com/uptrace/bun/model_slice.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2021-08-25 15:34:33 +0200
committerLibravatar GitHub <noreply@github.com>2021-08-25 15:34:33 +0200
commit2dc9fc1626507bb54417fc4a1920b847cafb27a2 (patch)
tree4ddeac479b923db38090aac8bd9209f3646851c1 /vendor/github.com/uptrace/bun/model_slice.go
parentManually approves followers (#146) (diff)
downloadgotosocial-2dc9fc1626507bb54417fc4a1920b847cafb27a2.tar.xz
Pg to bun (#148)
* start moving to bun * changing more stuff * more * and yet more * tests passing * seems stable now * more big changes * small fix * little fixes
Diffstat (limited to 'vendor/github.com/uptrace/bun/model_slice.go')
-rw-r--r--vendor/github.com/uptrace/bun/model_slice.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/vendor/github.com/uptrace/bun/model_slice.go b/vendor/github.com/uptrace/bun/model_slice.go
new file mode 100644
index 000000000..afe804382
--- /dev/null
+++ b/vendor/github.com/uptrace/bun/model_slice.go
@@ -0,0 +1,82 @@
+package bun
+
+import (
+ "context"
+ "database/sql"
+ "reflect"
+
+ "github.com/uptrace/bun/internal"
+ "github.com/uptrace/bun/schema"
+)
+
+type sliceInfo struct {
+ nextElem func() reflect.Value
+ scan schema.ScannerFunc
+}
+
+type sliceModel struct {
+ dest []interface{}
+ values []reflect.Value
+ scanIndex int
+ info []sliceInfo
+}
+
+var _ model = (*sliceModel)(nil)
+
+func newSliceModel(db *DB, dest []interface{}, values []reflect.Value) *sliceModel {
+ return &sliceModel{
+ dest: dest,
+ values: values,
+ }
+}
+
+func (m *sliceModel) Value() interface{} {
+ return m.dest
+}
+
+func (m *sliceModel) ScanRows(ctx context.Context, rows *sql.Rows) (int, error) {
+ columns, err := rows.Columns()
+ if err != nil {
+ return 0, err
+ }
+
+ m.info = make([]sliceInfo, len(m.values))
+ for i, v := range m.values {
+ if v.IsValid() && v.Len() > 0 {
+ v.Set(v.Slice(0, 0))
+ }
+
+ m.info[i] = sliceInfo{
+ nextElem: internal.MakeSliceNextElemFunc(v),
+ scan: schema.Scanner(v.Type().Elem()),
+ }
+ }
+
+ if len(columns) == 0 {
+ return 0, nil
+ }
+ dest := makeDest(m, len(columns))
+
+ var n int
+
+ for rows.Next() {
+ m.scanIndex = 0
+ if err := rows.Scan(dest...); err != nil {
+ return 0, err
+ }
+ n++
+ }
+ if err := rows.Err(); err != nil {
+ return 0, err
+ }
+
+ return n, nil
+}
+
+func (m *sliceModel) Scan(src interface{}) error {
+ info := m.info[m.scanIndex]
+ m.scanIndex++
+
+ dest := info.nextElem()
+ return info.scan(dest, src)
+}