github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/cmd/export_accounts.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 accountsCmd = &cobra.Command{ 17 Use: "export_accounts", 18 Short: "Exports the account data.", 19 Long: `Exports historical account 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 account 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 accounts, err := input.GetEntriesFromGenesis(endNum, xdr.LedgerEntryTypeAccount, env.ArchiveURLs) 32 if err != nil { 33 cmdLogger.Fatal("could not read accounts: ", err) 34 } 35 36 outFile := mustOutFile(path) 37 numFailures := 0 38 totalNumBytes := 0 39 var header xdr.LedgerHeaderHistoryEntry 40 for _, acc := range accounts { 41 transformed, err := transform.TransformAccount(acc, header) 42 if err != nil { 43 cmdLogger.LogError(fmt.Errorf("could not json transform account: %v", err)) 44 numFailures += 1 45 continue 46 } 47 48 numBytes, err := exportEntry(transformed, outFile, extra) 49 if err != nil { 50 cmdLogger.LogError(fmt.Errorf("could not export entry: %v", err)) 51 numFailures += 1 52 continue 53 } 54 totalNumBytes += numBytes 55 } 56 57 outFile.Close() 58 cmdLogger.Info("Number of bytes written: ", totalNumBytes) 59 60 printTransformStats(len(accounts), numFailures) 61 62 maybeUpload(cloudCredentials, cloudStorageBucket, cloudProvider, path) 63 }, 64 } 65 66 func init() { 67 rootCmd.AddCommand(accountsCmd) 68 utils.AddCommonFlags(accountsCmd.Flags()) 69 utils.AddBucketFlags("accounts", accountsCmd.Flags()) 70 utils.AddCloudStorageFlags(accountsCmd.Flags()) 71 accountsCmd.MarkFlagRequired("end-ledger") 72 /* 73 Current flags: 74 end-ledger: the ledger sequence number for the end of the export range (required) 75 output-file: filename of the output file 76 77 TODO: implement extra flags if possible 78 serialize-method: the method for serialization of the output data (JSON, XDR, etc) 79 end time as a replacement for end sequence numbers 80 */ 81 }