}
type goLevelDBIterator struct {
- source iterator.Iterator
- start []byte
+ source iterator.Iterator
+ start []byte
+ isReverse bool
}
-func newGoLevelDBIterator(source iterator.Iterator, start []byte) *goLevelDBIterator {
+func newGoLevelDBIterator(source iterator.Iterator, start []byte, isReverse bool) *goLevelDBIterator {
if start != nil {
- source.Seek(start)
+ valid := source.Seek(start)
+ if !valid && isReverse {
+ source.Last()
+ source.Next()
+ }
+ } else if isReverse {
+ source.Last()
+ source.Next()
}
return &goLevelDBIterator{
- source: source,
- start: start,
+ source: source,
+ start: start,
+ isReverse: isReverse,
}
}
func (it *goLevelDBIterator) Next() bool {
it.assertNoError()
+ if it.isReverse {
+ return it.source.Prev()
+ }
return it.source.Next()
}
return &goLevelDBIterator{source: db.db.NewIterator(util.BytesPrefix(prefix), nil)}
}
-func (db *GoLevelDB) IteratorPrefixWithStart(Prefix, start []byte) Iterator {
+func (db *GoLevelDB) IteratorPrefixWithStart(Prefix, start []byte, isReverse bool) Iterator {
itr := db.db.NewIterator(util.BytesPrefix(Prefix), nil)
- return newGoLevelDBIterator(itr, start)
+ return newGoLevelDBIterator(itr, start, isReverse)
}
func (db *GoLevelDB) NewBatch() Batch {