-package db
+package leveldb
import (
"fmt"
}
type goLevelDBIterator struct {
- source iterator.Iterator
+ source iterator.Iterator
+ start []byte
+ isReverse bool
+}
+
+func newGoLevelDBIterator(source iterator.Iterator, start []byte, isReverse bool) *goLevelDBIterator {
+ if start != nil {
+ valid := source.Seek(start)
+ if !valid && isReverse {
+ source.Last()
+ source.Next()
+ }
+ } else if isReverse {
+ source.Last()
+ source.Next()
+ }
+
+ return &goLevelDBIterator{
+ source: source,
+ start: start,
+ isReverse: isReverse,
+ }
}
// Key returns a copy of the current key.
}
func (it *goLevelDBIterator) Next() bool {
+ it.assertNoError()
+ if it.isReverse {
+ return it.source.Prev()
+ }
return it.source.Next()
}
it.source.Release()
}
+func (it *goLevelDBIterator) assertNoError() {
+ if err := it.source.Error(); err != nil {
+ panic(err)
+ }
+}
+
func (db *GoLevelDB) Iterator() Iterator {
- return &goLevelDBIterator{db.db.NewIterator(nil, nil)}
+ return &goLevelDBIterator{source: db.db.NewIterator(nil, nil)}
}
func (db *GoLevelDB) IteratorPrefix(prefix []byte) Iterator {
- return &goLevelDBIterator{db.db.NewIterator(util.BytesPrefix(prefix), nil)}
+ return &goLevelDBIterator{source: db.db.NewIterator(util.BytesPrefix(prefix), nil)}
+}
+
+func (db *GoLevelDB) IteratorPrefixWithStart(Prefix, start []byte, isReverse bool) Iterator {
+ itr := db.db.NewIterator(util.BytesPrefix(Prefix), nil)
+ return newGoLevelDBIterator(itr, start, isReverse)
}
func (db *GoLevelDB) NewBatch() Batch {