Documentation
¶
Overview ¶
Package sqlcoro provides a database/sql rows iterator based on github.com/tcard/coro. Under the hood, it calls Next, Err and Close on a Rows appropriately and returns any error that those may produce.
Example ¶
package main import ( "context" "database/sql" "fmt" "reflect" "github.com/tcard/coro" "github.com/tcard/sqlcoro" "github.com/tcard/sqler" ) func main() { // rows would actually be a valid *sql.Rows, wrapped as a sqler.Rows. rows := &exampleRows{ {13, "foo"}, {42, "bar"}, } // You'll typically want to tie the iterator's lifetime to its consumer's this // way, but it's not necessary to do so. See coro documentation for details. ctx, cancel := context.WithCancel(context.Background()) defer cancel() coroOption := coro.KillOnContextDone(ctx) nextRow := sqlcoro.IterateRows(rows, coroOption) var row sqler.Row var err error for nextRow(&row, &err) { var id int var name string err := row.Scan(&id, &name) if err != nil { _ = err // handle return } fmt.Println("ID:", id, "Name:", name) } if err != nil { _ = err // handle } } type exampleRows [][]interface{} func (r *exampleRows) Next() bool { return len(*r) > 0 } func (r *exampleRows) Scan(dest ...interface{}) error { for i, d := range dest { reflect.ValueOf(d).Elem().Set(reflect.ValueOf((*r)[0][i])) } *r = (*r)[1:] return nil } func (r *exampleRows) Err() error { return nil } func (r *exampleRows) Close() error { return nil } func (*exampleRows) ColumnTypes() ([]*sql.ColumnType, error) { panic("not provided") } func (*exampleRows) Columns() ([]string, error) { panic("not provided") } func (*exampleRows) NextResultSet() bool { panic("not provided") }
Output: ID: 13 Name: foo ID: 42 Name: bar
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
Click to show internal directories.
Click to hide internal directories.