diff options
Diffstat (limited to 'db.go')
-rw-r--r-- | db.go | 96 |
1 files changed, 88 insertions, 8 deletions
@@ -14,12 +14,6 @@ const ( const minPageSize = 0x1000 -var ( - DatabaseNotOpenError = &Error{"db is not open", nil} - DatabaseAlreadyOpenedError = &Error{"db already open", nil} - TransactionInProgressError = &Error{"writable transaction is already in progress", nil} -) - type DB struct { sync.Mutex opened bool @@ -157,9 +151,9 @@ func (db *DB) init() error { // Initialize the meta page. m := p.meta() m.magic = magic - m.version = Version + m.version = version m.pageSize = uint32(db.pageSize) - m.version = Version + m.version = version m.free = 2 m.sys = 3 m.pgid = 4 @@ -239,6 +233,92 @@ func (db *DB) RWTransaction() (*RWTransaction, error) { return t, nil } +// Bucket retrieves a reference to a bucket. +func (db *DB) Bucket(name string) (*Bucket, error) { + t, err := db.Transaction() + if err != nil { + return nil, err + } + defer t.Close() + return t.Bucket(name), nil +} + +// Buckets retrieves a list of all buckets in the database. +func (db *DB) Buckets() ([]*Bucket, error) { + t, err := db.Transaction() + if err != nil { + return nil, err + } + defer t.Close() + return t.Buckets(), nil +} + +// CreateBucket creates a new bucket in the database. +func (db *DB) CreateBucket(name string) error { + t, err := db.RWTransaction() + if err != nil { + return err + } + + if err := t.CreateBucket(name); err != nil { + t.Rollback() + return err + } + + return t.Commit() +} + +// DeleteBucket removes a bucket from the database. +func (db *DB) DeleteBucket(name string) error { + t, err := db.RWTransaction() + if err != nil { + return err + } + + if err := t.DeleteBucket(name); err != nil { + t.Rollback() + return err + } + + return t.Commit() +} + +// Get retrieves the value for a key in a bucket. +func (db *DB) Get(name string, key []byte) ([]byte, error) { + t, err := db.Transaction() + if err != nil { + return nil, err + } + defer t.Close() + return t.Get(name, key), nil +} + +// Put sets the value for a key in a bucket. +func (db *DB) Put(name string, key []byte, value []byte) error { + t, err := db.RWTransaction() + if err != nil { + return err + } + if err := t.Put(name, key, value); err != nil { + t.Rollback() + return err + } + return t.Commit() +} + +// Delete removes a key from a bucket. +func (db *DB) Delete(name string, key []byte) error { + t, err := db.RWTransaction() + if err != nil { + return err + } + if err := t.Delete(name, key); err != nil { + t.Rollback() + return err + } + return t.Commit() +} + // page retrieves a page reference from the mmap based on the current page size. func (db *DB) page(id pgid) *page { return (*page)(unsafe.Pointer(&db.data[id*pgid(db.pageSize)])) |