github.com/lino-network/lino@v0.6.11/utils/importexport.go (about)

     1  package utils
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  
     8  	"github.com/cosmos/cosmos-sdk/codec"
     9  	sdk "github.com/cosmos/cosmos-sdk/types"
    10  )
    11  
    12  // Load import and unmarshal by cdc json unmarshal.
    13  func Load(filepath string, cdc *codec.Codec, factory func() interface{}) (interface{}, error) {
    14  	f, err := os.Open(filepath)
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  	defer f.Close()
    19  	bytes, err := ioutil.ReadAll(f)
    20  	if err != nil {
    21  		return nil, err
    22  	}
    23  
    24  	table := factory()
    25  	err = cdc.UnmarshalJSON(bytes, table)
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  	return table, nil
    30  }
    31  
    32  // Save save the state to file, using codec json marshal.
    33  func Save(filepath string, cdc *codec.Codec, state interface{}) error {
    34  	f, err := os.Create(filepath)
    35  	if err != nil {
    36  		return err
    37  	}
    38  	defer f.Close()
    39  	jsonbytes, err := cdc.MarshalJSON(state)
    40  	if err != nil {
    41  		return fmt.Errorf("failed to marshal json: %s", err)
    42  	}
    43  	_, err = f.Write(jsonbytes)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	err = f.Sync()
    48  	if err != nil {
    49  		return err
    50  	}
    51  	return nil
    52  }
    53  
    54  type ValueReactor = func(key []byte, val interface{}) bool
    55  type ValueCreator = func() interface{}
    56  type Unmarshaler = func(bz []byte, rst interface{})
    57  
    58  type SubStore struct {
    59  	Store      sdk.KVStore
    60  	Prefix     []byte
    61  	ValCreator ValueCreator
    62  	Decoder    Unmarshaler
    63  	NoValue    bool
    64  }
    65  
    66  func (s SubStore) Iterate(reactor ValueReactor) {
    67  	itr := sdk.KVStorePrefixIterator(s.Store, s.Prefix)
    68  	defer itr.Close()
    69  	for ; itr.Valid(); itr.Next() {
    70  		k := itr.Key()[len(s.Prefix):]
    71  		v := itr.Value()
    72  		var rst interface{}
    73  		if s.ValCreator != nil {
    74  			rst = s.ValCreator()
    75  		}
    76  		if !s.NoValue {
    77  			s.Decoder(v, rst)
    78  		}
    79  		if reactor(k, rst) {
    80  			break
    81  		}
    82  	}
    83  }
    84  
    85  type StoreMap map[string]SubStore
    86  
    87  func NewStoreMap(ss []SubStore) StoreMap {
    88  	rst := make(StoreMap)
    89  	for _, v := range ss {
    90  		rst[string(v.Prefix)] = v
    91  	}
    92  	return rst
    93  }