* modify light imports * change abci.header to tmproto.header * use rc * rc * fix import * Merge PR #6893: fix key imports * fix rc2 * tendermint: update 3 (#6899) * tendermint: update 4 (#6919) Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> * tendermint: update 5 (#6923) Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * bump to latest master * tendermint: update (#6972) Co-authored-by: Aleksandr Bezobchuk <aleks.bezobchuk@gmail.com> Co-authored-by: Cory Levinson <cjlevinson@gmail.com> * Update x/ibc/07-tendermint/types/test_utils.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * address comment * go mod * bring back things * fix test * update tm proto files Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Aleksandr Bezobchuk <aleks.bezobchuk@gmail.com> Co-authored-by: Cory Levinson <cjlevinson@gmail.com> Co-authored-by: Federico Kunze <federico.kunze94@gmail.com>
109 lines
1.8 KiB
Go
109 lines
1.8 KiB
Go
package cachekv
|
|
|
|
import (
|
|
"container/list"
|
|
"errors"
|
|
|
|
dbm "github.com/tendermint/tm-db"
|
|
|
|
"github.com/cosmos/cosmos-sdk/types/kv"
|
|
)
|
|
|
|
// Iterates over iterKVCache items.
|
|
// if key is nil, means it was deleted.
|
|
// Implements Iterator.
|
|
type memIterator struct {
|
|
start, end []byte
|
|
items []*kv.Pair
|
|
ascending bool
|
|
}
|
|
|
|
func newMemIterator(start, end []byte, items *list.List, ascending bool) *memIterator {
|
|
itemsInDomain := make([]*kv.Pair, 0)
|
|
|
|
var entered bool
|
|
|
|
for e := items.Front(); e != nil; e = e.Next() {
|
|
item := e.Value.(*kv.Pair)
|
|
if !dbm.IsKeyInDomain(item.Key, start, end) {
|
|
if entered {
|
|
break
|
|
}
|
|
|
|
continue
|
|
}
|
|
|
|
itemsInDomain = append(itemsInDomain, item)
|
|
entered = true
|
|
}
|
|
|
|
return &memIterator{
|
|
start: start,
|
|
end: end,
|
|
items: itemsInDomain,
|
|
ascending: ascending,
|
|
}
|
|
}
|
|
|
|
func (mi *memIterator) Domain() ([]byte, []byte) {
|
|
return mi.start, mi.end
|
|
}
|
|
|
|
func (mi *memIterator) Valid() bool {
|
|
return len(mi.items) > 0
|
|
}
|
|
|
|
func (mi *memIterator) assertValid() {
|
|
if err := mi.Error(); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func (mi *memIterator) Next() {
|
|
mi.assertValid()
|
|
|
|
if mi.ascending {
|
|
mi.items = mi.items[1:]
|
|
} else {
|
|
mi.items = mi.items[:len(mi.items)-1]
|
|
}
|
|
}
|
|
|
|
func (mi *memIterator) Key() []byte {
|
|
mi.assertValid()
|
|
|
|
if mi.ascending {
|
|
return mi.items[0].Key
|
|
}
|
|
|
|
return mi.items[len(mi.items)-1].Key
|
|
}
|
|
|
|
func (mi *memIterator) Value() []byte {
|
|
mi.assertValid()
|
|
|
|
if mi.ascending {
|
|
return mi.items[0].Value
|
|
}
|
|
|
|
return mi.items[len(mi.items)-1].Value
|
|
}
|
|
|
|
func (mi *memIterator) Close() error {
|
|
mi.start = nil
|
|
mi.end = nil
|
|
mi.items = nil
|
|
|
|
return nil
|
|
}
|
|
|
|
// Error returns an error if the memIterator is invalid defined by the Valid
|
|
// method.
|
|
func (mi *memIterator) Error() error {
|
|
if !mi.Valid() {
|
|
return errors.New("invalid memIterator")
|
|
}
|
|
|
|
return nil
|
|
}
|