diff options
Diffstat (limited to 'sqlr.go')
| -rw-r--r-- | sqlr.go | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -3,8 +3,10 @@ package sqlr import ( + "context" "database/sql" "fmt" + "iter" "reflect" ) @@ -42,3 +44,36 @@ Cols: return rows.Scan(dest...) } + +// Querier is the underlying type used to query the database, +// usually *sql.DB or *sql.Tx. +type Querier interface { + QueryContext(context.Context, string, ...any) (*sql.Rows, error) +} + +// Query returns an iterator over the rows matched by a query. +func Query[Row any](ctx context.Context, querier Querier, query string, args ...any) iter.Seq2[Row, error] { + return func(yield func(Row, error) bool) { + rows, err := querier.QueryContext(ctx, query, args...) + if err != nil { + var zero Row + yield(zero, err) + return + } + defer rows.Close() + for rows.Next() { + var row Row + if err := Scan(rows, &row); err != nil { + yield(row, err) + return + } + if !yield(row, nil) { + return + } + } + if err := rows.Err(); err != nil { + var zero Row + yield(zero, err) + } + } +} |
