diff --git a/storage/sql/sql.go b/storage/sql/sql.go index 9fcf436..c5cea8b 100644 --- a/storage/sql/sql.go +++ b/storage/sql/sql.go @@ -13,7 +13,11 @@ type Cfg struct { type Rows = sql.Rows type rowsProc = func(*sql.Rows) error -type scanner[T any] interface{ Scan(*Rows) (T, error) } +type scanner interface{ Scan(*Rows) error } +type sccon[T any] interface { + *T + scanner +} type Storage struct { *sql.DB @@ -28,12 +32,15 @@ func Open(cfg *Cfg) *Storage { return &Storage{db} } -func QueryData[T scanner[T]](db *Storage, q string, args ...interface{}) []T { +func QueryData[P interface { + *T + scanner +}, T any](db *Storage, q string, args ...interface{}) []T { var data []T - var rec T + rp := P(new(T)) proc := func(r *sql.Rows) error { - rec, err := rec.Scan(r) - data = append(data, rec) + err := rp.Scan(r) + data = append(data, *rp) return err } db.Query(proc, q, args...) // ?? check error diff --git a/tests/storage_test.go b/tests/storage_test.go index ee0f937..52a2c1f 100644 --- a/tests/storage_test.go +++ b/tests/storage_test.go @@ -35,15 +35,14 @@ type greet struct { label string } -func (g greet) Scan(rows *sql.Rows) (greet, error) { - err := rows.Scan(&g.id, &g.label) - return g, err +func (g *greet) Scan(rows *sql.Rows) error { + return rows.Scan(&g.id, &g.label) } func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) { db.Exec(insert) //data := sql.QueryCol[string](db, query, 2) - data := sql.QueryData[greet](db, query) + data := sql.QueryData[*greet](db, query) t.AssertEqual(len(data), 2) t.AssertEqual(data[0].label, "Hello World") t.AssertEqual(data[1].label, "Good Afternoon")