diff --git a/storage/sql/sql.go b/storage/sql/sql.go index ab3d3c9..17877ff 100644 --- a/storage/sql/sql.go +++ b/storage/sql/sql.go @@ -10,6 +10,8 @@ type Cfg struct { Driver, Connstr string } +type rowsProc = func(*sql.Rows) error + type Storage struct { *sql.DB } @@ -23,8 +25,42 @@ func Open(cfg *Cfg) *Storage { return &Storage{db} } +func QueryData[T any](db *Storage, q string, args ...interface{}) []T { + var data []T + proc := func(r *sql.Rows) error { + var rec T + err := r.Scan(&rec) + data = append(data, rec) + return err + } + db.Query(proc, q, args...) + return data +} + +func (db *Storage) Query(process rowsProc, q string, args ...interface{}) error { + info := "sql.Storage.Query" + //log.Debug().Str("query", q).Msg(info) + logErr := func(err error) { log.Error(err).Str("query", q).Msg(info) } + rows, err := db.DB.Query(q, args...) + if err != nil { + logErr(err) + return err + } + for rows.Next() { + if err := process(rows); err != nil { + logErr(err) + return err + } + } + if err := rows.Err(); err != nil { + logErr(err) + return err + } + return nil +} + func (db *Storage) Exec(q string, args ...interface{}) (int64, error) { - info := "sql.Exec" + info := "sql.Storage.Exec" //log.Debug().Str("query", q).Msg(info) res, err := db.DB.Exec(q, args...) if err != nil { diff --git a/tests/storage_test.go b/tests/storage_test.go index 929ef43..2c531f8 100644 --- a/tests/storage_test.go +++ b/tests/storage_test.go @@ -33,6 +33,9 @@ func DoTests(t *testing.T, cfg *sql.Cfg, db *sql.Storage) { 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) + t.AssertEqual(len(data), 1) + t.AssertEqual(data[0], "Good Afternoon") } func resetSqlite(db *sql.Storage) {