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

View File

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