47 lines
806 B
Go
47 lines
806 B
Go
package with
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
)
|
|
|
|
type SQLKV struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func KV(ctx context.Context, db *sql.DB, foo func(SQLKV) error) error {
|
|
if _, err := db.ExecContext(ctx, `
|
|
CREATE TABLE IF NOT EXISTS with_kv(
|
|
k TEXT PRIMARY KEY
|
|
, v TEXT
|
|
)
|
|
`); err != nil {
|
|
return err
|
|
}
|
|
|
|
return foo(SQLKV{db: db})
|
|
}
|
|
|
|
func (kv SQLKV) Get(ctx context.Context, k string) ([]byte, error) {
|
|
row := kv.db.QueryRowContext(ctx, `
|
|
SELECT v FROM with_kv WHERE k=$1
|
|
`, k)
|
|
|
|
var v []byte
|
|
if err := row.Scan(&v); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return v, row.Err()
|
|
}
|
|
|
|
func (kv SQLKV) Set(ctx context.Context, k string, v []byte) error {
|
|
_, err := kv.db.ExecContext(ctx, `
|
|
INSERT INTO with_kv
|
|
(k, v) VALUES ($1, $2)
|
|
ON CONFLICT DO UPDATE
|
|
SET v=$2 WHERE k=$1
|
|
`, k, v)
|
|
return err
|
|
}
|