fix c level db iterator

This commit is contained in:
Ethan Buchman
2017-12-15 15:58:23 -05:00
parent 225eace316
commit 66b0e8fa2d
2 changed files with 30 additions and 20 deletions

View File

@ -162,16 +162,7 @@ func (mBatch *cLevelDBBatch) Write() {
func (db *CLevelDB) Iterator(start, end []byte) Iterator { func (db *CLevelDB) Iterator(start, end []byte) Iterator {
itr := db.db.NewIterator(db.ro) itr := db.db.NewIterator(db.ro)
if len(start) > 0 { return newCLevelDBIterator(itr, start, end)
itr.Seek(start)
} else {
itr.SeekToFirst()
}
return &cLevelDBIterator{
itr: itr,
start: start,
end: end,
}
} }
func (db *CLevelDB) ReverseIterator(start, end []byte) Iterator { func (db *CLevelDB) ReverseIterator(start, end []byte) Iterator {
@ -187,6 +178,21 @@ type cLevelDBIterator struct {
invalid bool invalid bool
} }
func newCLevelDBIterator(itr *levigo.Iterator, start, end []byte) *cLevelDBIterator {
if len(start) > 0 {
itr.Seek(start)
} else {
itr.SeekToFirst()
}
return &cLevelDBIterator{
itr: itr,
start: start,
end: end,
}
}
func (c *cLevelDBIterator) Domain() ([]byte, []byte) { func (c *cLevelDBIterator) Domain() ([]byte, []byte) {
return c.start, c.end return c.start, c.end
} }
@ -223,12 +229,16 @@ func (c *cLevelDBIterator) Next() {
} }
// levigo has no upper bound when iterating, so need to check ourselves // levigo has no upper bound when iterating, so need to check ourselves
func (c *cLevelDBIterator) checkEndKey() []byte { func (c *cLevelDBIterator) checkEndKey() {
if !c.itr.Valid() {
c.invalid = true
return
}
key := c.itr.Key() key := c.itr.Key()
if c.end != nil && bytes.Compare(key, c.end) > 0 { if c.end != nil && bytes.Compare(key, c.end) > 0 {
c.invalid = true c.invalid = true
} }
return key
} }
func (c *cLevelDBIterator) Close() { func (c *cLevelDBIterator) Close() {