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  }