diff options
Diffstat (limited to 'db.go')
-rw-r--r-- | db.go | 45 |
1 files changed, 40 insertions, 5 deletions
@@ -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) }) } |