From aaea7273c33a6c604d8435d7fbf7448884821d77 Mon Sep 17 00:00:00 2001 From: James Mills <1290234+prologic@users.noreply.github.com> Date: Thu, 21 Mar 2019 10:41:56 +1000 Subject: [PATCH] Add Keys() to exported API (extended API) --- bitcask.go | 4 ++++ bitcask_test.go | 8 ++++++++ internal/keydir.go | 6 ++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/bitcask.go b/bitcask.go index 77d7d62..8f28878 100644 --- a/bitcask.go +++ b/bitcask.go @@ -125,6 +125,10 @@ func (b *Bitcask) Scan(prefix string, f func(key string) error) error { return nil } +func (b *Bitcask) Keys() chan string { + return b.keydir.Keys() +} + func (b *Bitcask) Fold(f func(key string) error) error { for key := range b.keydir.Keys() { if err := f(key); err != nil { diff --git a/bitcask_test.go b/bitcask_test.go index b6aa0f2..c343f06 100644 --- a/bitcask_test.go +++ b/bitcask_test.go @@ -44,6 +44,14 @@ func TestAll(t *testing.T) { assert.True(db.Has("foo")) }) + t.Run("Keys", func(t *testing.T) { + keys := make([]string, 0) + for key := range db.Keys() { + keys = append(keys, key) + } + assert.Equal([]string{"foo"}, keys) + }) + t.Run("Fold", func(t *testing.T) { var ( keys []string diff --git a/internal/keydir.go b/internal/keydir.go index 31d41d9..285d16b 100644 --- a/internal/keydir.go +++ b/internal/keydir.go @@ -55,8 +55,10 @@ func (k *Keydir) Delete(key string) { func (k *Keydir) Keys() chan string { ch := make(chan string) go func() { - for k := range k.kv { - ch <- k + k.RLock() + defer k.RUnlock() + for key := range k.kv { + ch <- key } close(ch) }()