github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/input/transactions.go (about) 1 package input 2 3 import ( 4 "context" 5 "io" 6 7 "github.com/stellar/stellar-etl/internal/utils" 8 9 "github.com/stellar/go/ingest" 10 "github.com/stellar/go/ingest/ledgerbackend" 11 "github.com/stellar/go/support/errors" 12 "github.com/stellar/go/xdr" 13 ) 14 15 // LedgerTransformInput is a representation of the input for the TransformTransaction function 16 type LedgerTransformInput struct { 17 Transaction ingest.LedgerTransaction 18 LedgerHistory xdr.LedgerHeaderHistoryEntry 19 LedgerCloseMeta xdr.LedgerCloseMeta 20 } 21 22 // GetTransactions returns a slice of transactions for the ledgers in the provided range (inclusive on both ends) 23 func GetTransactions(start, end uint32, limit int64, env utils.EnvironmentDetails) ([]LedgerTransformInput, error) { 24 ctx := context.Background() 25 26 backend, err := env.CreateCaptiveCoreBackend() 27 28 if err != nil { 29 return []LedgerTransformInput{}, err 30 } 31 32 txSlice := []LedgerTransformInput{} 33 err = backend.PrepareRange(ctx, ledgerbackend.BoundedRange(start, end)) 34 panicIf(err) 35 for seq := start; seq <= end; seq++ { 36 ledgerCloseMeta, err := backend.GetLedger(ctx, seq) 37 if err != nil { 38 return nil, errors.Wrap(err, "error getting ledger from the backend") 39 } 40 41 txReader, err := ingest.NewLedgerTransactionReaderFromLedgerCloseMeta(env.NetworkPassphrase, ledgerCloseMeta) 42 if err != nil { 43 return []LedgerTransformInput{}, err 44 } 45 46 lhe := txReader.GetHeader() 47 48 // A negative limit value means that all input should be processed 49 for int64(len(txSlice)) < limit || limit < 0 { 50 tx, err := txReader.Read() 51 if err == io.EOF { 52 break 53 } 54 55 txSlice = append(txSlice, LedgerTransformInput{ 56 Transaction: tx, 57 LedgerHistory: lhe, 58 LedgerCloseMeta: ledgerCloseMeta, 59 }) 60 } 61 62 txReader.Close() 63 if int64(len(txSlice)) >= limit && limit >= 0 { 64 break 65 } 66 } 67 68 return txSlice, nil 69 }