diff --git a/storage/sql/sql.go b/storage/sql/sql.go index 17877ff..6aa4853 100644 --- a/storage/sql/sql.go +++ b/storage/sql/sql.go @@ -10,7 +10,10 @@ type Cfg struct { Driver, Connstr string } +type Rows = sql.Rows + type rowsProc = func(*sql.Rows) error +type Scanner interface{ Scan(*Rows) (Scanner, error) } type Storage struct { *sql.DB @@ -25,7 +28,20 @@ func Open(cfg *Cfg) *Storage { return &Storage{db} } -func QueryData[T any](db *Storage, q string, args ...interface{}) []T { +func QueryData[T Scanner](db *Storage, q string, args ...interface{}) []T { + var data []T + proc := func(r *sql.Rows) error { + var rec T + r1, err := rec.Scan(r) + rec = r1.(T) + data = append(data, rec) + return err + } + db.Query(proc, q, args...) // ?? check error + return data +} + +func QueryCol[T any](db *Storage, q string, args ...interface{}) []T { var data []T proc := func(r *sql.Rows) error { var rec T @@ -33,7 +49,7 @@ func QueryData[T any](db *Storage, q string, args ...interface{}) []T { data = append(data, rec) return err } - db.Query(proc, q, args...) + db.Query(proc, q, args...) // ?? check error return data } diff --git a/tests/storage_test.go b/tests/storage_test.go index 2c531f8..c150f75 100644 --- a/tests/storage_test.go +++ b/tests/storage_test.go @@ -30,12 +30,23 @@ func DoTests(t *testing.T, cfg *sql.Cfg, db *sql.Storage) { t.Run("base", func(t *testing.T) { BaseTest(t, cfg, db) }) } +type greet struct { + id int64 + label string +} + +func (g greet) Scan(rows *sql.Rows) (sql.Scanner, error) { + err := rows.Scan(&g.id, &g.label) + return g, err +} + func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) { //fmt.Println(cfg.Connstr) db.Exec(insert) - data := sql.QueryData[string](db, query, 2) + //data := sql.QueryCol[string](db, query, 2) + data := sql.QueryData[greet](db, query, 2) t.AssertEqual(len(data), 1) - t.AssertEqual(data[0], "Good Afternoon") + t.AssertEqual(data[0].label, "Good Afternoon") } func resetSqlite(db *sql.Storage) { @@ -56,7 +67,7 @@ var insert = `insert into test (label) values ('Hello World'), ('Good Afternoon')` -var query = `select label from test +var query = `select id, label from test where id = $1` // database-specific SQL statements