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  }