Skip to content

Commit

Permalink
GasKVStore WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
cwgoes committed May 15, 2018
1 parent ca4ef9a commit c410ceb
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 0 deletions.
80 changes: 80 additions & 0 deletions store/gaskvstore.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package store

import (
sdk "github.com/cosmos/cosmos-sdk/types"
)

// gasKVStore applies gas tracking to an underlying kvstore
type gasKVStore struct {
gasMeter sdk.GasMeter
parent KVStore
}

// nolint
func NewGasKVStore(gasMeter sdk.GasMeter, parent KVStore) *gasKVStore {
kvs := &gasKVStore{
gasMeter: gasMeter,
parent: parent,
}
return kvs
}

// Implements Store.
func (gi *gasKVStore) GetStoreType() StoreType {
return gi.parent.GetStoreType()
}

// Implements KVStore.
func (gi *gasKVStore) Get(key []byte) (value []byte) {
return gi.parent.Get(key)
}

// Implements KVStore.
func (gi *gasKVStore) Set(key []byte, value []byte) {
gi.parent.Set(key, value)
}

// Implements KVStore.
func (gi *gasKVStore) Has(key []byte) bool {
return gi.parent.Has(key)
}

// Implements KVStore.
func (gi *gasKVStore) Delete(key []byte) {
gi.parent.Delete(key)
}

// Implements KVStore.
func (gi *gasKVStore) Iterator(start, end []byte) Iterator {
return gi.iterator(start, end, true)
}

// Implements KVStore.
func (gi *gasKVStore) ReverseIterator(start, end []byte) Iterator {
return gi.iterator(start, end, false)
}

// Implements KVStore.
func (gi *gasKVStore) SubspaceIterator(prefix []byte) Iterator {
return gi.iterator(prefix, sdk.PrefixEndBytes(prefix), true)
}

// Implements KVStore.
func (gi *gasKVStore) ReverseSubspaceIterator(prefix []byte) Iterator {
return gi.iterator(prefix, sdk.PrefixEndBytes(prefix), false)
}

// Implements KVStore.
func (gi *gasKVStore) CacheWrap() CacheWrap {
return gi.parent.CacheWrap() // TODO
}

func (gi *gasKVStore) iterator(start, end []byte, ascending bool) Iterator {
var parent Iterator
if ascending {
parent = gi.parent.Iterator(start, end)
} else {
parent = gi.parent.ReverseIterator(start, end)
}
return parent // TODO
}
27 changes: 27 additions & 0 deletions store/gaskvstore_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package store

import (
"testing"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
dbm "github.com/tendermint/tmlibs/db"
)

func newGasKVStore() KVStore {
meter := sdk.NewGasMeter(1000)
mem := dbStoreAdapter{dbm.NewMemDB()}
return NewGasKVStore(meter, mem)
}

func TestGasKVStore(t *testing.T) {
mem := dbStoreAdapter{dbm.NewMemDB()}
meter := sdk.NewGasMeter(1000)
st := NewGasKVStore(meter, mem)

require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty")

mem.Set(keyFmt(1), valFmt(1))
st.Set(keyFmt(1), valFmt(1))
require.Equal(t, valFmt(1), st.Get(keyFmt(1)))
}

0 comments on commit c410ceb

Please sign in to comment.