20 #include <ripple/app/ledger/LedgerToJson.h>
21 #include <ripple/app/ledger/LedgerMaster.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);
50 auto metaset = std::make_shared<TxMeta> (
51 tr->getID (), tr->getLedger (), rawMeta);
72 Blob const&)>
const& onTransaction,
82 bool lookingForMarker = marker.
has_value();
86 if (limit <= 0 || (limit > page_length && !bAdmin))
87 numberOfResults = page_length;
89 numberOfResults = limit;
101 findLedger = marker->ledgerSeq;
102 findSeq = marker->txnSeq;
109 R
"(SELECT AccountTransactions.LedgerSeq,AccountTransactions.TxnSeq,
110 Status,RawTxn,TxnMeta
111 FROM AccountTransactions INNER JOIN Transactions
112 ON Transactions.TransID = AccountTransactions.TransID
113 AND AccountTransactions.Account = '%s' WHERE
120 if (forward && (findLedger == 0))
124 prefix + (R
"(AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u'
125 ORDER BY AccountTransactions.LedgerSeq ASC,
126 AccountTransactions.TxnSeq ASC
128 idCache.toBase58(account) % minLedger % maxLedger % queryLimit);
130 else if (forward && (findLedger != 0))
132 auto b58acct = idCache.
toBase58(account);
135 R
"(SELECT AccountTransactions.LedgerSeq,AccountTransactions.TxnSeq,
136 Status,RawTxn,TxnMeta
137 FROM AccountTransactions, Transactions WHERE
138 (AccountTransactions.TransID = Transactions.TransID AND
139 AccountTransactions.Account = '%s' AND
140 AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u')
142 (AccountTransactions.TransID = Transactions.TransID AND
143 AccountTransactions.Account = '%s' AND
144 AccountTransactions.LedgerSeq = '%u' AND
145 AccountTransactions.TxnSeq >= '%u')
146 ORDER BY AccountTransactions.LedgerSeq ASC,
147 AccountTransactions.TxnSeq ASC
150 b58acct % (findLedger + 1) % maxLedger % b58acct % findLedger %
151 findSeq % queryLimit);
153 else if (!forward && (findLedger == 0))
157 prefix + (R
"(AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u'
158 ORDER BY AccountTransactions.LedgerSeq DESC,
159 AccountTransactions.TxnSeq DESC
161 idCache.toBase58(account) % minLedger % maxLedger % queryLimit);
163 else if (!forward && (findLedger != 0))
165 auto b58acct = idCache.
toBase58(account);
168 R
"(SELECT AccountTransactions.LedgerSeq,AccountTransactions.TxnSeq,
169 Status,RawTxn,TxnMeta
170 FROM AccountTransactions, Transactions WHERE
171 (AccountTransactions.TransID = Transactions.TransID AND
172 AccountTransactions.Account = '%s' AND
173 AccountTransactions.LedgerSeq BETWEEN '%u' AND '%u')
175 (AccountTransactions.TransID = Transactions.TransID AND
176 AccountTransactions.Account = '%s' AND
177 AccountTransactions.LedgerSeq = '%u' AND
178 AccountTransactions.TxnSeq <= '%u')
179 ORDER BY AccountTransactions.LedgerSeq DESC,
180 AccountTransactions.TxnSeq DESC
183 b58acct % minLedger % (findLedger - 1) % b58acct % findLedger %
184 findSeq % queryLimit);
199 boost::optional<std::uint64_t> ledgerSeq;
200 boost::optional<std::uint32_t> txnSeq;
201 boost::optional<std::string> status;
202 soci::blob txnData(*db);
203 soci::blob txnMeta(*db);
204 soci::indicator dataPresent, metaPresent;
208 soci::into(ledgerSeq),
211 soci::into(txnData, dataPresent),
212 soci::into(txnMeta, metaPresent));
218 if (lookingForMarker)
220 if (findLedger == ledgerSeq.value_or(0) &&
221 findSeq == txnSeq.value_or(0))
223 lookingForMarker =
false;
226 else if (numberOfResults == 0)
229 rangeCheckedCast<std::uint32_t>(ledgerSeq.value_or(0)),
234 if (!lookingForMarker)
236 if (dataPresent == soci::i_ok)
241 if (metaPresent == soci::i_ok)
247 if (rawMeta.
size() == 0)
248 onUnsavedLedger(ledgerSeq.value_or(0));
251 rangeCheckedCast<std::uint32_t>(ledgerSeq.value_or(0)),