60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
|
package advsql
|
||
|
|
||
|
// import (
|
||
|
// "database/sql"
|
||
|
// )
|
||
|
|
||
|
// type Stmt[M any] struct {
|
||
|
// stmt *sql.Stmt
|
||
|
// scan func(Scanner) (*M, error)
|
||
|
// }
|
||
|
|
||
|
// func NewStmt[M any](db *Database, query string, scan func(s Scanner) (*M, error)) (*Stmt[M], error) {
|
||
|
// s, err := db.db.Prepare(query)
|
||
|
// if err != nil {
|
||
|
// return nil, err
|
||
|
// }
|
||
|
|
||
|
// stmt := Stmt[M]{
|
||
|
// stmt: s,
|
||
|
// scan: scan,
|
||
|
// }
|
||
|
// db.closefuncs = append(db.closefuncs, stmt.Close)
|
||
|
// return &stmt, err
|
||
|
// }
|
||
|
|
||
|
// func (stmt *Stmt[M]) Close() error {
|
||
|
// return stmt.stmt.Close()
|
||
|
// }
|
||
|
|
||
|
// func (stmt *Stmt[M]) Many(args ...interface{}) (<-chan *M, error) {
|
||
|
// rows, err := stmt.stmt.Query(args...)
|
||
|
// if err != nil {
|
||
|
// return nil, err
|
||
|
// }
|
||
|
|
||
|
// out := make(chan *M, 10)
|
||
|
|
||
|
// go func() {
|
||
|
// defer rows.Close()
|
||
|
// defer close(out)
|
||
|
|
||
|
// for rows.Next() {
|
||
|
// if v, err := stmt.scan(rows); err == nil {
|
||
|
// out <- v
|
||
|
// }
|
||
|
// }
|
||
|
// }()
|
||
|
|
||
|
// return out, nil
|
||
|
// }
|
||
|
|
||
|
// func (stmt *Stmt[M]) Single(args ...interface{}) (*M, error) {
|
||
|
// rows, err := stmt.stmt.Query(args...)
|
||
|
// if err != nil {
|
||
|
// return nil, err
|
||
|
// }
|
||
|
// defer rows.Close()
|
||
|
// return stmt.scan(rows)
|
||
|
// }
|