aboutsummaryrefslogtreecommitdiff
path: root/db.go
diff options
context:
space:
mode:
Diffstat (limited to 'db.go')
-rw-r--r--db.go45
1 files changed, 40 insertions, 5 deletions
diff --git a/db.go b/db.go
index c9b0e92..5cf1c6f 100644
--- a/db.go
+++ b/db.go
@@ -376,7 +376,11 @@ func (db *DB) With(fn func(*Transaction) error) error {
// An error is returned if the bucket cannot be found.
func (db *DB) ForEach(name string, fn func(k, v []byte) error) error {
return db.With(func(t *Transaction) error {
- return t.ForEach(name, fn)
+ b := t.Bucket(name)
+ if b == nil {
+ return ErrBucketNotFound
+ }
+ return b.ForEach(fn)
})
}
@@ -431,8 +435,13 @@ func (db *DB) DeleteBucket(name string) error {
func (db *DB) NextSequence(name string) (int, error) {
var seq int
err := db.Do(func(t *RWTransaction) error {
+ b := t.Bucket(name)
+ if b == nil {
+ return ErrBucketNotFound
+ }
+
var err error
- seq, err = t.NextSequence(name)
+ seq, err = b.NextSequence()
return err
})
if err != nil {
@@ -449,14 +458,36 @@ func (db *DB) Get(name string, key []byte) ([]byte, error) {
return nil, err
}
defer t.Close()
- return t.Get(name, key)
+
+ // Open bucket and retrieve value for key.
+ b := t.Bucket(name)
+ if b == nil {
+ return nil, ErrBucketNotFound
+ }
+ value, err := b.Get(key), nil
+ if err != nil {
+ return nil, err
+ } else if value == nil {
+ return nil, nil
+ }
+
+ // Copy the value out since the transaction will be closed after this
+ // function ends. The data can get reclaimed between now and when the
+ // value is used.
+ tmp := make([]byte, len(value))
+ copy(tmp, value)
+ return tmp, nil
}
// Put sets the value for a key in a bucket.
// Returns an error if the bucket is not found, if key is blank, if the key is too large, or if the value is too large.
func (db *DB) Put(name string, key []byte, value []byte) error {
return db.Do(func(t *RWTransaction) error {
- return t.Put(name, key, value)
+ b := t.Bucket(name)
+ if b == nil {
+ return ErrBucketNotFound
+ }
+ return b.Put(key, value)
})
}
@@ -464,7 +495,11 @@ func (db *DB) Put(name string, key []byte, value []byte) error {
// Returns an error if the bucket cannot be found.
func (db *DB) Delete(name string, key []byte) error {
return db.Do(func(t *RWTransaction) error {
- return t.Delete(name, key)
+ b := t.Bucket(name)
+ if b == nil {
+ return ErrBucketNotFound
+ }
+ return b.Delete(key)
})
}