0
0

tighter moss KV store iterator handling

This commit is contained in:
Steve Yen 2016-08-18 16:37:21 -07:00
parent 5f1454106d
commit eaa59621ff
2 changed files with 14 additions and 34 deletions

View File

@ -23,15 +23,15 @@ type Iterator struct {
iter moss.Iterator iter moss.Iterator
start []byte start []byte
end []byte end []byte
done bool
k []byte k []byte
v []byte v []byte
err error
} }
func (x *Iterator) Seek(seekToKey []byte) { func (x *Iterator) Seek(seekToKey []byte) {
x.done = true
x.k = nil x.k = nil
x.v = nil x.v = nil
x.err = moss.ErrIteratorDone
if bytes.Compare(seekToKey, x.start) < 0 { if bytes.Compare(seekToKey, x.start) < 0 {
seekToKey = x.start seekToKey = x.start
@ -51,31 +51,21 @@ func (x *Iterator) Seek(seekToKey []byte) {
x.iter = iter x.iter = iter
x.checkDone() x.current()
} }
func (x *Iterator) Next() { func (x *Iterator) Next() {
if x.done { _ = x.iter.Next()
return
}
err := x.iter.Next() x.k, x.v, x.err = x.iter.Current()
if err != nil {
x.done = true
x.k = nil
x.v = nil
return
}
x.checkDone()
} }
func (x *Iterator) Current() ([]byte, []byte, bool) { func (x *Iterator) Current() ([]byte, []byte, bool) {
return x.k, x.v, !x.done return x.k, x.v, x.err == nil
} }
func (x *Iterator) Key() []byte { func (x *Iterator) Key() []byte {
if x.done { if x.err != nil {
return nil return nil
} }
@ -83,7 +73,7 @@ func (x *Iterator) Key() []byte {
} }
func (x *Iterator) Value() []byte { func (x *Iterator) Value() []byte {
if x.done { if x.err != nil {
return nil return nil
} }
@ -91,7 +81,7 @@ func (x *Iterator) Value() []byte {
} }
func (x *Iterator) Valid() bool { func (x *Iterator) Valid() bool {
return !x.done return x.err == nil
} }
func (x *Iterator) Close() error { func (x *Iterator) Close() error {
@ -104,23 +94,13 @@ func (x *Iterator) Close() error {
x.iter = nil x.iter = nil
} }
x.done = true
x.k = nil x.k = nil
x.v = nil x.v = nil
x.err = moss.ErrIteratorDone
return err return err
} }
func (x *Iterator) checkDone() { func (x *Iterator) current() {
k, v, err := x.iter.Current() x.k, x.v, x.err = x.iter.Current()
if err != nil {
x.done = true
x.k = nil
x.v = nil
return
}
x.done = false
x.k = k
x.v = v
} }

View File

@ -57,7 +57,7 @@ func (r *Reader) PrefixIterator(k []byte) store.KVIterator {
end: kEnd, end: kEnd,
} }
rv.checkDone() rv.current()
return rv return rv
} }
@ -76,7 +76,7 @@ func (r *Reader) RangeIterator(start, end []byte) store.KVIterator {
end: end, end: end,
} }
rv.checkDone() rv.current()
return rv return rv
} }