summaryrefslogtreecommitdiffstats
path: root/sqlr.go
diff options
context:
space:
mode:
Diffstat (limited to 'sqlr.go')
-rw-r--r--sqlr.go35
1 files changed, 35 insertions, 0 deletions
diff --git a/sqlr.go b/sqlr.go
index 4ac798f..9e4ba38 100644
--- a/sqlr.go
+++ b/sqlr.go
@@ -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)
+ }
+ }
+}