// 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() }