github.com/eris-ltd/erisdb@v0.25.0/storage/mutable_tree.go (about)

     1  package storage
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/tendermint/iavl"
     7  	dbm "github.com/tendermint/tendermint/libs/db"
     8  )
     9  
    10  type MutableTree struct {
    11  	*iavl.MutableTree
    12  }
    13  
    14  func NewMutableTree(db dbm.DB, cacheSize int) *MutableTree {
    15  	tree := iavl.NewMutableTree(db, cacheSize)
    16  	return &MutableTree{
    17  		MutableTree: tree,
    18  	}
    19  }
    20  
    21  func (mut *MutableTree) Load(version int64, overwriting bool) error {
    22  	if version <= 0 {
    23  		return fmt.Errorf("trying to load MutableTree from non-positive version: version %d", version)
    24  	}
    25  	var err error
    26  	var treeVersion int64
    27  	if overwriting {
    28  		// Deletes all version above version!
    29  		treeVersion, err = mut.MutableTree.LoadVersionForOverwriting(version)
    30  	} else {
    31  		treeVersion, err = mut.MutableTree.LoadVersion(version)
    32  	}
    33  	if err != nil {
    34  		return fmt.Errorf("could not load current version of MutableTree (version %d): %v", version, err)
    35  	}
    36  	if treeVersion != version {
    37  		return fmt.Errorf("tried to load version %d of MutableTree, but got version %d", version, treeVersion)
    38  	}
    39  	return nil
    40  }
    41  
    42  func (mut *MutableTree) Get(key []byte) []byte {
    43  	_, bs := mut.MutableTree.Get(key)
    44  	return bs
    45  }
    46  
    47  func (mut *MutableTree) GetImmutable(version int64) (*ImmutableTree, error) {
    48  	tree, err := mut.MutableTree.GetImmutable(version)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  	return &ImmutableTree{tree}, nil
    53  }
    54  
    55  // Get the current working tree as an ImmutableTree (for the methods - not immutable!)
    56  func (mut *MutableTree) asImmutable() *ImmutableTree {
    57  	return &ImmutableTree{mut.MutableTree.ImmutableTree}
    58  }
    59  
    60  func (mut *MutableTree) Iterate(start, end []byte, ascending bool, fn func(key []byte, value []byte) error) error {
    61  	return mut.asImmutable().Iterate(start, end, ascending, fn)
    62  }
    63  
    64  func (mut *MutableTree) IterateWriteTree(start, end []byte, ascending bool, fn func(key []byte, value []byte) error) error {
    65  	var err error
    66  	mut.MutableTree.IterateRange(start, end, ascending, func(key, value []byte) bool {
    67  		err = fn(key, value)
    68  		if err != nil {
    69  			// stop
    70  			return true
    71  		}
    72  		return false
    73  	})
    74  	return err
    75  }