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 }