Skip to content

Commit

Permalink
AllRowsScanned return instead of break
Browse files Browse the repository at this point in the history
Previous approach could cause panic in case loop broken by
developer and error occurred on rows.
  • Loading branch information
xobotyi committed Jan 24, 2025
1 parent 812c937 commit c89724d
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions rows.go
Original file line number Diff line number Diff line change
Expand Up @@ -667,18 +667,21 @@ func RowToAddrOfStructByNameLax[T any](row CollectableRow) (*T, error) {
return &value, err
}

// AllRowsScanned returns iterator that read and scans rows one-by-one. It closes
// the rows automatically on return.
// AllRowsScanned returns an iterator that reads and scans rows one-by-one. It automatically
// closes the rows when done.
//
// In case rows.Err() returns non-nil error after all rows are read, it will
// trigger extra yield with zero value and the error.
// If rows.Err() returns a non-nil error after all rows are read, it will trigger an extra
// yield with a zero value and the error.
//
// If the caller's logic implies the possibility of an early loop break, rows.Err() should
// be checked after the loop.
func AllRowsScanned[T any](rows Rows, fn RowToFunc[T]) iter.Seq2[T, error] {
return func(yield func(T, error) bool) {
defer rows.Close()

for rows.Next() {
if !yield(fn(rows)) {
break
return
}
}

Expand Down

0 comments on commit c89724d

Please sign in to comment.