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  }