QueryData: keep both variants of scan method: call by value, call by reference (pointer)
This commit is contained in:
parent
d45f6866b7
commit
17e044dee2
2 changed files with 33 additions and 11 deletions
|
@ -10,17 +10,18 @@ type Cfg struct {
|
||||||
Driver, Connstr string
|
Driver, Connstr string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Storage struct {
|
||||||
|
*sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
type Rows = sql.Rows
|
type Rows = sql.Rows
|
||||||
|
|
||||||
type rowsProc = func(*sql.Rows) error
|
type rowsProc = func(*sql.Rows) error
|
||||||
type scanner interface{ Scan(*Rows) error }
|
type scn[T any] interface{ Scan(*Rows) (T, error) }
|
||||||
type sccon[T any] interface {
|
type scp interface{ ScanP(*Rows) error }
|
||||||
|
type scpcon[T any] interface {
|
||||||
*T
|
*T
|
||||||
scanner
|
scp
|
||||||
}
|
|
||||||
|
|
||||||
type Storage struct {
|
|
||||||
*sql.DB
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Open(cfg *Cfg) *Storage {
|
func Open(cfg *Cfg) *Storage {
|
||||||
|
@ -32,11 +33,23 @@ func Open(cfg *Cfg) *Storage {
|
||||||
return &Storage{db}
|
return &Storage{db}
|
||||||
}
|
}
|
||||||
|
|
||||||
func QueryData[P sccon[T], T any](db *Storage, q string, args ...interface{}) []T {
|
func QueryData[T scn[T]](db *Storage, q string, args ...interface{}) []T {
|
||||||
|
var data []T
|
||||||
|
var rec T
|
||||||
|
proc := func(r *sql.Rows) error {
|
||||||
|
rec, err := rec.Scan(r)
|
||||||
|
data = append(data, rec)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
db.Query(proc, q, args...) // ?? check error
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func QueryDataP[P scpcon[T], T any](db *Storage, q string, args ...interface{}) []T {
|
||||||
var data []T
|
var data []T
|
||||||
rp := P(new(T))
|
rp := P(new(T))
|
||||||
proc := func(r *sql.Rows) error {
|
proc := func(r *sql.Rows) error {
|
||||||
err := rp.Scan(r)
|
err := rp.ScanP(r)
|
||||||
data = append(data, *rp)
|
data = append(data, *rp)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,14 +35,23 @@ type greet struct {
|
||||||
label string
|
label string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *greet) Scan(rows *sql.Rows) error {
|
func (g greet) Scan(rows *sql.Rows) (greet, error) {
|
||||||
|
err := rows.Scan(&g.id, &g.label)
|
||||||
|
return g, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *greet) ScanP(rows *sql.Rows) error {
|
||||||
return rows.Scan(&g.id, &g.label)
|
return rows.Scan(&g.id, &g.label)
|
||||||
}
|
}
|
||||||
|
|
||||||
func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
|
func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
|
||||||
db.Exec(insert)
|
db.Exec(insert)
|
||||||
//data := sql.QueryCol[string](db, query, 2)
|
//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")
|
||||||
|
data = sql.QueryDataP[*greet](db, query)
|
||||||
t.AssertEqual(len(data), 2)
|
t.AssertEqual(len(data), 2)
|
||||||
t.AssertEqual(data[0].label, "Hello World")
|
t.AssertEqual(data[0].label, "Hello World")
|
||||||
t.AssertEqual(data[1].label, "Good Afternoon")
|
t.AssertEqual(data[1].label, "Good Afternoon")
|
||||||
|
|
Loading…
Add table
Reference in a new issue