to generic func Select
This commit is contained in:
40
src/db.go
40
src/db.go
@@ -13,6 +13,8 @@ type DB struct {
|
|||||||
*sql.DB
|
*sql.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var global DB
|
||||||
|
|
||||||
func NewDB(ctx context.Context, driver, conn string) (DB, error) {
|
func NewDB(ctx context.Context, driver, conn string) (DB, error) {
|
||||||
sql, err := sql.Open(driver, conn)
|
sql, err := sql.Open(driver, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -25,6 +27,7 @@ func NewDB(ctx context.Context, driver, conn string) (DB, error) {
|
|||||||
return db, err
|
return db, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
global = db
|
||||||
return db, nil
|
return db, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,30 +48,47 @@ func (db DB) setup(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db DB) Get(ctx context.Context, database int, k string) (any, error) {
|
func Select[V any](ctx context.Context, database int, k string) (*V, error) {
|
||||||
|
var v V
|
||||||
|
err := global.Get(ctx, database, k, &v)
|
||||||
|
if err != nil {
|
||||||
|
if err != sql.ErrNoRows {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &v, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db DB) Get(ctx context.Context, database int, k string, vPtr any) error {
|
||||||
|
if err := db.get(ctx, database, k, vPtr); err != nil {
|
||||||
|
if err != sql.ErrNoRows {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db DB) get(ctx context.Context, database int, k string, vPtr any) error {
|
||||||
row := db.QueryRowContext(ctx, `
|
row := db.QueryRowContext(ctx, `
|
||||||
SELECT value
|
SELECT value
|
||||||
FROM data
|
FROM data
|
||||||
WHERE database=$1 AND key=$2
|
WHERE database=$1 AND key=$2
|
||||||
`, database, k)
|
`, database, k)
|
||||||
if err := row.Err(); err != nil {
|
if err := row.Err(); err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var v string
|
var v string
|
||||||
if err := row.Scan(&v); err != nil {
|
if err := row.Scan(&v); err != nil {
|
||||||
if err == sql.ErrNoRows {
|
return err
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var a any
|
if err := json.Unmarshal([]byte(v), vPtr); err != nil {
|
||||||
if err := json.Unmarshal([]byte(v), &a); err != nil {
|
return err
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return a, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db DB) Put(ctx context.Context, database int, k string, v any) error {
|
func (db DB) Put(ctx context.Context, database int, k string, v any) error {
|
||||||
|
|||||||
@@ -18,9 +18,10 @@ func TestDBSqlite(t *testing.T) {
|
|||||||
}
|
}
|
||||||
t.Cleanup(func() { db.Close() })
|
t.Cleanup(func() { db.Close() })
|
||||||
|
|
||||||
if v, err := db.Get(ctx, 5, "k"); err != nil {
|
v := -1
|
||||||
|
if err := db.Get(ctx, 5, "k", &v); err != nil {
|
||||||
t.Error("failed get 404:", err)
|
t.Error("failed get 404:", err)
|
||||||
} else if v != nil {
|
} else if v != -1 {
|
||||||
t.Error("got 404:", v)
|
t.Error("got 404:", v)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,9 +31,15 @@ func TestDBSqlite(t *testing.T) {
|
|||||||
t.Error("failed update:", err)
|
t.Error("failed update:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, err := db.Get(ctx, 5, "k"); err != nil {
|
if err := db.Get(ctx, 5, "k", &v); err != nil {
|
||||||
t.Error("failed get:", err)
|
t.Error("failed get:", err)
|
||||||
} else if v != float64(7) {
|
} else if v != 7 {
|
||||||
|
t.Errorf("wrong get: (%T) %v but wanted 7", v, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, err := src.Select[int](ctx, 5, "k"); err != nil {
|
||||||
|
t.Error("failed select[int]:", err)
|
||||||
|
} else if v == nil || *v != 7 {
|
||||||
t.Errorf("wrong get: (%T) %v but wanted 7", v, v)
|
t.Errorf("wrong get: (%T) %v but wanted 7", v, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,9 +49,10 @@ func TestDBSqlite(t *testing.T) {
|
|||||||
t.Error("failed del 404:", err)
|
t.Error("failed del 404:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, err := db.Get(ctx, 5, "k"); err != nil {
|
v = -1
|
||||||
|
if err := db.Get(ctx, 5, "k", &v); err != nil {
|
||||||
t.Error("failed get 410:", err)
|
t.Error("failed get 410:", err)
|
||||||
} else if v != nil {
|
} else if v != -1 {
|
||||||
t.Error("wrong get 410:", v)
|
t.Error("wrong get 410:", v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user