mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-19 16:11:20 +00:00
CacheDB (#67)
* Add CacheDB & SimpleMap * Generic memBatch; Fix cLevelDB tests * CacheWrap() for CacheDB and MemDB * Change Iterator to match LeviGo Iterator * Fixes from review * cacheWrapWriteMutex and some race fixes * Use tmlibs/common * NewCWWMutex is exposed. DB can be CacheWrap'd * Remove GetOK, not needed * Fsdb (#72) * Add FSDB * Review fixes from Anton * Review changes * Fixes from review
This commit is contained in:
82
db/util.go
Normal file
82
db/util.go
Normal file
@ -0,0 +1,82 @@
|
||||
package db
|
||||
|
||||
import "bytes"
|
||||
|
||||
// A wrapper around itr that tries to keep the iterator
|
||||
// within the bounds as defined by `prefix`
|
||||
type prefixIterator struct {
|
||||
itr Iterator
|
||||
prefix []byte
|
||||
invalid bool
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) Seek(key []byte) {
|
||||
if !bytes.HasPrefix(key, pi.prefix) {
|
||||
pi.invalid = true
|
||||
return
|
||||
}
|
||||
pi.itr.Seek(key)
|
||||
pi.checkInvalid()
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) checkInvalid() {
|
||||
if !pi.itr.Valid() {
|
||||
pi.invalid = true
|
||||
}
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) Valid() bool {
|
||||
if pi.invalid {
|
||||
return false
|
||||
}
|
||||
key := pi.itr.Key()
|
||||
ok := bytes.HasPrefix(key, pi.prefix)
|
||||
if !ok {
|
||||
pi.invalid = true
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) Next() {
|
||||
if pi.invalid {
|
||||
panic("prefixIterator Next() called when invalid")
|
||||
}
|
||||
pi.itr.Next()
|
||||
pi.checkInvalid()
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) Prev() {
|
||||
if pi.invalid {
|
||||
panic("prefixIterator Prev() called when invalid")
|
||||
}
|
||||
pi.itr.Prev()
|
||||
pi.checkInvalid()
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) Key() []byte {
|
||||
if pi.invalid {
|
||||
panic("prefixIterator Key() called when invalid")
|
||||
}
|
||||
return pi.itr.Key()
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) Value() []byte {
|
||||
if pi.invalid {
|
||||
panic("prefixIterator Value() called when invalid")
|
||||
}
|
||||
return pi.itr.Value()
|
||||
}
|
||||
|
||||
func (pi *prefixIterator) Close() { pi.itr.Close() }
|
||||
func (pi *prefixIterator) GetError() error { return pi.itr.GetError() }
|
||||
|
||||
func IteratePrefix(db DB, prefix []byte) Iterator {
|
||||
itr := db.Iterator()
|
||||
pi := &prefixIterator{
|
||||
itr: itr,
|
||||
prefix: prefix,
|
||||
}
|
||||
pi.Seek(prefix)
|
||||
return pi
|
||||
}
|
Reference in New Issue
Block a user