aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db.go8
-rw-r--r--rwtransaction.go10
-rw-r--r--rwtransaction_test.go13
3 files changed, 31 insertions, 0 deletions
diff --git a/db.go b/db.go
index ec049dd..a519f73 100644
--- a/db.go
+++ b/db.go
@@ -389,6 +389,14 @@ func (db *DB) CreateBucket(name string) error {
})
}
+// CreateBucketIfNotExists creates a new bucket with the given name if it doesn't already exist.
+// This function can return an error if the name is blank, or the bucket name is too long.
+func (db *DB) CreateBucketIfNotExists(name string) error {
+ return db.Do(func(t *RWTransaction) error {
+ return t.CreateBucketIfNotExists(name)
+ })
+}
+
// DeleteBucket removes a bucket from the database.
// Returns an error if the bucket does not exist.
func (db *DB) DeleteBucket(name string) error {
diff --git a/rwtransaction.go b/rwtransaction.go
index 1c7a5f0..57135f3 100644
--- a/rwtransaction.go
+++ b/rwtransaction.go
@@ -49,6 +49,16 @@ func (t *RWTransaction) CreateBucket(name string) error {
return nil
}
+// CreateBucketIfNotExists creates a new bucket if it doesn't already exist.
+// Returns an error if the bucket name is blank, or if the bucket name is too long.
+func (t *RWTransaction) CreateBucketIfNotExists(name string) error {
+ err := t.CreateBucket(name)
+ if err != nil && err != ErrBucketExists {
+ return err
+ }
+ return nil
+}
+
// DeleteBucket deletes a bucket.
// Returns an error if the bucket cannot be found.
func (t *RWTransaction) DeleteBucket(name string) error {
diff --git a/rwtransaction_test.go b/rwtransaction_test.go
index 704c563..ea84b87 100644
--- a/rwtransaction_test.go
+++ b/rwtransaction_test.go
@@ -44,6 +44,19 @@ func TestRWTransactionCreateBucket(t *testing.T) {
})
}
+// Ensure that a bucket can be created if it doesn't already exist.
+func TestRWTransactionCreateBucketIfNotExists(t *testing.T) {
+ withOpenDB(func(db *DB, path string) {
+ assert.NoError(t, db.CreateBucketIfNotExists("widgets"))
+ assert.NoError(t, db.CreateBucketIfNotExists("widgets"))
+
+ // Read the bucket through a separate transaction.
+ b, err := db.Bucket("widgets")
+ assert.NotNil(t, b)
+ assert.NoError(t, err)
+ })
+}
+
// Ensure that a bucket cannot be created twice.
func TestRWTransactionRecreateBucket(t *testing.T) {
withOpenDB(func(db *DB, path string) {