74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
// Copyright (C) 2018 Marius Schellenberger
|
|
|
|
package store
|
|
|
|
import "github.com/boltdb/bolt"
|
|
|
|
const defaultBoltBucket = "default"
|
|
|
|
type BoltStore struct {
|
|
Marshaler
|
|
db *bolt.DB
|
|
}
|
|
|
|
func NewBoltStore(file string, m Marshaler) (bs *BoltStore, err error) {
|
|
if m == nil {
|
|
m = NewGOB()
|
|
}
|
|
db, err := bolt.Open(file, 0666, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if err = db.Update(func(tx *bolt.Tx) error {
|
|
if _, err := tx.CreateBucketIfNotExists([]byte(defaultBoltBucket)); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}); err != nil {
|
|
return
|
|
}
|
|
bs = &BoltStore{m, db}
|
|
return
|
|
}
|
|
|
|
func (bs *BoltStore) Get(key string, v interface{}) (err error) {
|
|
err = bs.db.View(func(tx *bolt.Tx) error {
|
|
b := tx.Bucket([]byte(defaultBoltBucket)).Get([]byte(key))
|
|
if b == nil {
|
|
return ErrKeyNotFound
|
|
}
|
|
if v != nil {
|
|
return bs.Unmarshal(b, v)
|
|
}
|
|
return nil
|
|
})
|
|
return
|
|
}
|
|
|
|
func (bs *BoltStore) Set(key string, v interface{}) error {
|
|
return bs.db.Update(func(tx *bolt.Tx) error {
|
|
b, err := bs.Marshal(v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return tx.Bucket([]byte(defaultBoltBucket)).Put([]byte(key), b)
|
|
})
|
|
}
|
|
|
|
func (bs *BoltStore) ForEach(f func(string, []byte) error) error {
|
|
return bs.db.View(func(tx *bolt.Tx) error {
|
|
return tx.Bucket([]byte(defaultBoltBucket)).ForEach(func(k, v []byte) error {
|
|
return f(string(k), v)
|
|
})
|
|
})
|
|
}
|
|
|
|
func (bs *BoltStore) Delete(key string) error {
|
|
return bs.db.Update(func(tx *bolt.Tx) error {
|
|
return tx.Bucket([]byte(defaultBoltBucket)).Delete([]byte(key))
|
|
})
|
|
}
|
|
|
|
func (bs *BoltStore) Close() error {
|
|
return bs.db.Close()
|
|
}
|