104 ripple::AccountID
const& issuer,
105 std::optional<std::uint32_t>
const& taxon,
106 std::uint32_t
const ledgerSequence,
107 std::uint32_t
const limit,
108 std::optional<ripple::uint256>
const& cursorIn,
109 boost::asio::yield_context yield
114 Statement
const idQueryStatement = [&taxon, &issuer, &cursorIn, &limit,
this]() {
115 if (taxon.has_value()) {
116 auto r = schema_->selectNFTIDsByIssuerTaxon.bind(issuer);
118 r.bindAt(2, cursorIn.value_or(ripple::uint256(0)));
119 r.bindAt(3,
Limit{limit});
123 auto r = schema_->selectNFTIDsByIssuer.bind(issuer);
127 cursorIn.has_value() ? ripple::nft::toUInt32(ripple::nft::getTaxon(*cursorIn))
129 cursorIn.value_or(ripple::uint256(0))
132 r.bindAt(2,
Limit{limit});
137 auto const res = executor_.read(yield, idQueryStatement);
139 auto const& idQueryResults = res.value();
140 if (not idQueryResults.hasRows()) {
141 LOG(log_.debug()) <<
"No rows returned";
145 std::vector<ripple::uint256> nftIDs;
147 nftIDs.push_back(nftID);
152 if (nftIDs.size() == limit)
153 ret.cursor = nftIDs.back();
155 std::vector<Statement> selectNFTStatements;
156 selectNFTStatements.reserve(nftIDs.size());
161 std::back_inserter(selectNFTStatements),
162 [&](
auto const& nftID) {
return schema_->selectNFT.bind(nftID, ledgerSequence); }
165 auto const nftInfos = executor_.readEach(yield, selectNFTStatements);
167 std::vector<Statement> selectNFTURIStatements;
168 selectNFTURIStatements.reserve(nftIDs.size());
173 std::back_inserter(selectNFTURIStatements),
174 [&](
auto const& nftID) {
return schema_->selectNFTURI.bind(nftID, ledgerSequence); }
177 auto const nftUris = executor_.readEach(yield, selectNFTURIStatements);
179 for (
auto i = 0u; i < nftIDs.size(); i++) {
180 if (
auto const maybeRow = nftInfos[i].
template get<uint32_t, ripple::AccountID, bool>();
181 maybeRow.has_value()) {
182 auto [seq, owner, isBurned] = *maybeRow;
183 NFT nft(nftIDs[i], seq, owner, isBurned);
184 if (
auto const maybeUri = nftUris[i].
template get<ripple::Blob>();
185 maybeUri.has_value())
187 ret.nfts.push_back(nft);
195 std::uint32_t number,
196 std::uint32_t pageSize,
198 boost::asio::yield_context yield
201 std::vector<ripple::uint256> liveAccounts;
202 std::optional<ripple::AccountID> lastItem;
204 while (liveAccounts.size() < number) {
205 Statement
const statement = lastItem
206 ? schema_->selectAccountFromToken.bind(*lastItem,
Limit{pageSize})
207 : schema_->selectAccountFromBeginning.bind(
Limit{pageSize});
209 auto const res = executor_.read(yield, statement);
211 auto const& results = res.value();
212 if (not results.hasRows()) {
213 LOG(log_.debug()) <<
"No rows returned";
217 std::vector<ripple::uint256> fullAccounts;
219 fullAccounts.push_back(ripple::keylet::account(account).key);
224 for (
auto i = 0u; i < fullAccounts.size(); i++) {
225 if (not objs[i].empty()) {
226 if (liveAccounts.size() < number) {
227 liveAccounts.push_back(fullAccounts[i]);
234 LOG(log_.error()) <<
"Could not fetch account from account_tx: " << res.error();