mirror of
https://github.com/XRPLF/rippled.git
synced 2026-06-02 16:26:48 +00:00
refactor: Improve RPC variable naming and handling (#7103)
This commit is contained in:
@@ -59,12 +59,12 @@ getAccountObjects(
|
||||
// iterate NFT pages if the filter says so AND dirIndex == 0
|
||||
bool iterateNFTPages =
|
||||
(!typeFilter.has_value() || typeMatchesFilter(typeFilter.value(), ltNFTOKEN_PAGE)) &&
|
||||
dirIndex == beast::kZERO;
|
||||
dirIndex.isZero();
|
||||
|
||||
Keylet const firstNFTPage = keylet::nftpageMin(account);
|
||||
|
||||
// we need to check the marker to see if it is an NFTTokenPage index.
|
||||
if (iterateNFTPages && entryIndex != beast::kZERO)
|
||||
if (iterateNFTPages && entryIndex.isNonZero())
|
||||
{
|
||||
// if it is we will try to iterate the pages up to the limit
|
||||
// and then change over to the owner directory
|
||||
@@ -77,49 +77,44 @@ getAccountObjects(
|
||||
|
||||
// this is a mutable version of limit, used to seamlessly switch
|
||||
// to iterating directory entries when nftokenpages are exhausted
|
||||
uint32_t mlimit = limit;
|
||||
uint32_t limitLeft = limit;
|
||||
|
||||
// iterate NFTokenPages preferentially
|
||||
if (iterateNFTPages)
|
||||
{
|
||||
Keylet const first =
|
||||
entryIndex == beast::kZERO ? firstNFTPage : Keylet{ltNFTOKEN_PAGE, entryIndex};
|
||||
entryIndex.isZero() ? firstNFTPage : Keylet{ltNFTOKEN_PAGE, entryIndex};
|
||||
|
||||
Keylet const last = keylet::nftpageMax(account);
|
||||
|
||||
// current key
|
||||
uint256 ck = ledger.succ(first.key, last.key.next()).value_or(last.key);
|
||||
auto currentKey = ledger.succ(first.key, last.key.next()).value_or(last.key);
|
||||
|
||||
// current page
|
||||
auto cp = ledger.read(Keylet{ltNFTOKEN_PAGE, ck});
|
||||
auto currentPage = ledger.read(Keylet{ltNFTOKEN_PAGE, currentKey});
|
||||
|
||||
while (cp)
|
||||
while (currentPage)
|
||||
{
|
||||
jvObjects.append(cp->getJson(JsonOptions::Values::None));
|
||||
auto const npm = (*cp)[~sfNextPageMin];
|
||||
jvObjects.append(currentPage->getJson(JsonOptions::Values::None));
|
||||
auto const npm = (*currentPage)[~sfNextPageMin];
|
||||
if (npm)
|
||||
{
|
||||
cp = ledger.read(Keylet(ltNFTOKEN_PAGE, *npm));
|
||||
currentPage = ledger.read(Keylet(ltNFTOKEN_PAGE, *npm));
|
||||
}
|
||||
else
|
||||
{
|
||||
cp = nullptr;
|
||||
currentPage = nullptr;
|
||||
}
|
||||
|
||||
if (--mlimit == 0)
|
||||
if (--limitLeft == 0 && currentPage)
|
||||
{
|
||||
if (cp)
|
||||
{
|
||||
jvResult[jss::limit] = limit;
|
||||
jvResult[jss::marker] = std::string("0,") + to_string(ck);
|
||||
return true;
|
||||
}
|
||||
jvResult[jss::limit] = limit;
|
||||
jvResult[jss::marker] = std::string("0,") + to_string(currentKey);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!npm)
|
||||
break;
|
||||
|
||||
ck = *npm;
|
||||
currentKey = *npm;
|
||||
}
|
||||
|
||||
// if execution reaches here then we're about to transition
|
||||
@@ -130,12 +125,12 @@ getAccountObjects(
|
||||
}
|
||||
|
||||
auto const root = keylet::ownerDir(account);
|
||||
auto found = false;
|
||||
auto startEntryFound = false;
|
||||
|
||||
if (dirIndex.isZero())
|
||||
{
|
||||
dirIndex = root.key;
|
||||
found = true;
|
||||
startEntryFound = true;
|
||||
}
|
||||
|
||||
auto dir = ledger.read({ltDIR_NODE, dirIndex});
|
||||
@@ -144,7 +139,7 @@ getAccountObjects(
|
||||
// it's possible the user had nftoken pages but no
|
||||
// directory entries. If there's no nftoken page, we will
|
||||
// give empty array for account_objects.
|
||||
if (mlimit >= limit)
|
||||
if (limitLeft >= limit)
|
||||
jvResult[jss::account_objects] = json::ValueType::Array;
|
||||
|
||||
// non-zero dirIndex validity was checked in the beginning of this
|
||||
@@ -156,33 +151,33 @@ getAccountObjects(
|
||||
return true;
|
||||
}
|
||||
|
||||
std::uint32_t i = 0;
|
||||
std::uint32_t itemsAdded = 0;
|
||||
for (;;)
|
||||
{
|
||||
auto const& entries = dir->getFieldV256(sfIndexes);
|
||||
auto iter = entries.begin();
|
||||
auto const& dirEntries = dir->getFieldV256(sfIndexes);
|
||||
auto entryIter = dirEntries.begin();
|
||||
|
||||
if (!found)
|
||||
if (!startEntryFound)
|
||||
{
|
||||
iter = std::find(iter, entries.end(), entryIndex);
|
||||
if (iter == entries.end())
|
||||
entryIter = std::find(entryIter, dirEntries.end(), entryIndex);
|
||||
if (entryIter == dirEntries.end())
|
||||
return false;
|
||||
|
||||
found = true;
|
||||
startEntryFound = true;
|
||||
}
|
||||
|
||||
// it's possible that the returned NFTPages exactly filled the
|
||||
// response. Check for that condition.
|
||||
if (i == mlimit && mlimit < limit)
|
||||
if (itemsAdded == limitLeft && limitLeft < limit && entryIter != dirEntries.end())
|
||||
{
|
||||
jvResult[jss::limit] = limit;
|
||||
jvResult[jss::marker] = to_string(dirIndex) + ',' + to_string(*iter);
|
||||
jvResult[jss::marker] = to_string(dirIndex) + ',' + to_string(*entryIter);
|
||||
return true;
|
||||
}
|
||||
|
||||
for (; iter != entries.end(); ++iter)
|
||||
for (; entryIter != dirEntries.end(); ++entryIter)
|
||||
{
|
||||
auto const sleNode = ledger.read(keylet::child(*iter));
|
||||
auto const sleNode = ledger.read(keylet::child(*entryIter));
|
||||
|
||||
if (!typeFilter.has_value() ||
|
||||
typeMatchesFilter(typeFilter.value(), sleNode->getType()))
|
||||
@@ -190,12 +185,12 @@ getAccountObjects(
|
||||
jvObjects.append(sleNode->getJson(JsonOptions::Values::None));
|
||||
}
|
||||
|
||||
if (++i == mlimit)
|
||||
if (++itemsAdded == limitLeft)
|
||||
{
|
||||
if (++iter != entries.end())
|
||||
if (++entryIter != dirEntries.end())
|
||||
{
|
||||
jvResult[jss::limit] = limit;
|
||||
jvResult[jss::marker] = to_string(dirIndex) + ',' + to_string(*iter);
|
||||
jvResult[jss::marker] = to_string(dirIndex) + ',' + to_string(*entryIter);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -212,13 +207,14 @@ getAccountObjects(
|
||||
if (!dir)
|
||||
return true;
|
||||
|
||||
if (i == mlimit)
|
||||
if (itemsAdded == limitLeft)
|
||||
{
|
||||
auto const& e = dir->getFieldV256(sfIndexes);
|
||||
if (!e.empty())
|
||||
auto const& currentDirEntries = dir->getFieldV256(sfIndexes);
|
||||
if (!currentDirEntries.empty())
|
||||
{
|
||||
jvResult[jss::limit] = limit;
|
||||
jvResult[jss::marker] = to_string(dirIndex) + ',' + to_string(*e.begin());
|
||||
jvResult[jss::marker] =
|
||||
to_string(dirIndex) + ',' + to_string(*currentDirEntries.begin());
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user