aboutsummaryrefslogtreecommitdiff
path: root/db.go
diff options
context:
space:
mode:
Diffstat (limited to 'db.go')
-rw-r--r--db.go96
1 files changed, 88 insertions, 8 deletions
diff --git a/db.go b/db.go
index 7ffbe09..646c31b 100644
--- a/db.go
+++ b/db.go
@@ -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)]))