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, "_") }