github.com/onflow/flow-go@v0.33.17/storage/badger/operation/transaction_results.go (about)

     1  // (c) 2019 Dapper Labs - ALL RIGHTS RESERVED
     2  
     3  package operation
     4  
     5  import (
     6  	"fmt"
     7  
     8  	"github.com/dgraph-io/badger/v2"
     9  
    10  	"github.com/onflow/flow-go/model/flow"
    11  )
    12  
    13  func InsertTransactionResult(blockID flow.Identifier, transactionResult *flow.TransactionResult) func(*badger.Txn) error {
    14  	return insert(makePrefix(codeTransactionResult, blockID, transactionResult.TransactionID), transactionResult)
    15  }
    16  
    17  func BatchInsertTransactionResult(blockID flow.Identifier, transactionResult *flow.TransactionResult) func(batch *badger.WriteBatch) error {
    18  	return batchWrite(makePrefix(codeTransactionResult, blockID, transactionResult.TransactionID), transactionResult)
    19  }
    20  
    21  func BatchIndexTransactionResult(blockID flow.Identifier, txIndex uint32, transactionResult *flow.TransactionResult) func(batch *badger.WriteBatch) error {
    22  	return batchWrite(makePrefix(codeTransactionResultIndex, blockID, txIndex), transactionResult)
    23  }
    24  
    25  func RetrieveTransactionResult(blockID flow.Identifier, transactionID flow.Identifier, transactionResult *flow.TransactionResult) func(*badger.Txn) error {
    26  	return retrieve(makePrefix(codeTransactionResult, blockID, transactionID), transactionResult)
    27  }
    28  func RetrieveTransactionResultByIndex(blockID flow.Identifier, txIndex uint32, transactionResult *flow.TransactionResult) func(*badger.Txn) error {
    29  	return retrieve(makePrefix(codeTransactionResultIndex, blockID, txIndex), transactionResult)
    30  }
    31  
    32  // LookupTransactionResultsByBlockIDUsingIndex retrieves all tx results for a block, by using
    33  // tx_index index. This correctly handles cases of duplicate transactions within block.
    34  func LookupTransactionResultsByBlockIDUsingIndex(blockID flow.Identifier, txResults *[]flow.TransactionResult) func(*badger.Txn) error {
    35  
    36  	txErrIterFunc := func() (checkFunc, createFunc, handleFunc) {
    37  		check := func(_ []byte) bool {
    38  			return true
    39  		}
    40  		var val flow.TransactionResult
    41  		create := func() interface{} {
    42  			return &val
    43  		}
    44  		handle := func() error {
    45  			*txResults = append(*txResults, val)
    46  			return nil
    47  		}
    48  		return check, create, handle
    49  	}
    50  
    51  	return traverse(makePrefix(codeTransactionResultIndex, blockID), txErrIterFunc)
    52  }
    53  
    54  // RemoveTransactionResultsByBlockID removes the transaction results for the given blockID
    55  func RemoveTransactionResultsByBlockID(blockID flow.Identifier) func(*badger.Txn) error {
    56  	return func(txn *badger.Txn) error {
    57  
    58  		prefix := makePrefix(codeTransactionResult, blockID)
    59  		err := removeByPrefix(prefix)(txn)
    60  		if err != nil {
    61  			return fmt.Errorf("could not remove transaction results for block %v: %w", blockID, err)
    62  		}
    63  
    64  		return nil
    65  	}
    66  }
    67  
    68  // BatchRemoveTransactionResultsByBlockID removes transaction results for the given blockID in a provided batch.
    69  // No errors are expected during normal operation, but it may return generic error
    70  // if badger fails to process request
    71  func BatchRemoveTransactionResultsByBlockID(blockID flow.Identifier, batch *badger.WriteBatch) func(*badger.Txn) error {
    72  	return func(txn *badger.Txn) error {
    73  
    74  		prefix := makePrefix(codeTransactionResult, blockID)
    75  		err := batchRemoveByPrefix(prefix)(txn, batch)
    76  		if err != nil {
    77  			return fmt.Errorf("could not remove transaction results for block %v: %w", blockID, err)
    78  		}
    79  
    80  		return nil
    81  	}
    82  }
    83  
    84  func InsertLightTransactionResult(blockID flow.Identifier, transactionResult *flow.LightTransactionResult) func(*badger.Txn) error {
    85  	return insert(makePrefix(codeLightTransactionResult, blockID, transactionResult.TransactionID), transactionResult)
    86  }
    87  
    88  func BatchInsertLightTransactionResult(blockID flow.Identifier, transactionResult *flow.LightTransactionResult) func(batch *badger.WriteBatch) error {
    89  	return batchWrite(makePrefix(codeLightTransactionResult, blockID, transactionResult.TransactionID), transactionResult)
    90  }
    91  
    92  func BatchIndexLightTransactionResult(blockID flow.Identifier, txIndex uint32, transactionResult *flow.LightTransactionResult) func(batch *badger.WriteBatch) error {
    93  	return batchWrite(makePrefix(codeLightTransactionResultIndex, blockID, txIndex), transactionResult)
    94  }
    95  
    96  func RetrieveLightTransactionResult(blockID flow.Identifier, transactionID flow.Identifier, transactionResult *flow.LightTransactionResult) func(*badger.Txn) error {
    97  	return retrieve(makePrefix(codeLightTransactionResult, blockID, transactionID), transactionResult)
    98  }
    99  
   100  func RetrieveLightTransactionResultByIndex(blockID flow.Identifier, txIndex uint32, transactionResult *flow.LightTransactionResult) func(*badger.Txn) error {
   101  	return retrieve(makePrefix(codeLightTransactionResultIndex, blockID, txIndex), transactionResult)
   102  }
   103  
   104  // LookupLightTransactionResultsByBlockIDUsingIndex retrieves all tx results for a block, but using
   105  // tx_index index. This correctly handles cases of duplicate transactions within block.
   106  func LookupLightTransactionResultsByBlockIDUsingIndex(blockID flow.Identifier, txResults *[]flow.LightTransactionResult) func(*badger.Txn) error {
   107  
   108  	txErrIterFunc := func() (checkFunc, createFunc, handleFunc) {
   109  		check := func(_ []byte) bool {
   110  			return true
   111  		}
   112  		var val flow.LightTransactionResult
   113  		create := func() interface{} {
   114  			return &val
   115  		}
   116  		handle := func() error {
   117  			*txResults = append(*txResults, val)
   118  			return nil
   119  		}
   120  		return check, create, handle
   121  	}
   122  
   123  	return traverse(makePrefix(codeLightTransactionResultIndex, blockID), txErrIterFunc)
   124  }