github.com/renegr87/renegr87@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/statedb/stateleveldb/value_encoding.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package stateleveldb
     8  
     9  import (
    10  	proto "github.com/golang/protobuf/proto"
    11  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb"
    12  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb/stateleveldb/msgs"
    13  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version"
    14  )
    15  
    16  // encodeValue encodes the value, version, and metadata
    17  func encodeValue(v *statedb.VersionedValue) ([]byte, error) {
    18  	return proto.Marshal(
    19  		&msgs.VersionedValueProto{
    20  			VersionBytes: v.Version.ToBytes(),
    21  			Value:        v.Value,
    22  			Metadata:     v.Metadata,
    23  		},
    24  	)
    25  }
    26  
    27  // decodeValue decodes the statedb value bytes
    28  func decodeValue(encodedValue []byte) (*statedb.VersionedValue, error) {
    29  	msg := &msgs.VersionedValueProto{}
    30  	err := proto.Unmarshal(encodedValue, msg)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  	ver, _, err := version.NewHeightFromBytes(msg.VersionBytes)
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  	val := msg.Value
    39  	metadata := msg.Metadata
    40  	// protobuf always makes an empty byte array as nil
    41  	if val == nil {
    42  		val = []byte{}
    43  	}
    44  	return &statedb.VersionedValue{Version: ver, Value: val, Metadata: metadata}, nil
    45  }