lotus/chain/deals/state_store.go

109 lines
2.1 KiB
Go
Raw Normal View History

2019-08-06 22:04:21 +00:00
package deals
import (
"github.com/ipfs/go-cid"
"github.com/ipfs/go-datastore"
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
)
type StateStore struct {
ds datastore.Datastore
}
func (st *StateStore) Begin(i cid.Cid, state interface{}) error {
2019-08-06 22:04:21 +00:00
k := datastore.NewKey(i.String())
has, err := st.ds.Has(k)
if err != nil {
return err
}
if has {
2019-08-06 23:17:41 +00:00
// TODO: uncomment after deals work
//return xerrors.Errorf("Already tracking state for %s", i)
2019-08-06 22:04:21 +00:00
}
b, err := cbor.DumpObject(state)
2019-08-06 22:04:21 +00:00
if err != nil {
return err
}
return st.ds.Put(k, b)
}
func (st *StateStore) End(i cid.Cid) error {
k := datastore.NewKey(i.String())
has, err := st.ds.Has(k)
if err != nil {
return err
}
if !has {
return xerrors.Errorf("No state for %s", i)
}
return st.ds.Delete(k)
}
// When this gets used anywhere else, migrate to reflect
func (st *StateStore) MutateMiner(i cid.Cid, mutator func(*MinerDeal) error) error {
2019-08-06 22:04:21 +00:00
return st.mutate(i, minerMutator(mutator))
}
func minerMutator(m func(*MinerDeal) error) func([]byte) ([]byte, error) {
2019-08-06 22:04:21 +00:00
return func(in []byte) ([]byte, error) {
var deal MinerDeal
err := cbor.DecodeInto(in, &deal)
2019-08-06 22:04:21 +00:00
if err != nil {
return nil, err
}
if err := m(&deal); err != nil {
2019-08-06 22:04:21 +00:00
return nil, err
}
return cbor.DumpObject(deal)
2019-08-06 22:04:21 +00:00
}
}
func (st *StateStore) MutateClient(i cid.Cid, mutator func(*ClientDeal) error) error {
2019-08-06 22:04:21 +00:00
return st.mutate(i, clientMutator(mutator))
}
func clientMutator(m func(*ClientDeal) error) func([]byte) ([]byte, error) {
2019-08-06 22:04:21 +00:00
return func(in []byte) ([]byte, error) {
var deal ClientDeal
err := cbor.DecodeInto(in, &deal)
2019-08-06 22:04:21 +00:00
if err != nil {
return nil, err
}
if err := m(&deal); err != nil {
2019-08-06 22:04:21 +00:00
return nil, err
}
return cbor.DumpObject(deal)
2019-08-06 22:04:21 +00:00
}
}
func (st *StateStore) mutate(i cid.Cid, mutator func([]byte) ([]byte, error)) error {
k := datastore.NewKey(i.String())
has, err := st.ds.Has(k)
if err != nil {
return err
}
if !has {
return xerrors.Errorf("No state for %s", i)
}
cur, err := st.ds.Get(k)
if err != nil {
return err
}
mutated, err := mutator(cur)
if err != nil {
return err
}
return st.ds.Put(k, mutated)
}