diff --git a/store/Memory.go b/store/Memory.go index c47f806..65ab666 100644 --- a/store/Memory.go +++ b/store/Memory.go @@ -11,7 +11,7 @@ import ( "time" ) -// MemoryStore is a simple in-memory key/value store for testing purposes. +// MemoryStore is a simple in-memory key-value store for testing purposes. type MemoryStore struct { mutex *sync.Mutex data map[string][]byte @@ -39,7 +39,7 @@ func (ms *MemoryStore) ExpireKeys() { } } -// Set stores the key/value pair. +// Set stores the key-value pair. func (ms *MemoryStore) Set(key []byte, data []byte) error { ms.mutex.Lock() ms.data[string(key)] = data @@ -47,7 +47,7 @@ func (ms *MemoryStore) Set(key []byte, data []byte) error { return nil } -// StoreExpire stores the key/value pair and deletes it after the expiration time. +// StoreExpire stores the key-value pair and deletes it after the expiration time. func (ms *MemoryStore) StoreExpire(key []byte, data []byte, expiration time.Time) error { ms.mutex.Lock() ms.expireMap[string(key)] = expiration @@ -64,7 +64,7 @@ func (ms *MemoryStore) Get(key []byte) (data []byte, found bool) { return data, found } -// Delete deletes a key/value pair. +// Delete deletes a key-value pair. func (ms *MemoryStore) Delete(key []byte) { ms.mutex.Lock() delete(ms.expireMap, string(key)) @@ -78,3 +78,17 @@ func (ms *MemoryStore) Count() uint64 { defer ms.mutex.Unlock() return uint64(len(ms.data)) } + +// Iterate iterates over all records. +func (ms *MemoryStore) Iterate(callback func(key, value []byte)) { + ms.mutex.Lock() + defer ms.mutex.Unlock() + + for key, value := range ms.data { + ms.mutex.Unlock() // allow access to the map while calling the callback + + callback([]byte(key), value) + + ms.mutex.Lock() + } +} diff --git a/store/Pogreb.go b/store/Pogreb.go index 0ff49cc..e1636e1 100644 --- a/store/Pogreb.go +++ b/store/Pogreb.go @@ -16,7 +16,7 @@ import ( "github.com/akrylysov/pogreb" ) -// PogrebStore is a key/value store using Pogreb. +// PogrebStore is a key-value store using Pogreb. // Expiration is currently not supported. type PogrebStore struct { mutex *sync.Mutex @@ -45,12 +45,12 @@ func (store *PogrebStore) ExpireKeys() { // Not yet implemented } -// Store stores the key/value pair. +// Store stores the key-value pair. func (store *PogrebStore) Set(key []byte, data []byte) error { return store.db.Put(key, data) } -// StoreExpire stores the key/value pair and deletes it after the expiration time. +// StoreExpire stores the key-value pair and deletes it after the expiration time. func (store *PogrebStore) StoreExpire(key []byte, data []byte, expiration time.Time) error { // Not yet implemented return errors.New("not yet implemented") @@ -65,7 +65,7 @@ func (store *PogrebStore) Get(key []byte) (data []byte, found bool) { return value, true } -// Delete deletes a key/value pair. +// Delete deletes a key-value pair. func (store *PogrebStore) Delete(key []byte) { store.db.Delete(key) } @@ -74,3 +74,16 @@ func (store *PogrebStore) Delete(key []byte) { func (store *PogrebStore) Count() uint64 { return uint64(store.db.Count()) } + +// Iterate iterates over all records. +func (store *PogrebStore) Iterate(callback func(key, value []byte)) { + iterator := store.db.Items() + for { + key, value, err := iterator.Next() + if err != nil { + break + } + + callback(key, value) + } +} diff --git a/store/Store.go b/store/Store.go index 13a9688..3c95bf5 100644 --- a/store/Store.go +++ b/store/Store.go @@ -14,17 +14,17 @@ import ( // Store is the interface for implementing the storage mechanism for the DHT. type Store interface { - // Set stores the key/value pair. + // Set stores the key-value pair. Set(key []byte, data []byte) error - // StoreExpire stores the key/value pair and deletes it after the expiration time. - // If key/value already exists, it will be overwritten and the new expiration time applies. + // StoreExpire stores the key-value pair and deletes it after the expiration time. + // If key-value already exists, it will be overwritten and the new expiration time applies. StoreExpire(key []byte, data []byte, expiration time.Time) error // Get returns the value for the key if present. Get(key []byte) (data []byte, found bool) - // Delete deletes a key/value pair. + // Delete deletes a key-value pair. Delete(key []byte) // ExpireKeys is called to delete all keys that are marked for expiration. @@ -32,4 +32,7 @@ type Store interface { // Count returns the total number of records stored. Count() uint64 + + // Iterate iterates over all records. + Iterate(callback func(key, value []byte)) }