github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/cmd/export_contract_data.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 6 "github.com/sirupsen/logrus" 7 "github.com/spf13/cobra" 8 9 "github.com/stellar/stellar-etl/internal/input" 10 "github.com/stellar/stellar-etl/internal/transform" 11 "github.com/stellar/stellar-etl/internal/utils" 12 13 "github.com/stellar/go/xdr" 14 ) 15 16 var dataCmd = &cobra.Command{ 17 Use: "export_contract_data", 18 Short: "Exports the contract data information made from the genesis ledger to a specified endpoint.", 19 Long: `Exports historical contract data from the genesis ledger to the provided end-ledger to an output file. 20 The command reads from the bucket list, which includes the full history of the Stellar ledger. As a result, it 21 should be used in an initial data dump. In order to get offer information within a specified ledger range, see 22 the export_ledger_entry_changes command.`, 23 Run: func(cmd *cobra.Command, args []string) { 24 cmdLogger.SetLevel(logrus.InfoLevel) 25 endNum, strictExport, isTest, isFuture, extra := utils.MustCommonFlags(cmd.Flags(), cmdLogger) 26 cmdLogger.StrictExport = strictExport 27 env := utils.GetEnvironmentDetails(isTest, isFuture) 28 path := utils.MustBucketFlags(cmd.Flags(), cmdLogger) 29 cloudStorageBucket, cloudCredentials, cloudProvider := utils.MustCloudStorageFlags(cmd.Flags(), cmdLogger) 30 31 datas, err := input.GetEntriesFromGenesis(endNum, xdr.LedgerEntryTypeContractData, env.ArchiveURLs) 32 if err != nil { 33 cmdLogger.Fatal("Error getting ledger entries: ", err) 34 } 35 36 outFile := mustOutFile(path) 37 numFailures := 0 38 totalNumBytes := 0 39 var header xdr.LedgerHeaderHistoryEntry 40 for _, data := range datas { 41 TransformContractData := transform.NewTransformContractDataStruct(transform.AssetFromContractData, transform.ContractBalanceFromContractData) 42 transformed, err, ok := TransformContractData.TransformContractData(data, env.NetworkPassphrase, header) 43 if err != nil { 44 cmdLogger.LogError(fmt.Errorf("could not transform contract data %+v: %v", data, err)) 45 numFailures += 1 46 continue 47 } 48 49 if !ok { 50 continue 51 } 52 53 numBytes, err := exportEntry(transformed, outFile, extra) 54 if err != nil { 55 cmdLogger.LogError(fmt.Errorf("could not export contract data %+v: %v", data, err)) 56 numFailures += 1 57 continue 58 } 59 totalNumBytes += numBytes 60 } 61 outFile.Close() 62 cmdLogger.Info("Number of bytes written: ", totalNumBytes) 63 64 printTransformStats(len(datas), numFailures) 65 maybeUpload(cloudCredentials, cloudStorageBucket, cloudProvider, path) 66 67 }, 68 } 69 70 func init() { 71 rootCmd.AddCommand(dataCmd) 72 utils.AddCommonFlags(dataCmd.Flags()) 73 utils.AddBucketFlags("contract_data", dataCmd.Flags()) 74 utils.AddCloudStorageFlags(dataCmd.Flags()) 75 dataCmd.MarkFlagRequired("end-ledger") 76 /* 77 Current flags: 78 end-ledger: the ledger sequence number for the end of the export range (required) 79 output-file: filename of the output file 80 stdout: if set, output is printed to stdout 81 82 TODO: implement extra flags if possible 83 serialize-method: the method for serialization of the output data (JSON, XDR, etc) 84 end time as a replacement for end sequence numbers 85 */ 86 }