79 lines
1.4 KiB
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, "_")
|
|
}
|