summaryrefslogtreecommitdiff
path: root/vendor/github.com/uptrace/bun/model_table_slice.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/uptrace/bun/model_table_slice.go')
-rw-r--r--vendor/github.com/uptrace/bun/model_table_slice.go113
1 files changed, 113 insertions, 0 deletions
diff --git a/vendor/github.com/uptrace/bun/model_table_slice.go b/vendor/github.com/uptrace/bun/model_table_slice.go
new file mode 100644
index 000000000..67e7c71e7
--- /dev/null
+++ b/vendor/github.com/uptrace/bun/model_table_slice.go
@@ -0,0 +1,113 @@
+package bun
+
+import (
+ "context"
+ "database/sql"
+ "reflect"
+
+ "github.com/uptrace/bun/schema"
+)
+
+type sliceTableModel struct {
+ structTableModel
+
+ slice reflect.Value
+ sliceLen int
+ sliceOfPtr bool
+ nextElem func() reflect.Value
+}
+
+var _ tableModel = (*sliceTableModel)(nil)
+
+func newSliceTableModel(
+ db *DB, dest interface{}, slice reflect.Value, elemType reflect.Type,
+) *sliceTableModel {
+ m := &sliceTableModel{
+ structTableModel: structTableModel{
+ db: db,
+ table: db.Table(elemType),
+ dest: dest,
+ root: slice,
+ },
+
+ slice: slice,
+ sliceLen: slice.Len(),
+ nextElem: makeSliceNextElemFunc(slice),
+ }
+ m.init(slice.Type())
+ return m
+}
+
+func (m *sliceTableModel) init(sliceType reflect.Type) {
+ switch sliceType.Elem().Kind() {
+ case reflect.Ptr, reflect.Interface:
+ m.sliceOfPtr = true
+ }
+}
+
+func (m *sliceTableModel) Join(name string, apply func(*SelectQuery) *SelectQuery) *join {
+ return m.join(m.slice, name, apply)
+}
+
+func (m *sliceTableModel) Bind(bind reflect.Value) {
+ m.slice = bind.Field(m.index[len(m.index)-1])
+}
+
+func (m *sliceTableModel) SetCap(cap int) {
+ if cap > 100 {
+ cap = 100
+ }
+ if m.slice.Cap() < cap {
+ m.slice.Set(reflect.MakeSlice(m.slice.Type(), 0, cap))
+ }
+}
+
+func (m *sliceTableModel) ScanRows(ctx context.Context, rows *sql.Rows) (int, error) {
+ columns, err := rows.Columns()
+ if err != nil {
+ return 0, err
+ }
+
+ m.columns = columns
+ dest := makeDest(m, len(columns))
+
+ if m.slice.IsValid() && m.slice.Len() > 0 {
+ m.slice.Set(m.slice.Slice(0, 0))
+ }
+
+ var n int
+
+ for rows.Next() {
+ m.strct = m.nextElem()
+ m.structInited = false
+
+ if err := m.scanRow(ctx, rows, dest); err != nil {
+ return 0, err
+ }
+
+ n++
+ }
+ if err := rows.Err(); err != nil {
+ return 0, err
+ }
+
+ return n, nil
+}
+
+// Inherit these hooks from structTableModel.
+var (
+ _ schema.BeforeScanHook = (*sliceTableModel)(nil)
+ _ schema.AfterScanHook = (*sliceTableModel)(nil)
+)
+
+func (m *sliceTableModel) updateSoftDeleteField() error {
+ sliceLen := m.slice.Len()
+ for i := 0; i < sliceLen; i++ {
+ strct := indirect(m.slice.Index(i))
+ fv := m.table.SoftDeleteField.Value(strct)
+ if err := m.table.UpdateSoftDeleteField(fv); err != nil {
+ return err
+ }
+ }
+ return nil
+}