OSDN Git Service

add log
[bytom/vapor.git] / database / leveldb / go_level_db.go
index e9e8d3d..99c28e0 100644 (file)
@@ -1,4 +1,4 @@
-package db
+package leveldb
 
 import (
        "fmt"
@@ -118,7 +118,28 @@ func (db *GoLevelDB) Stats() map[string]string {
 }
 
 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.
@@ -148,6 +169,10 @@ func (it *goLevelDBIterator) Error() error {
 }
 
 func (it *goLevelDBIterator) Next() bool {
+       it.assertNoError()
+       if it.isReverse {
+               return it.source.Prev()
+       }
        return it.source.Next()
 }
 
@@ -155,12 +180,23 @@ func (it *goLevelDBIterator) Release() {
        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 {