0
0

Merge pull request #272 from kevgs/boltdb_optimize

BoltDB wrapper nano optimization which makes code a bit prettier too
This commit is contained in:
Marty Schoch 2015-11-12 15:39:37 +00:00
commit eee4482964
3 changed files with 15 additions and 13 deletions

View File

@ -15,13 +15,14 @@ import (
)
type Reader struct {
store *Store
tx *bolt.Tx
store *Store
tx *bolt.Tx
bucket *bolt.Bucket
}
func (r *Reader) Get(key []byte) ([]byte, error) {
var rv []byte
v := r.tx.Bucket([]byte(r.store.bucket)).Get(key)
v := r.bucket.Get(key)
if v != nil {
rv = make([]byte, len(v))
copy(rv, v)
@ -30,8 +31,7 @@ func (r *Reader) Get(key []byte) ([]byte, error) {
}
func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
b := r.tx.Bucket([]byte(r.store.bucket))
cursor := b.Cursor()
cursor := r.bucket.Cursor()
rv := &Iterator{
store: r.store,
@ -45,8 +45,7 @@ func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
}
func (r *Reader) RangeIterator(start, end []byte) store.KVIterator {
b := r.tx.Bucket([]byte(r.store.bucket))
cursor := b.Cursor()
cursor := r.bucket.Cursor()
rv := &Iterator{
store: r.store,

View File

@ -83,8 +83,9 @@ func (bs *Store) Reader() (store.KVReader, error) {
return nil, err
}
return &Reader{
store: bs,
tx: tx,
store: bs,
tx: tx,
bucket: tx.Bucket([]byte(bs.bucket)),
}, nil
}

View File

@ -35,14 +35,16 @@ func (w *Writer) ExecuteBatch(batch store.KVBatch) error {
return err
}
bucket := tx.Bucket([]byte(w.store.bucket))
for k, mergeOps := range emulatedBatch.Merger.Merges {
kb := []byte(k)
existingVal := tx.Bucket([]byte(w.store.bucket)).Get(kb)
existingVal := bucket.Get(kb)
mergedVal, fullMergeOk := w.store.mo.FullMerge(kb, existingVal, mergeOps)
if !fullMergeOk {
return fmt.Errorf("merge operator returned failure")
}
err = tx.Bucket([]byte(w.store.bucket)).Put(kb, mergedVal)
err = bucket.Put(kb, mergedVal)
if err != nil {
return err
}
@ -50,12 +52,12 @@ func (w *Writer) ExecuteBatch(batch store.KVBatch) error {
for _, op := range emulatedBatch.Ops {
if op.V != nil {
err := tx.Bucket([]byte(w.store.bucket)).Put(op.K, op.V)
err := bucket.Put(op.K, op.V)
if err != nil {
return err
}
} else {
err := tx.Bucket([]byte(w.store.bucket)).Delete(op.K)
err := bucket.Delete(op.K)
if err != nil {
return err
}