153 lines
3.0 KiB
Go
153 lines
3.0 KiB
Go
package store
|
|
|
|
import (
|
|
"io"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
)
|
|
|
|
var _ KVStore = prefixStore{}
|
|
|
|
type prefixStore struct {
|
|
parent KVStore
|
|
prefix []byte
|
|
}
|
|
|
|
func clone(bz []byte) (res []byte) {
|
|
res = make([]byte, len(bz))
|
|
copy(res, bz)
|
|
return
|
|
}
|
|
|
|
func (s prefixStore) key(key []byte) (res []byte) {
|
|
res = clone(s.prefix)
|
|
res = append(res, key...)
|
|
return
|
|
}
|
|
|
|
// Implements Store
|
|
func (s prefixStore) GetStoreType() StoreType {
|
|
return s.parent.GetStoreType()
|
|
}
|
|
|
|
// Implements CacheWrap
|
|
func (s prefixStore) CacheWrap() CacheWrap {
|
|
return NewCacheKVStore(s)
|
|
}
|
|
|
|
// CacheWrapWithTrace implements the KVStore interface.
|
|
func (s prefixStore) CacheWrapWithTrace(w io.Writer, tc TraceContext) CacheWrap {
|
|
return NewCacheKVStore(NewTraceKVStore(s, w, tc))
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) Get(key []byte) []byte {
|
|
res := s.parent.Get(s.key(key))
|
|
return res
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) Has(key []byte) bool {
|
|
return s.parent.Has(s.key(key))
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) Set(key, value []byte) {
|
|
s.parent.Set(s.key(key), value)
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) Delete(key []byte) {
|
|
s.parent.Delete(s.key(key))
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) Prefix(prefix []byte) KVStore {
|
|
return prefixStore{s, prefix}
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) Gas(meter GasMeter, config GasConfig) KVStore {
|
|
return NewGasKVStore(meter, config, s)
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) Iterator(start, end []byte) Iterator {
|
|
newstart := clone(s.prefix)
|
|
newstart = append(newstart, start...)
|
|
|
|
var newend []byte
|
|
if end == nil {
|
|
newend = sdk.PrefixEndBytes(s.prefix)
|
|
} else {
|
|
newend = clone(s.prefix)
|
|
newend = append(newend, end...)
|
|
}
|
|
|
|
return prefixIterator{
|
|
prefix: s.prefix,
|
|
iter: s.parent.Iterator(newstart, newend),
|
|
}
|
|
}
|
|
|
|
// Implements KVStore
|
|
func (s prefixStore) ReverseIterator(start, end []byte) Iterator {
|
|
newstart := make([]byte, len(s.prefix), len(start))
|
|
copy(newstart, s.prefix)
|
|
newstart = append(newstart, start...)
|
|
|
|
newend := make([]byte, len(s.prefix)+len(end))
|
|
if end == nil {
|
|
newend = sdk.PrefixEndBytes(s.prefix)
|
|
} else {
|
|
copy(newend, s.prefix)
|
|
newend = append(newend, end...)
|
|
}
|
|
|
|
return prefixIterator{
|
|
prefix: s.prefix,
|
|
iter: s.parent.ReverseIterator(newstart, newend),
|
|
}
|
|
}
|
|
|
|
type prefixIterator struct {
|
|
prefix []byte
|
|
|
|
iter Iterator
|
|
}
|
|
|
|
// Implements Iterator
|
|
func (iter prefixIterator) Domain() (start []byte, end []byte) {
|
|
start, end = iter.iter.Domain()
|
|
start = start[len(iter.prefix):]
|
|
end = end[len(iter.prefix):]
|
|
return
|
|
}
|
|
|
|
// Implements Iterator
|
|
func (iter prefixIterator) Valid() bool {
|
|
return iter.iter.Valid()
|
|
}
|
|
|
|
// Implements Iterator
|
|
func (iter prefixIterator) Next() {
|
|
iter.iter.Next()
|
|
}
|
|
|
|
// Implements Iterator
|
|
func (iter prefixIterator) Key() (key []byte) {
|
|
key = iter.iter.Key()
|
|
key = key[len(iter.prefix):]
|
|
return
|
|
}
|
|
|
|
// Implements Iterator
|
|
func (iter prefixIterator) Value() []byte {
|
|
return iter.iter.Value()
|
|
}
|
|
|
|
// Implements Iterator
|
|
func (iter prefixIterator) Close() {
|
|
iter.iter.Close()
|
|
}
|