rippled
Transaction.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
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/rdb/RelationalDBInterface_postgres.h>
25 #include <ripple/app/rdb/backend/RelationalDBInterfacePostgres.h>
26 #include <ripple/app/rdb/backend/RelationalDBInterfaceSqlite.h>
27 #include <ripple/app/tx/apply.h>
28 #include <ripple/basics/Log.h>
29 #include <ripple/basics/safe_cast.h>
30 #include <ripple/core/DatabaseCon.h>
31 #include <ripple/core/Pg.h>
32 #include <ripple/json/json_reader.h>
33 #include <ripple/protocol/ErrorCodes.h>
34 #include <ripple/protocol/Feature.h>
35 #include <ripple/protocol/jss.h>
36 
37 namespace ripple {
38 
40  std::shared_ptr<STTx const> const& stx,
41  std::string& reason,
42  Application& app) noexcept
43  : mTransaction(stx), mApp(app), j_(app.journal("Ledger"))
44 {
45  try
46  {
47  mTransactionID = mTransaction->getTransactionID();
48  }
49  catch (std::exception& e)
50  {
51  reason = e.what();
52  return;
53  }
54 
55  mStatus = NEW;
56 }
57 
58 //
59 // Misc.
60 //
61 
62 void
64 {
65  mStatus = ts;
66  mInLedger = lseq;
67 }
68 
70 Transaction::sqlTransactionStatus(boost::optional<std::string> const& status)
71 {
72  char const c = (status) ? (*status)[0] : safe_cast<char>(txnSqlUnknown);
73 
74  switch (c)
75  {
76  case txnSqlNew:
77  return NEW;
78  case txnSqlConflict:
79  return CONFLICTED;
80  case txnSqlHeld:
81  return HELD;
82  case txnSqlValidated:
83  return COMMITTED;
84  case txnSqlIncluded:
85  return INCLUDED;
86  }
87 
88  assert(c == txnSqlUnknown);
89  return INVALID;
90 }
91 
94  boost::optional<std::uint64_t> const& ledgerSeq,
95  boost::optional<std::string> const& status,
96  Blob const& rawTxn,
97  Application& app)
98 {
99  std::uint32_t const inLedger =
100  rangeCheckedCast<std::uint32_t>(ledgerSeq.value_or(0));
101 
102  SerialIter it(makeSlice(rawTxn));
103  auto txn = std::make_shared<STTx const>(it);
104  std::string reason;
105  auto tr = std::make_shared<Transaction>(txn, reason, app);
106 
107  tr->setStatus(sqlTransactionStatus(status));
108  tr->setLedger(inLedger);
109  return tr;
110 }
111 
114  TxSearched>
116 {
117  return load(id, app, std::nullopt, ec);
118 }
119 
122  TxSearched>
124  uint256 const& id,
125  Application& app,
127  error_code_i& ec)
128 {
130 
131  return load(id, app, op{range}, ec);
132 }
133 
136 {
137  return dynamic_cast<RelationalDBInterfacePostgres*>(
139  ->locateTransaction(id);
140 }
141 
144  TxSearched>
146  uint256 const& id,
147  Application& app,
149  error_code_i& ec)
150 {
151  return dynamic_cast<RelationalDBInterfaceSqlite*>(
153  ->getTransaction(id, range, ec);
154 }
155 
156 // options 1 to include the date of the transaction
158 Transaction::getJson(JsonOptions options, bool binary) const
159 {
160  Json::Value ret(mTransaction->getJson(JsonOptions::none, binary));
161 
162  if (mInLedger)
163  {
164  ret[jss::inLedger] = mInLedger; // Deprecated.
165  ret[jss::ledger_index] = mInLedger;
166 
167  if (options == JsonOptions::include_date)
168  {
170  if (ct)
171  ret[jss::date] = ct->time_since_epoch().count();
172  }
173  }
174 
175  return ret;
176 }
177 
178 } // namespace ripple
ripple::COMMITTED
@ COMMITTED
Definition: Transaction.h:50
ripple::Transaction::sqlTransactionStatus
static TransStatus sqlTransactionStatus(boost::optional< std::string > const &status)
Definition: Transaction.cpp:70
ripple::Application
Definition: Application.h:103
ripple::Transaction::transactionFromSQL
static Transaction::pointer transactionFromSQL(boost::optional< std::uint64_t > const &ledgerSeq, boost::optional< std::string > const &status, Blob const &rawTxn, Application &app)
Definition: Transaction.cpp:93
ripple::JsonOptions::include_date
@ include_date
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:240
std::string
STL class.
std::shared_ptr
STL class.
ripple::Transaction::getJson
Json::Value getJson(JsonOptions options, bool binary=false) const
Definition: Transaction.cpp:158
std::exception
STL class.
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
std::pair
ripple::TxSearched
TxSearched
Definition: Transaction.h:57
std::vector< unsigned char >
ripple::Application::getRelationalDBInterface
virtual RelationalDBInterface & getRelationalDBInterface()=0
ripple::NEW
@ NEW
Definition: Transaction.h:46
ripple::HELD
@ HELD
Definition: Transaction.h:51
ripple::locateTransaction
Transaction::Locator locateTransaction(std::shared_ptr< PgPool > const &pgPool, uint256 const &id, Application &app)
locateTransaction Returns information used to locate a transaction.
Definition: RelationalDBInterface_postgres.cpp:657
ripple::Transaction::mStatus
TransStatus mStatus
Definition: Transaction.h:390
ripple::RelationalDBInterfacePostgres
Definition: RelationalDBInterfacePostgres.h:27
ripple::error_code_i
error_code_i
Definition: ErrorCodes.h:40
ripple::TransStatus
TransStatus
Definition: Transaction.h:45
ripple::Transaction::mTransaction
std::shared_ptr< STTx const > mTransaction
Definition: Transaction.h:399
ripple::base_uint< 256 >
ripple::INCLUDED
@ INCLUDED
Definition: Transaction.h:48
ripple::txnSqlUnknown
@ txnSqlUnknown
Definition: STTx.h:39
ripple::Transaction::Transaction
Transaction(std::shared_ptr< STTx const > const &, std::string &, Application &) noexcept
Definition: Transaction.cpp:39
ripple::Transaction::Locator
Definition: Transaction.h:315
ripple::Application::getLedgerMaster
virtual LedgerMaster & getLedgerMaster()=0
ripple::RelationalDBInterfaceSqlite
Definition: RelationalDBInterfaceSqlite.h:27
ripple::JsonOptions::none
@ none
ripple::txnSqlValidated
@ txnSqlValidated
Definition: STTx.h:37
ripple::Transaction::locate
static Locator locate(uint256 const &id, Application &app)
Definition: Transaction.cpp:135
ripple::SerialIter
Definition: Serializer.h:310
std::uint32_t
ripple::txnSqlHeld
@ txnSqlHeld
Definition: STTx.h:36
ripple::CONFLICTED
@ CONFLICTED
Definition: Transaction.h:49
ripple::range
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
Definition: RangeSet.h:53
ripple::Transaction::mInLedger
LedgerIndex mInLedger
Definition: Transaction.h:389
ripple::getTransaction
std::variant< RelationalDBInterface::AccountTx, TxSearched > getTransaction(soci::session &session, Application &app, uint256 const &id, std::optional< ClosedInterval< uint32_t >> const &range, error_code_i &ec)
getTransaction Returns transaction with given hash.
Definition: RelationalDBInterface_nodes.cpp:1262
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Transaction::load
static std::variant< std::pair< std::shared_ptr< Transaction >, std::shared_ptr< TxMeta > >, TxSearched > load(uint256 const &id, Application &app, error_code_i &ec)
Definition: Transaction.cpp:115
ripple::INVALID
@ INVALID
Definition: Transaction.h:47
ripple::LedgerMaster::getCloseTimeBySeq
std::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
Definition: LedgerMaster.cpp:1662
ripple::Transaction::setStatus
void setStatus(TransStatus status, std::uint32_t ledgerSeq)
Definition: Transaction.cpp:63
ripple::txnSqlIncluded
@ txnSqlIncluded
Definition: STTx.h:38
ripple::txnSqlConflict
@ txnSqlConflict
Definition: STTx.h:35
ripple::Transaction::mApp
Application & mApp
Definition: Transaction.h:400
ripple::txnSqlNew
@ txnSqlNew
Definition: STTx.h:34
std::optional
ripple::ClosedInterval
boost::icl::closed_interval< T > ClosedInterval
A closed interval over the domain T.
Definition: RangeSet.h:44
std::exception::what
T what(T... args)
Json::Value
Represents a JSON value.
Definition: json_value.h:145
std::variant