20 #include <ripple/app/misc/Transaction.h>
21 #include <ripple/app/tx/apply.h>
22 #include <ripple/basics/Log.h>
23 #include <ripple/core/DatabaseCon.h>
24 #include <ripple/app/ledger/LedgerMaster.h>
25 #include <ripple/app/main/Application.h>
26 #include <ripple/app/misc/HashRouter.h>
27 #include <ripple/basics/safe_cast.h>
28 #include <ripple/protocol/ErrorCodes.h>
29 #include <ripple/protocol/Feature.h>
30 #include <ripple/protocol/jss.h>
31 #include <boost/optional.hpp>
40 , j_ (app.journal (
"Ledger"))
44 mTransactionID = mTransaction->getTransactionID ();
66 boost::optional<std::string>
const& status)
68 char const c = (status) ? (*status)[0] : safe_cast<char>(
txnSqlUnknown);
84 boost::optional<std::uint64_t>
const& ledgerSeq,
85 boost::optional<std::string>
const& status,
90 rangeCheckedCast<std::uint32_t>(ledgerSeq.value_or (0));
93 auto txn = std::make_shared<STTx const> (it);
95 auto tr = std::make_shared<Transaction> (
99 tr->setLedger (inLedger);
105 return boost::get<pointer> (
load (
id, app, boost::none, ec));
108 boost::variant<Transaction::pointer, bool>
112 using op = boost::optional<ClosedInterval<uint32_t>>;
117 boost::variant<Transaction::pointer, bool>
121 std::string sql =
"SELECT LedgerSeq,Status,RawTxn "
122 "FROM Transactions WHERE TransID='";
127 boost::optional<std::uint64_t> ledgerSeq;
128 boost::optional<std::string> status;
132 soci::blob sociRawTxnBlob (*db);
135 *db << sql, soci::into (ledgerSeq), soci::into (status),
136 soci::into (sociRawTxnBlob, rti);
138 auto const got_data = db->got_data ();
140 if ((!got_data || rti != soci::i_ok) && !
range)
147 *db <<
"SELECT COUNT(DISTINCT LedgerSeq) FROM Transactions WHERE LedgerSeq BETWEEN "
152 soci::into (count, rti);
154 if (!db->got_data () || rti != soci::i_ok)
157 return count == (
range->last () -
range->first () + 1);
160 convert (sociRawTxnBlob, rawTxn);
172 <<
"Unable to deserialize transaction from raw SQL value. Error: "
196 ret[jss::date] = ct->time_since_epoch().count();