Add Tx.Cursor().

This commit adds the Cursor() function to Tx. This allows iteration on the root bucket
in a similar way to iteration on other buckets.

Fixes #141.
master
Ben Johnson 2014-04-29 07:25:14 -06:00
parent 46d83eb140
commit e3957cd0de
2 changed files with 33 additions and 0 deletions

8
tx.go
View File

@ -75,6 +75,14 @@ func (tx *Tx) Writable() bool {
return tx.writable return tx.writable
} }
// Cursor creates a cursor associated with the root bucket.
// All items in the cursor will return a nil value because all root bucket keys point to buckets.
// The cursor is only valid as long as the transaction is open.
// Do not use a cursor after the transaction is closed.
func (tx *Tx) Cursor() *Cursor {
return tx.root.Cursor()
}
// Stats retrieves a copy of the current transaction statistics. // Stats retrieves a copy of the current transaction statistics.
func (tx *Tx) Stats() TxStats { func (tx *Tx) Stats() TxStats {
return tx.stats return tx.stats

View File

@ -36,6 +36,31 @@ func TestTx_Commit_ReadOnly(t *testing.T) {
}) })
} }
// Ensure that a transaction can retrieve a cursor on the root bucket.
func TestTx_Cursor(t *testing.T) {
withOpenDB(func(db *DB, path string) {
db.Update(func(tx *Tx) error {
tx.CreateBucket([]byte("widgets"))
tx.CreateBucket([]byte("woojits"))
c := tx.Cursor()
k, v := c.First()
assert.Equal(t, "widgets", string(k))
assert.Nil(t, v)
k, v = c.Next()
assert.Equal(t, "woojits", string(k))
assert.Nil(t, v)
k, v = c.Next()
assert.Nil(t, k)
assert.Nil(t, v)
return nil
})
})
}
// Ensure that creating a bucket with a read-only transaction returns an error. // Ensure that creating a bucket with a read-only transaction returns an error.
func TestTx_CreateBucket_ReadOnly(t *testing.T) { func TestTx_CreateBucket_ReadOnly(t *testing.T) {
withOpenDB(func(db *DB, path string) { withOpenDB(func(db *DB, path string) {