github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/store/iavl/tree.go (about) 1 package iavl 2 3 import ( 4 "fmt" 5 6 "github.com/fibonacci-chain/fbc/libs/iavl" 7 ) 8 9 var ( 10 _ Tree = (*immutableTree)(nil) 11 _ Tree = (*iavl.MutableTree)(nil) 12 ) 13 14 type ( 15 // Tree defines an interface that both mutable and immutable IAVL trees 16 // must implement. For mutable IAVL trees, the interface is directly 17 // implemented by an iavl.MutableTree. For an immutable IAVL tree, a wrapper 18 // must be made. 19 Tree interface { 20 Has(key []byte) bool 21 Get(key []byte) (value []byte) 22 Set(key, value []byte) bool 23 Remove(key []byte) ([]byte, bool) 24 PreChanges(keys []string, setOrDel []byte) 25 SaveVersion(bool) ([]byte, int64, iavl.TreeDelta, error) 26 GetModuleName() string 27 GetDBWriteCount() int 28 GetDBReadCount() int 29 GetDBReadTime() int 30 GetNodeReadCount() int 31 ResetCount() 32 DeleteVersion(version int64) error 33 DeleteVersions(versions ...int64) error 34 Version() int64 35 Hash() []byte 36 VersionExists(version int64) bool 37 GetVersioned(key []byte, version int64) (int64, []byte) 38 GetVersionedWithProof(key []byte, version int64) ([]byte, *iavl.RangeProof, error) 39 GetImmutable(version int64) (*iavl.ImmutableTree, error) 40 SetInitialVersion(version uint64) 41 SetDelta(delta *iavl.TreeDelta) 42 GetPersistedRoots() map[int64][]byte 43 SetUpgradeVersion(int64) 44 } 45 46 // immutableTree is a simple wrapper around a reference to an iavl.ImmutableTree 47 // that implements the Tree interface. It should only be used for querying 48 // and iteration, specifically at previous heights. 49 immutableTree struct { 50 *iavl.ImmutableTree 51 } 52 ) 53 54 func (it *immutableTree) Set(_, _ []byte) bool { 55 panic("cannot call 'Set' on an immutable IAVL tree") 56 } 57 58 func (it *immutableTree) Remove(_ []byte) ([]byte, bool) { 59 panic("cannot call 'Remove' on an immutable IAVL tree") 60 } 61 62 func (it *immutableTree) PreChanges(keys []string, setOrDel []byte) {} 63 64 func (it *immutableTree) SaveVersion(bool) ([]byte, int64, iavl.TreeDelta, error) { 65 panic("cannot call 'SaveVersion' on an immutable IAVL tree") 66 } 67 68 func (it *immutableTree) DeleteVersion(_ int64) error { 69 panic("cannot call 'DeleteVersion' on an immutable IAVL tree") 70 } 71 72 func (it *immutableTree) DeleteVersions(_ ...int64) error { 73 panic("cannot call 'DeleteVersions' on an immutable IAVL tree") 74 } 75 76 func (it *immutableTree) VersionExists(version int64) bool { 77 return it.Version() == version 78 } 79 80 func (it *immutableTree) GetVersioned(key []byte, version int64) (int64, []byte) { 81 if it.Version() != version { 82 return -1, nil 83 } 84 85 return it.GetWithIndex(key) 86 } 87 88 func (it *immutableTree) GetVersionedWithProof(key []byte, version int64) ([]byte, *iavl.RangeProof, error) { 89 if it.Version() != version { 90 return nil, nil, fmt.Errorf("version mismatch on immutable IAVL tree; got: %d, expected: %d", version, it.Version()) 91 } 92 93 return it.GetWithProof(key) 94 } 95 96 func (it *immutableTree) GetImmutable(version int64) (*iavl.ImmutableTree, error) { 97 if it.Version() != version { 98 return nil, fmt.Errorf("version mismatch on immutable IAVL tree; got: %d, expected: %d", version, it.Version()) 99 } 100 101 return it.ImmutableTree, nil 102 } 103 104 func (it *immutableTree) SetInitialVersion(_ uint64) { 105 panic("cannot call 'SetInitialVersion' on an immutable IAVL tree") 106 } 107 108 func (it *immutableTree) SetDelta(delta *iavl.TreeDelta) { 109 panic("cannot call 'SetDelta' on an immutable IAVL tree") 110 } 111 112 func (it *immutableTree) GetModuleName() string { 113 return "" 114 } 115 116 func (it *immutableTree) GetDBWriteCount() int { 117 return 0 118 } 119 120 func (it *immutableTree) GetDBReadCount() int { 121 return 0 122 } 123 124 func (it *immutableTree) GetDBReadTime() int { 125 return 0 126 } 127 128 func (it *immutableTree) GetNodeReadCount() int { return 0 } 129 130 func (it *immutableTree) ResetCount() { 131 132 }