github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/store/cachemulti/store.go (about) 1 package cachemulti 2 3 import ( 4 "github.com/gnolang/gno/tm2/pkg/store/types" 5 ) 6 7 //---------------------------------------- 8 // Store 9 10 // Store holds many cache-wrapped stores. 11 // Implements MultiStore. 12 // NOTE: a Store (and MultiStores in general) should never expose the 13 // keys for the substores. 14 type Store struct { 15 stores map[types.StoreKey]types.Store 16 keys map[string]types.StoreKey 17 } 18 19 var _ types.MultiStore = Store{} 20 21 func NewFromStores( 22 stores map[types.StoreKey]types.Store, 23 keys map[string]types.StoreKey, 24 ) Store { 25 cms := Store{ 26 stores: make(map[types.StoreKey]types.Store, len(stores)), 27 keys: keys, 28 } 29 30 for key, store := range stores { 31 cms.stores[key] = store.CacheWrap() 32 } 33 34 return cms 35 } 36 37 func New( 38 stores map[types.StoreKey]types.Store, 39 keys map[string]types.StoreKey, 40 ) Store { 41 return NewFromStores(stores, keys) 42 } 43 44 func newStoreFromCMS(cms Store) Store { 45 stores := make(map[types.StoreKey]types.Store) 46 for k, v := range cms.stores { 47 stores[k] = v 48 } 49 return NewFromStores(stores, nil) 50 } 51 52 // MultiWrite calls Write on each underlying store. 53 func (cms Store) MultiWrite() { 54 for _, store := range cms.stores { 55 store.Write() 56 } 57 } 58 59 // Implements MultiStore. 60 func (cms Store) MultiCacheWrap() types.MultiStore { 61 return newStoreFromCMS(cms) 62 } 63 64 // GetStore returns an underlying Store by key. 65 func (cms Store) GetStore(key types.StoreKey) types.Store { 66 return cms.stores[key].(types.Store) 67 }