diff options
Diffstat (limited to 'vendor/github.com/uptrace/bun/model_scan.go')
-rw-r--r-- | vendor/github.com/uptrace/bun/model_scan.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/vendor/github.com/uptrace/bun/model_scan.go b/vendor/github.com/uptrace/bun/model_scan.go new file mode 100644 index 000000000..6dd061fb2 --- /dev/null +++ b/vendor/github.com/uptrace/bun/model_scan.go @@ -0,0 +1,54 @@ +package bun + +import ( + "context" + "database/sql" + "reflect" +) + +type scanModel struct { + db *DB + + dest []interface{} + scanIndex int +} + +var _ model = (*scanModel)(nil) + +func newScanModel(db *DB, dest []interface{}) *scanModel { + return &scanModel{ + db: db, + dest: dest, + } +} + +func (m *scanModel) Value() interface{} { + return m.dest +} + +func (m *scanModel) ScanRows(ctx context.Context, rows *sql.Rows) (int, error) { + if !rows.Next() { + return 0, rows.Err() + } + + dest := makeDest(m, len(m.dest)) + + m.scanIndex = 0 + if err := rows.Scan(dest...); err != nil { + return 0, err + } + + return 1, nil +} + +func (m *scanModel) ScanRow(ctx context.Context, rows *sql.Rows) error { + return rows.Scan(m.dest...) +} + +func (m *scanModel) Scan(src interface{}) error { + dest := reflect.ValueOf(m.dest[m.scanIndex]) + m.scanIndex++ + + scanner := m.db.dialect.Scanner(dest.Type()) + return scanner(dest, src) +} |