20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/app/main/Application.h>
22 #include <ripple/app/misc/HashRouter.h>
23 #include <ripple/app/misc/Transaction.h>
24 #include <ripple/app/tx/apply.h>
25 #include <ripple/basics/Log.h>
26 #include <ripple/basics/safe_cast.h>
27 #include <ripple/core/DatabaseCon.h>
28 #include <ripple/protocol/ErrorCodes.h>
29 #include <ripple/protocol/Feature.h>
30 #include <ripple/protocol/jss.h>
31 #include <boost/optional.hpp>
39 : mTransaction(stx), mApp(app), j_(app.journal(
"Ledger"))
43 mTransactionID = mTransaction->getTransactionID();
68 char const c = (status) ? (*status)[0] : safe_cast<char>(
txnSqlUnknown);
90 boost::optional<std::uint64_t>
const& ledgerSeq,
91 boost::optional<std::string>
const& status,
96 rangeCheckedCast<std::uint32_t>(ledgerSeq.value_or(0));
99 auto txn = std::make_shared<STTx const>(it);
101 auto tr = std::make_shared<Transaction>(txn, reason, app);
104 tr->setLedger(inLedger);
111 return boost::get<pointer>(
load(
id, app, boost::none, ec));
114 boost::variant<Transaction::pointer, bool>
121 using op = boost::optional<ClosedInterval<uint32_t>>;
126 boost::variant<Transaction::pointer, bool>
134 "SELECT LedgerSeq,Status,RawTxn "
135 "FROM Transactions WHERE TransID='";
140 boost::optional<std::uint64_t> ledgerSeq;
141 boost::optional<std::string> status;
145 soci::blob sociRawTxnBlob(*db);
148 *db << sql, soci::into(ledgerSeq), soci::into(status),
149 soci::into(sociRawTxnBlob, rti);
151 auto const got_data = db->got_data();
153 if ((!got_data || rti != soci::i_ok) && !
range)
160 *db <<
"SELECT COUNT(DISTINCT LedgerSeq) FROM Transactions WHERE "
162 <<
range->first() <<
" AND " <<
range->last() <<
";",
163 soci::into(count, rti);
165 if (!db->got_data() || rti != soci::i_ok)
168 return count == (
range->last() -
range->first() + 1);
171 convert(sociRawTxnBlob, rawTxn);
181 <<
"Unable to deserialize transaction from raw SQL value. Error: "
205 ret[jss::date] = ct->time_since_epoch().count();