/
storage.go
154 lines (140 loc) · 4.51 KB
/
storage.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package model
import (
wire "github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/lino-network/lino/types"
)
var (
infraProviderSubstore = []byte{0x00}
infraProviderListSubstore = []byte{0x01}
)
// InfraProviderStorage - infra provider storage
type InfraProviderStorage struct {
key sdk.StoreKey
cdc *wire.Codec
}
// NewInfraProviderStorage - create a new infra provider storage
func NewInfraProviderStorage(key sdk.StoreKey) InfraProviderStorage {
cdc := wire.New()
wire.RegisterCrypto(cdc)
return InfraProviderStorage{
key: key,
cdc: cdc,
}
}
// InitGenesis - initialize infra provider manager
func (is InfraProviderStorage) InitGenesis(ctx sdk.Context) error {
if err := is.SetInfraProviderList(ctx, &InfraProviderList{}); err != nil {
return err
}
return nil
}
// DoesInfraProviderExist - check infra provider exists in KVStore or not
func (is InfraProviderStorage) DoesInfraProviderExist(ctx sdk.Context, accKey types.AccountKey) bool {
store := ctx.KVStore(is.key)
return store.Has(GetInfraProviderKey(accKey))
}
// GetInfraProvider - get infra provider from KVStore
func (is InfraProviderStorage) GetInfraProvider(
ctx sdk.Context, accKey types.AccountKey) (*InfraProvider, sdk.Error) {
store := ctx.KVStore(is.key)
providerByte := store.Get(GetInfraProviderKey(accKey))
if providerByte == nil {
return nil, ErrInfraProviderNotFound()
}
provider := new(InfraProvider)
if err := is.cdc.UnmarshalBinaryLengthPrefixed(providerByte, provider); err != nil {
return nil, ErrFailedToUnmarshalInfraProvider(err)
}
return provider, nil
}
// SetInfraProvider - set infra provider to KVStore
func (is InfraProviderStorage) SetInfraProvider(
ctx sdk.Context, accKey types.AccountKey, infraProvider *InfraProvider) sdk.Error {
store := ctx.KVStore(is.key)
InfraProviderByte, err := is.cdc.MarshalBinaryLengthPrefixed(*infraProvider)
if err != nil {
return ErrFailedToMarshalInfraProvider(err)
}
store.Set(GetInfraProviderKey(accKey), InfraProviderByte)
return nil
}
// GetInfraProviderList - get infra provider list from KVStore
func (is InfraProviderStorage) GetInfraProviderList(ctx sdk.Context) (*InfraProviderList, sdk.Error) {
store := ctx.KVStore(is.key)
listByte := store.Get(GetInfraProviderListKey())
if listByte == nil {
return nil, ErrInfraProviderListNotFound()
}
lst := new(InfraProviderList)
if err := is.cdc.UnmarshalBinaryLengthPrefixed(listByte, lst); err != nil {
return nil, ErrFailedToUnmarshalInfraProviderList(err)
}
return lst, nil
}
// SetInfraProviderList - set infra provider list to KVStore
func (is InfraProviderStorage) SetInfraProviderList(ctx sdk.Context, lst *InfraProviderList) sdk.Error {
store := ctx.KVStore(is.key)
listByte, err := is.cdc.MarshalBinaryLengthPrefixed(*lst)
if err != nil {
return ErrFailedToMarshalInfraProviderList(err)
}
store.Set(GetInfraProviderListKey(), listByte)
return nil
}
// Export - infra state
func (is InfraProviderStorage) Export(ctx sdk.Context) *InfraTables {
tables := &InfraTables{}
store := ctx.KVStore(is.key)
// export table.providers
func() {
itr := sdk.KVStorePrefixIterator(store, infraProviderSubstore)
defer itr.Close()
for ; itr.Valid(); itr.Next() {
k := itr.Key()
username := types.AccountKey(k[1:])
provider, err := is.GetInfraProvider(ctx, username)
if err != nil {
panic("failed to read developer: " + err.Error())
}
row := InfraProviderRow{
App: username,
Provider: *provider,
}
tables.InfraProviders = append(tables.InfraProviders, row)
}
}()
// export table.DeveloperList
list, err := is.GetInfraProviderList(ctx)
if err != nil {
panic("failed to get developer list: " + err.Error())
}
tables.InfraProviderList = InfraProviderListRow{
List: *list,
}
return tables
}
// Import from tablesIR.
func (is InfraProviderStorage) Import(ctx sdk.Context, tb *InfraTablesIR) {
check := func(e error) {
if e != nil {
panic("[is] Failed to import: " + e.Error())
}
}
// import table.Providers
for _, v := range tb.InfraProviders {
err := is.SetInfraProvider(ctx, v.App, &v.Provider)
check(err)
}
// import ProviderList
err := is.SetInfraProviderList(ctx, &tb.InfraProviderList.List)
check(err)
}
// GetInfraProviderKey - get infra provider key in infra provider substore
func GetInfraProviderKey(accKey types.AccountKey) []byte {
return append(infraProviderSubstore, accKey...)
}
// GetInfraProviderListKey - get infra provider list key in infra provider list substore
func GetInfraProviderListKey() []byte {
return infraProviderListSubstore
}