sqkv/sqkv.go

79 lines
1.4 KiB
Go

package sqkv
import (
"context"
"database/sql"
"fmt"
"regexp"
_ "modernc.org/sqlite"
)
// DB is an SQKV database
type DB struct {
db *sql.DB
}
// Open opens (or creates) a new SQKV database
func Open(path string, opts ...OpenOption) (*DB, error) {
cfg := &OpenConfig{}
for _, opt := range opts {
opt(cfg)
}
dsn := fmt.Sprintf("file:%s%s", path, cfg)
db, err := sql.Open("sqlite", dsn)
if err != nil {
return nil, err
}
sqkv := &DB{
db: db,
}
_, err = sqkv.CreateBucketIfNotExist(DefaultBucket)
return sqkv, err
}
// Close closes the connection to the database
func (d *DB) Close() error {
return d.db.Close()
}
// Conn returns a direct DB connection
func (d *DB) Conn() (*sql.Conn, error) {
return d.db.Conn(context.Background())
}
// Get returns a value from the default bucket
func (d *DB) Get(key string) (string, error) {
b, err := d.Bucket(DefaultBucket)
if err != nil {
return "", nil
}
return b.Get(key)
}
// Put sets a value in the default bucket
func (d *DB) Put(key, value string) error {
b, err := d.Bucket(DefaultBucket)
if err != nil {
return nil
}
return b.Put(key, value)
}
// Delete removes a value from the default bucket
func (d *DB) Delete(key string) error {
b, err := d.Bucket(DefaultBucket)
if err != nil {
return nil
}
return b.Delete(key)
}
var escapeIdentRe = regexp.MustCompile(`[^A-Za-z]`)
func escapeIdent(in string) string {
return escapeIdentRe.ReplaceAllString(in, "_")
}