diff --git a/skv-test.db b/skv-test.db new file mode 100644 index 0000000..41a6619 Binary files /dev/null and b/skv-test.db differ diff --git a/skv.go b/skv.go index e8fd7cc..8f45aae 100644 --- a/skv.go +++ b/skv.go @@ -141,6 +141,27 @@ func (kvs *KVStore) Delete(key string) error { }) } +// Iterate over all existing keys and return a slice of the keys. +// If no keys are found, return an empty slice. +// +// store.GetKeys() +func (kvs *KVStore) GetKeys() ([]string, error) { + var kl []string + + err := kvs.db.View(func(tx *bolt.Tx) error { + var err error + b := tx.Bucket(bucketName) + + err = b.ForEach(func(k, v []byte) error { + //copy(kopie, k) + kl = append(kl, string(k)) + return err + }) + return err + }) + return kl, err +} + // Close closes the key-value store file. func (kvs *KVStore) Close() error { return kvs.db.Close() diff --git a/skv_test.go b/skv_test.go index e2fe841..1055e47 100644 --- a/skv_test.go +++ b/skv_test.go @@ -131,6 +131,26 @@ func testGetPut(t *testing.T, inval interface{}, outval interface{}) { } } +func TestGetKeys(t *testing.T) { + os.Remove("skv-test.db") + db, err := Open("skv-test.db") + if err != nil { + t.Fatal(err) + } + if l, err := db.GetKeys(); err != nil || len(l) != 0 { + t.Fatal("GetKey slice should be empty") + } + if err := db.Put("test.key", "TESTVALUE"); err != nil { + t.Fatal(err) + } + if l, err := db.GetKeys(); err != nil || len(l) != 1 { + t.Fatal("GetKey slice should contain one key") + } + if err := db.Close(); err != nil { + t.Fatal(err) + } +} + func TestNil(t *testing.T) { os.Remove("skv-test.db") db, err := Open("skv-test.db")