From 75014a590a0acd58f0bf5b61cb5fd2a9ae767434 Mon Sep 17 00:00:00 2001 From: Simarpreet Singh Date: Wed, 11 Dec 2019 20:52:55 -0800 Subject: [PATCH] store: Introduce DeleteBucket() Signed-off-by: Simarpreet Singh --- bbolt/bbolt.go | 14 ++++++++++++ bbolt/bbolt_test.go | 54 +++++++++++++++++++++++++++++++++++++++++++++ store.go | 1 + types/types.go | 4 ++++ 4 files changed, 73 insertions(+) diff --git a/bbolt/bbolt.go b/bbolt/bbolt.go index be9588c..9c91cdf 100644 --- a/bbolt/bbolt.go +++ b/bbolt/bbolt.go @@ -213,6 +213,20 @@ func (s Store) Delete(input types.DeleteItemInput) error { }) } +func (s Store) DeleteBucket(input types.DeleteBucketInput) error { + if err := util.CheckBucketName(input.BucketName); err != nil { + return err + } + + return s.db.Update(func(tx *bolt.Tx) error { + var b *bolt.Bucket + if b = tx.Bucket([]byte(s.rbc.Name)); b == nil { + return ErrBucketNotFound + } + return b.DeleteBucket([]byte(input.BucketName)) + }) +} + func (s Store) Scan(input types.ScanInput) (types.ScanOutput, error) { if err := util.CheckBucketName(input.BucketName); err != nil { return types.ScanOutput{}, err diff --git a/bbolt/bbolt_test.go b/bbolt/bbolt_test.go index 03edcca..deefc94 100644 --- a/bbolt/bbolt_test.go +++ b/bbolt/bbolt_test.go @@ -382,3 +382,57 @@ func TestStore_Info(t *testing.T) { assert.Equal(t, "gokvbbolt", actualInfo.Name) assert.Equal(t, "32 KiB", h.IBytes(uint64(actualInfo.Size))) } + +func TestStore_DeleteBucket(t *testing.T) { + s, f, err := setupStore() + defer func() { + _ = f.Close() + _ = os.RemoveAll(f.Name()) + }() + assert.NoError(t, err) + + // set + assert.NoError(t, s.Set(types.SetItemInput{ + Key: "foo", + Value: "bar", + BucketName: "subbucket", + })) + + // delete bucket + assert.NoError(t, s.DeleteBucket(types.DeleteBucketInput{ + BucketName: "subbucket"}, + )) + + // verify + var actualValue string + found, err := s.Get(types.GetItemInput{ + BucketName: "subbucket", + Key: "foo", + Value: &actualValue, + }) + assert.Equal(t, ErrBucketNotFound, err) + assert.False(t, found) + assert.Empty(t, actualValue) + + t.Run("sad path, empty input bucket name", func(t *testing.T) { + s, f, err := setupStore() + defer func() { + _ = f.Close() + _ = os.RemoveAll(f.Name()) + }() + assert.NoError(t, err) + assert.Equal(t, util.ErrEmptyBucketName, s.DeleteBucket(types.DeleteBucketInput{})) + }) + + t.Run("sad path, bucket not found", func(t *testing.T) { + s, f, err := setupStore() + defer func() { + _ = f.Close() + _ = os.RemoveAll(f.Name()) + }() + assert.NoError(t, err) + assert.Equal(t, ErrBucketNotFound, s.DeleteBucket(types.DeleteBucketInput{ + BucketName: "badbucket", + })) + }) +} diff --git a/store.go b/store.go index 3385c8d..9ddf7a1 100644 --- a/store.go +++ b/store.go @@ -7,6 +7,7 @@ type Store interface { BatchSet(input types.BatchSetItemInput) error Get(input types.GetItemInput) (found bool, err error) Delete(input types.DeleteItemInput) error + DeleteBucket(input types.DeleteBucketInput) error Close() error Scan(input types.ScanInput) (types.ScanOutput, error) Info() (types.StoreInfo, error) diff --git a/types/types.go b/types/types.go index 2dd489f..60e0694 100644 --- a/types/types.go +++ b/types/types.go @@ -23,6 +23,10 @@ type DeleteItemInput struct { Key string } +type DeleteBucketInput struct { + BucketName string +} + type ScanInput struct { BucketName string }