From f1a9fc7722dd2d7a50d28fd165070d761be88c20 Mon Sep 17 00:00:00 2001
From: Wolfgang Welz <welzwo@gmail.com>
Date: Wed, 12 Jun 2019 20:24:05 +0200
Subject: [PATCH] Add delete and iterator functionality to database

---
 packages/database/database.go   | 31 +++++++++++++++++++++++++++++++
 packages/database/interfaces.go |  4 +++-
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/packages/database/database.go b/packages/database/database.go
index 9ac44a31..5ac305d6 100644
--- a/packages/database/database.go
+++ b/packages/database/database.go
@@ -112,6 +112,37 @@ func (this *databaseImpl) Get(key []byte) ([]byte, error) {
 	return result, err
 }
 
+func (this *databaseImpl) Delete(key []byte) error {
+	err := this.db.Update(func(txn *badger.Txn) error {
+		err := txn.Delete(key)
+		return err
+	})
+	return err
+}
+
+func (this *databaseImpl) ForEach(consumer func(key []byte, value []byte)) error {
+	err := this.db.View(func(txn *badger.Txn) error {
+		// create an iterator the default options
+		it := txn.NewIterator(badger.DefaultIteratorOptions)
+		defer it.Close()
+
+		// loop through every key-value-pair and call the function
+		for it.Rewind(); it.Valid(); it.Next() {
+			item := it.Item()
+
+			key := item.Key()
+			value, err := item.ValueCopy(nil)
+			if err != nil {
+				return err
+			}
+
+			consumer(key, value)
+		}
+		return nil
+	})
+	return err
+}
+
 func (this *databaseImpl) Close() error {
 	this.openLock.Lock()
 	defer this.openLock.Unlock()
diff --git a/packages/database/interfaces.go b/packages/database/interfaces.go
index 26b3a586..064e311b 100644
--- a/packages/database/interfaces.go
+++ b/packages/database/interfaces.go
@@ -3,7 +3,9 @@ package database
 type Database interface {
 	Open() error
 	Set(key []byte, value []byte) error
-	Get(key []byte) ([]byte, error)
 	Contains(key []byte) (bool, error)
+	Get(key []byte) ([]byte, error)
+	ForEach(func(key []byte, value []byte)) error
+	Delete(key []byte) error
 	Close() error
 }
-- 
GitLab