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 }