github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/state/names.go (about) 1 package state 2 3 import ( 4 "fmt" 5 6 "github.com/hyperledger/burrow/storage" 7 8 "github.com/hyperledger/burrow/encoding" 9 "github.com/hyperledger/burrow/execution/names" 10 ) 11 12 var _ names.IterableReader = &State{} 13 14 func (s *ImmutableState) GetName(name string) (*names.Entry, error) { 15 tree, err := s.Forest.Reader(keys.Name.Prefix()) 16 if err != nil { 17 return nil, err 18 } 19 entryBytes, err := tree.Get(keys.Name.KeyNoPrefix(name)) 20 if err != nil { 21 return nil, err 22 } else if entryBytes == nil { 23 return nil, nil 24 } 25 26 entry := new(names.Entry) 27 return entry, encoding.Decode(entryBytes, entry) 28 } 29 30 func (ws *writeState) UpdateName(entry *names.Entry) error { 31 return ws.forest.Write(keys.Name.Prefix(), func(tree *storage.RWTree) error { 32 bs, err := encoding.Encode(entry) 33 if err != nil { 34 return err 35 } 36 tree.Set(keys.Name.KeyNoPrefix(entry.Name), bs) 37 return nil 38 }) 39 } 40 41 func (ws *writeState) RemoveName(name string) error { 42 return ws.forest.Write(keys.Name.Prefix(), func(tree *storage.RWTree) error { 43 tree.Delete(keys.Name.KeyNoPrefix(name)) 44 return nil 45 }) 46 } 47 48 func (s *ImmutableState) IterateNames(consumer func(*names.Entry) error) error { 49 tree, err := s.Forest.Reader(keys.Name.Prefix()) 50 if err != nil { 51 return err 52 } 53 return tree.Iterate(nil, nil, true, func(key []byte, value []byte) error { 54 entry := new(names.Entry) 55 err := encoding.Decode(value, entry) 56 if err != nil { 57 return fmt.Errorf("State.IterateNames() could not iterate over names: %v", err) 58 } 59 return consumer(entry) 60 }) 61 }