github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/input/bucketlist_entries.go (about) 1 package input 2 3 import ( 4 "context" 5 "io" 6 7 "github.com/stellar/go/historyarchive" 8 "github.com/stellar/go/ingest" 9 "github.com/stellar/go/xdr" 10 11 "github.com/stellar/stellar-etl/internal/utils" 12 ) 13 14 // GetEntriesFromGenesis returns a slice of ledger entries of the specified type for the ledgers starting from the genesis ledger and ending at end (inclusive) 15 func GetEntriesFromGenesis(end uint32, entryType xdr.LedgerEntryType, archiveURLs []string) ([]ingest.Change, error) { 16 archive, err := utils.CreateHistoryArchiveClient(archiveURLs) 17 if err != nil { 18 return []ingest.Change{}, err 19 } 20 21 latestNum, err := utils.GetLatestLedgerSequence(archiveURLs) 22 if err != nil { 23 return []ingest.Change{}, err 24 } 25 26 if err = utils.ValidateLedgerRange(2, end, latestNum); err != nil { 27 return []ingest.Change{}, err 28 } 29 30 checkpointSeq, err := utils.GetCheckpointNum(end, latestNum) 31 if err != nil { 32 return []ingest.Change{}, err 33 } 34 35 return readBucketList(archive, checkpointSeq, entryType) 36 } 37 38 // readBucketList reads the bucket list for the specified checkpoint sequence number and returns a slice of ledger entries of the specified type 39 func readBucketList(archive historyarchive.ArchiveInterface, checkpointSeq uint32, entryType xdr.LedgerEntryType) ([]ingest.Change, error) { 40 changeReader, err := ingest.NewCheckpointChangeReader(context.Background(), archive, checkpointSeq) 41 defer changeReader.Close() 42 if err != nil { 43 return []ingest.Change{}, err 44 } 45 46 entrySlice := []ingest.Change{} 47 for { 48 change, err := changeReader.Read() 49 if err == io.EOF { 50 break 51 } 52 53 if err != nil { 54 return []ingest.Change{}, err 55 } 56 57 if change.Type == entryType { 58 entrySlice = append(entrySlice, change) 59 } 60 } 61 62 return entrySlice, nil 63 }