forked from mirrors/gotosocial
e43a46e982
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package kv
|
|
|
|
import (
|
|
"git.iim.gay/grufwub/go-errors"
|
|
"git.iim.gay/grufwub/go-store/storage"
|
|
)
|
|
|
|
var ErrIteratorClosed = errors.Define("store/kv: iterator closed")
|
|
|
|
// KVIterator provides a read-only iterator to all the key-value
|
|
// pairs in a KVStore. While the iterator is open the store is read
|
|
// locked, you MUST release the iterator when you are finished with
|
|
// it.
|
|
//
|
|
// Please note:
|
|
// - individual iterators are NOT concurrency safe, though it is safe to
|
|
// have multiple iterators running concurrently
|
|
type KVIterator struct {
|
|
store *KVStore // store is the linked KVStore
|
|
entries []storage.StorageEntry
|
|
index int
|
|
key string
|
|
onClose func()
|
|
}
|
|
|
|
// Next attempts to set the next key-value pair, the
|
|
// return value is if there was another pair remaining
|
|
func (i *KVIterator) Next() bool {
|
|
next := i.index + 1
|
|
if next >= len(i.entries) {
|
|
i.key = ""
|
|
return false
|
|
}
|
|
i.key = i.entries[next].Key()
|
|
i.index = next
|
|
return true
|
|
}
|
|
|
|
// Key returns the next key from the store
|
|
func (i *KVIterator) Key() string {
|
|
return i.key
|
|
}
|
|
|
|
// Release releases the KVIterator and KVStore's read lock
|
|
func (i *KVIterator) Release() {
|
|
// Reset key, path, entries
|
|
i.store = nil
|
|
i.key = ""
|
|
i.entries = nil
|
|
|
|
// Perform requested callback
|
|
i.onClose()
|
|
}
|
|
|
|
// Value returns the next value from the KVStore
|
|
func (i *KVIterator) Value() ([]byte, error) {
|
|
// Check store isn't closed
|
|
if i.store == nil {
|
|
return nil, ErrIteratorClosed
|
|
}
|
|
|
|
// Attempt to fetch from store
|
|
return i.store.get(i.key)
|
|
}
|