storage: Query method and QueryData function

This commit is contained in:
Helmut Merz 2023-08-15 19:02:09 +02:00
parent d7096500ce
commit d86ab50a41
2 changed files with 40 additions and 1 deletions

View file

@ -10,6 +10,8 @@ type Cfg struct {
Driver, Connstr string Driver, Connstr string
} }
type rowsProc = func(*sql.Rows) error
type Storage struct { type Storage struct {
*sql.DB *sql.DB
} }
@ -23,8 +25,42 @@ func Open(cfg *Cfg) *Storage {
return &Storage{db} 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) { func (db *Storage) Exec(q string, args ...interface{}) (int64, error) {
info := "sql.Exec" info := "sql.Storage.Exec"
//log.Debug().Str("query", q).Msg(info) //log.Debug().Str("query", q).Msg(info)
res, err := db.DB.Exec(q, args...) res, err := db.DB.Exec(q, args...)
if err != nil { if err != nil {

View file

@ -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) { func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
//fmt.Println(cfg.Connstr) //fmt.Println(cfg.Connstr)
db.Exec(insert) 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) { func resetSqlite(db *sql.Storage) {