20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/app/ledger/LedgerToJson.h>
22 #include <ripple/app/main/Application.h>
23 #include <ripple/app/misc/Transaction.h>
24 #include <ripple/app/misc/impl/AccountTxPaging.h>
25 #include <ripple/protocol/Serializer.h>
26 #include <ripple/protocol/UintTypes.h>
27 #include <boost/format.hpp>
42 auto txn = std::make_shared<STTx const>(it);
45 auto tr = std::make_shared<Transaction>(txn, reason, app);
48 tr->setLedger(ledger_index);
51 std::make_shared<TxMeta>(tr->getID(), tr->getLedger(), rawMeta);
80 bool lookingForMarker = marker.
has_value();
84 if (limit <= 0 || (limit > page_length && !bAdmin))
85 numberOfResults = page_length;
87 numberOfResults = limit;
99 findLedger = marker->ledgerSeq;
100 findSeq = marker->txnSeq;
107 R
"(SELECT AccountTransactions.LedgerSeq,AccountTransactions.TxnSeq,
108 Status,RawTxn,TxnMeta
109 FROM AccountTransactions INNER JOIN Transactions
110 ON Transactions.TransID = AccountTransactions.TransID
111 AND AccountTransactions.Account = '%s' WHERE
118 if (forward && (findLedger == 0))
122 prefix + (R
"(AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u'
123 ORDER BY AccountTransactions.LedgerSeq ASC,
124 AccountTransactions.TxnSeq ASC
126 idCache.toBase58(account) % minLedger % maxLedger % queryLimit);
128 else if (forward && (findLedger != 0))
130 auto b58acct = idCache.
toBase58(account);
133 R
"(SELECT AccountTransactions.LedgerSeq,AccountTransactions.TxnSeq,
134 Status,RawTxn,TxnMeta
135 FROM AccountTransactions, Transactions WHERE
136 (AccountTransactions.TransID = Transactions.TransID AND
137 AccountTransactions.Account = '%s' AND
138 AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u')
140 (AccountTransactions.TransID = Transactions.TransID AND
141 AccountTransactions.Account = '%s' AND
142 AccountTransactions.LedgerSeq = '%u' AND
143 AccountTransactions.TxnSeq >= '%u')
144 ORDER BY AccountTransactions.LedgerSeq ASC,
145 AccountTransactions.TxnSeq ASC
148 b58acct % (findLedger + 1) % maxLedger % b58acct % findLedger %
149 findSeq % queryLimit);
151 else if (!forward && (findLedger == 0))
155 prefix + (R
"(AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u'
156 ORDER BY AccountTransactions.LedgerSeq DESC,
157 AccountTransactions.TxnSeq DESC
159 idCache.toBase58(account) % minLedger % maxLedger % queryLimit);
161 else if (!forward && (findLedger != 0))
163 auto b58acct = idCache.
toBase58(account);
166 R
"(SELECT AccountTransactions.LedgerSeq,AccountTransactions.TxnSeq,
167 Status,RawTxn,TxnMeta
168 FROM AccountTransactions, Transactions WHERE
169 (AccountTransactions.TransID = Transactions.TransID AND
170 AccountTransactions.Account = '%s' AND
171 AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u')
173 (AccountTransactions.TransID = Transactions.TransID AND
174 AccountTransactions.Account = '%s' AND
175 AccountTransactions.LedgerSeq = '%u' AND
176 AccountTransactions.TxnSeq <= '%u')
177 ORDER BY AccountTransactions.LedgerSeq DESC,
178 AccountTransactions.TxnSeq DESC
181 b58acct % minLedger % (findLedger - 1) % b58acct % findLedger %
182 findSeq % queryLimit);
197 boost::optional<std::uint64_t> ledgerSeq;
198 boost::optional<std::uint32_t> txnSeq;
199 boost::optional<std::string> status;
200 soci::blob txnData(*db);
201 soci::blob txnMeta(*db);
202 soci::indicator dataPresent, metaPresent;
206 soci::into(ledgerSeq),
209 soci::into(txnData, dataPresent),
210 soci::into(txnMeta, metaPresent));
216 if (lookingForMarker)
218 if (findLedger == ledgerSeq.value_or(0) &&
219 findSeq == txnSeq.value_or(0))
221 lookingForMarker =
false;
224 else if (numberOfResults == 0)
227 rangeCheckedCast<std::uint32_t>(ledgerSeq.value_or(0)),
232 if (!lookingForMarker)
234 if (dataPresent == soci::i_ok)
239 if (metaPresent == soci::i_ok)
245 if (rawMeta.
size() == 0)
246 onUnsavedLedger(ledgerSeq.value_or(0));
251 rangeCheckedCast<std::uint32_t>(ledgerSeq.value_or(0)),