123 ripple::AccountID
const& issuer,
124 std::optional<std::uint32_t>
const& taxon,
125 std::uint32_t
const ledgerSequence,
126 std::uint32_t
const limit,
127 std::optional<ripple::uint256>
const& cursorIn,
128 boost::asio::yield_context yield
133 Statement
const idQueryStatement = [&taxon, &issuer, &cursorIn, &limit,
this]() {
134 if (taxon.has_value()) {
135 auto r = schema_->selectNFTIDsByIssuerTaxon.bind(issuer);
137 r.bindAt(2, cursorIn.value_or(ripple::uint256(0)));
138 r.bindAt(3,
Limit{limit});
142 auto r = schema_->selectNFTIDsByIssuer.bind(issuer);
146 cursorIn.has_value() ? ripple::nft::toUInt32(ripple::nft::getTaxon(*cursorIn))
148 cursorIn.value_or(ripple::uint256(0))
151 r.bindAt(2,
Limit{limit});
156 auto const res = executor_.read(yield, idQueryStatement);
158 auto const& idQueryResults = res.value();
159 if (not idQueryResults.hasRows()) {
160 LOG(log_.debug()) <<
"No rows returned";
164 std::vector<ripple::uint256> nftIDs;
166 nftIDs.push_back(nftID);
171 if (nftIDs.size() == limit)
172 ret.cursor = nftIDs.back();
174 std::vector<Statement> selectNFTStatements;
175 selectNFTStatements.reserve(nftIDs.size());
180 std::back_inserter(selectNFTStatements),
181 [&](
auto const& nftID) {
return schema_->selectNFT.bind(nftID, ledgerSequence); }
184 auto const nftInfos = executor_.readEach(yield, selectNFTStatements);
186 std::vector<Statement> selectNFTURIStatements;
187 selectNFTURIStatements.reserve(nftIDs.size());
192 std::back_inserter(selectNFTURIStatements),
193 [&](
auto const& nftID) {
return schema_->selectNFTURI.bind(nftID, ledgerSequence); }
196 auto const nftUris = executor_.readEach(yield, selectNFTURIStatements);
198 for (
auto i = 0u; i < nftIDs.size(); i++) {
199 if (
auto const maybeRow = nftInfos[i].
template get<uint32_t, ripple::AccountID, bool>();
200 maybeRow.has_value()) {
201 auto [seq, owner, isBurned] = *maybeRow;
202 NFT nft(nftIDs[i], seq, owner, isBurned);
203 if (
auto const maybeUri = nftUris[i].
template get<ripple::Blob>();
204 maybeUri.has_value())
206 ret.nfts.push_back(nft);
214 std::uint32_t number,
215 std::uint32_t pageSize,
217 boost::asio::yield_context yield
220 std::vector<ripple::uint256> liveAccounts;
221 std::optional<ripple::AccountID> lastItem;
223 while (liveAccounts.size() < number) {
224 Statement
const statement = lastItem
225 ? schema_->selectAccountFromToken.bind(*lastItem,
Limit{pageSize})
226 : schema_->selectAccountFromBeginning.bind(
Limit{pageSize});
228 auto const res = executor_.read(yield, statement);
230 auto const& results = res.value();
231 if (not results.hasRows()) {
232 LOG(log_.debug()) <<
"No rows returned";
236 std::vector<ripple::uint256> fullAccounts;
238 fullAccounts.push_back(ripple::keylet::account(account).key);
243 for (
auto i = 0u; i < fullAccounts.size(); i++) {
244 if (not objs[i].empty()) {
245 if (liveAccounts.size() < number) {
246 liveAccounts.push_back(fullAccounts[i]);
253 LOG(log_.error()) <<
"Could not fetch account from account_tx: " << res.error();