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 }