63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
|
package advsql
|
||
|
|
||
|
import "context"
|
||
|
|
||
|
func Query[T any](db *Database, query string, scan func(v *T, scan ScanFunc) error) QueryManyFunc[T] {
|
||
|
s, err := db.prepare(query)
|
||
|
if err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return func(args ...interface{}) <-chan *T {
|
||
|
out := make(chan *T, 10)
|
||
|
|
||
|
rows, err := s.Query(args...)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
go func() {
|
||
|
defer rows.Close()
|
||
|
defer close(out)
|
||
|
for rows.Next() {
|
||
|
v := new(T)
|
||
|
if scan(v, rows.Scan) == nil {
|
||
|
out <- v
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
return out
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func QueryContext[T any](db *Database, query string, scan func(v *T, scan ScanFunc) error) QueryManyContextFunc[T] {
|
||
|
s, err := db.db.Prepare(query)
|
||
|
if err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
db.closefuncs = append(db.closefuncs, s.Close)
|
||
|
|
||
|
return func(ctx context.Context, args ...interface{}) <-chan *T {
|
||
|
out := make(chan *T, 10)
|
||
|
|
||
|
rows, err := s.QueryContext(ctx, args...)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
go func() {
|
||
|
defer rows.Close()
|
||
|
defer close(out)
|
||
|
for rows.Next() {
|
||
|
v := new(T)
|
||
|
if scan(v, rows.Scan) == nil {
|
||
|
out <- v
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
return out
|
||
|
}
|
||
|
}
|