X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=database%2Fleveldb%2Fmem_db.go;fp=database%2Fleveldb%2Fmem_db.go;h=e70aa9d0ba06a1040fcfa3ce84139122739ed7a2;hb=041a74394dd18dc0abbee21dd6e6e18bbdbd630a;hp=62f40fc69bbf9016feb51fb39b7fe95221c9e79b;hpb=e3f88c0fd58293b5d6651ba83c908c6fb2788ce0;p=bytom%2Fbytom.git diff --git a/database/leveldb/mem_db.go b/database/leveldb/mem_db.go index 62f40fc6..e70aa9d0 100644 --- a/database/leveldb/mem_db.go +++ b/database/leveldb/mem_db.go @@ -1,6 +1,7 @@ package db import ( + "bytes" "fmt" "sort" "strings" @@ -78,13 +79,29 @@ func (db *MemDB) Stats() map[string]string { type memDBIterator struct { last int keys []string - db *MemDB + db DB + + start []byte } func newMemDBIterator() *memDBIterator { return &memDBIterator{} } +// Keys is expected to be in reverse order for reverse iterators. +func newMemDBIteratorWithArgs(db DB, keys []string, start []byte) *memDBIterator { + itr := &memDBIterator{ + db: db, + keys: keys, + start: start, + last: -1, + } + if start != nil { + itr.Seek(start) + } + return itr +} + func (it *memDBIterator) Next() bool { if it.last >= len(it.keys)-1 { return false @@ -143,10 +160,38 @@ func (db *MemDB) IteratorPrefix(prefix []byte) Iterator { return it } +func (db *MemDB) IteratorPrefixWithStart(Prefix, start []byte, isReverse bool) Iterator { + db.mtx.Lock() + defer db.mtx.Unlock() + + keys := db.getSortedKeys(start, isReverse) + return newMemDBIteratorWithArgs(db, keys, start) +} + func (db *MemDB) NewBatch() Batch { return &memDBBatch{db, nil} } +func (db *MemDB) getSortedKeys(start []byte, reverse bool) []string { + keys := []string{} + for key := range db.db { + if bytes.Compare([]byte(key), start) < 0 { + continue + } + keys = append(keys, key) + } + sort.Strings(keys) + if reverse { + nkeys := len(keys) + for i := 0; i < nkeys/2; i++ { + temp := keys[i] + keys[i] = keys[nkeys-i-1] + keys[nkeys-i-1] = temp + } + } + return keys +} + //-------------------------------------------------------------------------------- type memDBBatch struct {