rippled
OpenView.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/ledger/OpenView.h>
21 #include <ripple/basics/contract.h>
22 
23 namespace ripple {
24 
26 
28  : public txs_type::iter_base
29 {
30 private:
31  bool metadata_;
32  txs_map::const_iterator iter_;
33 
34 public:
35  explicit
36  txs_iter_impl (bool metadata,
37  txs_map::const_iterator iter)
38  : metadata_(metadata)
39  , iter_(iter)
40  {
41  }
42 
44  copy() const override
45  {
46  return std::make_unique<
48  metadata_, iter_);
49  }
50 
51  bool
52  equal (base_type const& impl) const override
53  {
54  auto const& other = dynamic_cast<
55  txs_iter_impl const&>(impl);
56  return iter_ == other.iter_;
57  }
58 
59  void
60  increment() override
61  {
62  ++iter_;
63  }
64 
65  value_type
66  dereference() const override
67  {
68  value_type result;
69  {
70  SerialIter sit(
71  iter_->second.first->slice());
72  result.first = std::make_shared<
73  STTx const>(sit);
74  }
75  if (metadata_)
76  {
77  SerialIter sit(
78  iter_->second.second->slice());
79  result.second = std::make_shared<
80  STObject const>(sit, sfMetadata);
81  }
82  return result;
83  }
84 };
85 
86 //------------------------------------------------------------------------------
87 
89  ReadView const* base, Rules const& rules,
91  : rules_ (rules)
92  , info_ (base->info())
93  , base_ (base)
94  , hold_ (std::move(hold))
95 {
96  info_.validated = false;
97  info_.accepted = false;
98  info_.seq = base_->info().seq + 1;
101 }
102 
105  : rules_ (base->rules())
106  , info_ (base->info())
107  , base_ (base)
108  , hold_ (std::move(hold))
109  , open_ (base->open())
110 {
111 }
112 
115 {
116  return txs_.size();
117 }
118 
119 void
121 {
122  items_.apply(to);
123  for (auto const& item : txs_)
124  to.rawTxInsert (item.first,
125  item.second.first,
126  item.second.second);
127 }
128 
129 //---
130 
131 LedgerInfo const&
133 {
134  return info_;
135 }
136 
137 Fees const&
139 {
140  return base_->fees();
141 }
142 
143 Rules const&
145 {
146  return rules_;
147 }
148 
149 bool
150 OpenView::exists (Keylet const& k) const
151 {
152  return items_.exists(*base_, k);
153 }
154 
155 auto
157  boost::optional<key_type> const& last) const ->
158  boost::optional<key_type>
159 {
160  return items_.succ(*base_, key, last);
161 }
162 
164 OpenView::read (Keylet const& k) const
165 {
166  return items_.read(*base_, k);
167 }
168 
169 auto
171  std::unique_ptr<sles_type::iter_base>
172 {
173  return items_.slesBegin(*base_);
174 }
175 
176 auto
178  std::unique_ptr<sles_type::iter_base>
179 {
180  return items_.slesEnd(*base_);
181 }
182 
183 auto
184 OpenView::slesUpperBound(uint256 const& key) const ->
186 {
187  return items_.slesUpperBound(*base_, key);
188 }
189 
190 auto
192  std::unique_ptr<txs_type::iter_base>
193 {
194  return std::make_unique<txs_iter_impl>(
195  !open(), txs_.cbegin());
196 }
197 
198 auto
200  std::unique_ptr<txs_type::iter_base>
201 {
202  return std::make_unique<txs_iter_impl>(
203  !open(), txs_.cend());
204 }
205 
206 bool
207 OpenView::txExists (key_type const& key) const
208 {
209  return txs_.find(key) != txs_.end();
210 }
211 
212 auto
213 OpenView::txRead (key_type const& key) const ->
214  tx_type
215 {
216  auto const iter = txs_.find(key);
217  if (iter == txs_.end())
218  return base_->txRead(key);
219  auto const& item = iter->second;
220  auto stx = std::make_shared<STTx const
221  >(SerialIter{ item.first->slice() });
222  decltype(tx_type::second) sto;
223  if (item.second)
224  sto = std::make_shared<STObject const>(
225  SerialIter{ item.second->slice() },
226  sfMetadata);
227  else
228  sto = nullptr;
229  return { std::move(stx), std::move(sto) };
230 }
231 
232 //---
233 
234 void
236  std::shared_ptr<SLE> const& sle)
237 {
238  items_.erase(sle);
239 }
240 
241 void
243  std::shared_ptr<SLE> const& sle)
244 {
245  items_.insert(sle);
246 }
247 
248 void
250  std::shared_ptr<SLE> const& sle)
251 {
252  items_.replace(sle);
253 }
254 
255 void
257  XRPAmount const& fee)
258 {
259  items_.destroyXRP(fee);
260  // VFALCO Deduct from info_.totalDrops ?
261  // What about child views?
262 }
263 
264 //---
265 
266 void
269  const& txn, std::shared_ptr<
270  Serializer const>
271  const& metaData)
272 {
273  auto const result = txs_.emplace (key,
274  std::make_pair(txn, metaData));
275  if (! result.second)
276  LogicError("rawTxInsert: duplicate TX id" +
277  to_string(key));
278 }
279 
280 } // ripple
ripple::ReadView::info
virtual LedgerInfo const & info() const =0
Returns information about the ledger.
ripple::OpenView::txCount
std::size_t txCount() const
Return the number of tx inserted since creation.
Definition: OpenView.cpp:114
ripple::Keylet
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:38
ripple::OpenView::txs_iter_impl::equal
bool equal(base_type const &impl) const override
Definition: OpenView.cpp:52
std::shared_ptr
STL class.
ripple::LedgerInfo::parentHash
uint256 parentHash
Definition: ReadView.h:98
ripple::OpenView::info
LedgerInfo const & info() const override
Returns information about the ledger.
Definition: OpenView.cpp:132
ripple::open_ledger
const open_ledger_t open_ledger
Definition: OpenView.cpp:25
ripple::OpenView::apply
void apply(TxsRawView &to) const
Apply changes.
Definition: OpenView.cpp:120
ripple::ReadView::txs_type
Definition: ReadView.h:207
std::make_unique
T make_unique(T... args)
std::pair
ripple::LedgerInfo::hash
uint256 hash
Definition: ReadView.h:95
std::make_shared
T make_shared(T... args)
ripple::sfMetadata
const SField sfMetadata(access, STI_METADATA, 257, "Metadata")
Definition: SField.h:321
ripple::OpenView::rawErase
void rawErase(std::shared_ptr< SLE > const &sle) override
Delete an existing state item.
Definition: OpenView.cpp:235
std::map::find
T find(T... args)
std::map::size
T size(T... args)
ripple::ReadView::fees
virtual Fees const & fees() const =0
Returns the fees for the base ledger.
ripple::OpenView::exists
bool exists(Keylet const &k) const override
Determine if a state item exists.
Definition: OpenView.cpp:150
ripple::OpenView::slesUpperBound
std::unique_ptr< sles_type::iter_base > slesUpperBound(uint256 const &key) const override
Definition: OpenView.cpp:184
std::map::emplace
T emplace(T... args)
ripple::detail::RawStateTable::read
std::shared_ptr< SLE const > read(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:316
ripple::OpenView::txs_iter_impl
Definition: OpenView.cpp:27
ripple::LedgerInfo::seq
LedgerIndex seq
Definition: ReadView.h:87
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:41
ripple::OpenView::items_
detail::RawStateTable items_
Definition: OpenView.h:71
ripple::OpenView::info_
LedgerInfo info_
Definition: OpenView.h:69
ripple::LedgerInfo::closeTime
NetClock::time_point closeTime
Definition: ReadView.h:118
ripple::OpenView::txRead
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
Definition: OpenView.cpp:213
ripple::base_uint< 256 >
ripple::OpenView::fees
Fees const & fees() const override
Returns the fees for the base ledger.
Definition: OpenView.cpp:138
ripple::OpenView::txsEnd
std::unique_ptr< txs_type::iter_base > txsEnd() const override
Definition: OpenView.cpp:199
ripple::OpenView::txExists
bool txExists(key_type const &key) const override
Returns true if a tx exists in the tx map.
Definition: OpenView.cpp:207
ripple::Fees
Reflects the fee settings for a particular ledger.
Definition: ReadView.h:47
ripple::TxsRawView::rawTxInsert
virtual void rawTxInsert(ReadView::key_type const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData)=0
Add a transaction to the tx map.
ripple::OpenView::rawReplace
void rawReplace(std::shared_ptr< SLE > const &sle) override
Unconditionally replace a state item.
Definition: OpenView.cpp:249
ripple::OpenView::open
bool open() const override
Returns true if this reflects an open ledger.
Definition: OpenView.h:144
ripple::OpenView::OpenView
OpenView()=delete
ripple::OpenView::txs_iter_impl::copy
std::unique_ptr< base_type > copy() const override
Definition: OpenView.cpp:44
ripple::OpenView::txs_iter_impl::increment
void increment() override
Definition: OpenView.cpp:60
ripple::STTx
Definition: STTx.h:43
ripple::detail::RawStateTable::slesBegin
std::unique_ptr< ReadView::sles_type::iter_base > slesBegin(ReadView const &base) const
Definition: RawStateTable.cpp:341
ripple::SerialIter
Definition: Serializer.h:311
ripple::detail::RawStateTable::erase
void erase(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:237
ripple::detail::RawStateTable::exists
bool exists(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:179
ripple::Serializer
Definition: Serializer.h:43
ripple::OpenView::rawInsert
void rawInsert(std::shared_ptr< SLE > const &sle) override
Unconditionally insert a state item.
Definition: OpenView.cpp:242
ripple::STObject
Definition: STObject.h:51
ripple::open_ledger_t
Open ledger construction tag.
Definition: OpenView.h:39
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:186
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::LedgerInfo::accepted
bool accepted
Definition: ReadView.h:106
ripple::ReadView::sles_type
Definition: ReadView.h:198
ripple::OpenView::rawTxInsert
void rawTxInsert(key_type const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData) override
Add a transaction to the tx map.
Definition: OpenView.cpp:267
ripple::detail::RawStateTable::apply
void apply(RawView &to) const
Definition: RawStateTable.cpp:157
ripple::OpenView::txsBegin
std::unique_ptr< txs_type::iter_base > txsBegin() const override
Definition: OpenView.cpp:191
ripple::OpenView::rules_
Rules rules_
Definition: OpenView.h:67
ripple::OpenView::txs_iter_impl::metadata_
bool metadata_
Definition: OpenView.cpp:31
ripple::detail::RawStateTable::destroyXRP
void destroyXRP(XRPAmount const &fee)
Definition: RawStateTable.cpp:335
std::map::cbegin
T cbegin(T... args)
std
STL namespace.
ripple::LogicError
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
Definition: contract.cpp:50
ripple::detail::RawStateTable::insert
void insert(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:265
ripple::OpenView::txs_iter_impl::txs_iter_impl
txs_iter_impl(bool metadata, txs_map::const_iterator iter)
Definition: OpenView.cpp:36
ripple::OpenView::txs_iter_impl::dereference
value_type dereference() const override
Definition: OpenView.cpp:66
ripple::Rules
Rules controlling protocol behavior.
Definition: ReadView.h:126
ripple::OpenView::txs_
txs_map txs_
Definition: OpenView.h:68
ripple::OpenView::rawDestroyXRP
void rawDestroyXRP(XRPAmount const &fee) override
Destroy XRP.
Definition: OpenView.cpp:256
ripple::OpenView::read
std::shared_ptr< SLE const > read(Keylet const &k) const override
Return the state item associated with a key.
Definition: OpenView.cpp:164
ripple::detail::RawStateTable::replace
void replace(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:292
std::size_t
std::make_pair
T make_pair(T... args)
ripple::OpenView::slesEnd
std::unique_ptr< sles_type::iter_base > slesEnd() const override
Definition: OpenView.cpp:177
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:79
std::map::cend
T cend(T... args)
ripple::OpenView::base_
ReadView const * base_
Definition: OpenView.h:70
ripple::TxsRawView
Interface for changing ledger entries with transactions.
Definition: RawView.h:101
ripple::LedgerInfo::validated
bool validated
Definition: ReadView.h:105
ripple::detail::RawStateTable::slesEnd
std::unique_ptr< ReadView::sles_type::iter_base > slesEnd(ReadView const &base) const
Definition: RawStateTable.cpp:349
std::unique_ptr
STL class.
ripple::OpenView::slesBegin
std::unique_ptr< sles_type::iter_base > slesBegin() const override
Definition: OpenView.cpp:170
ripple::OpenView::txs_iter_impl::iter_
txs_map::const_iterator iter_
Definition: OpenView.cpp:32
ripple::OpenView::rules
Rules const & rules() const override
Returns the tx processing rules.
Definition: OpenView.cpp:144
ripple::open
void open(soci::session &s, BasicConfig const &config, std::string const &dbName)
Open a soci session.
Definition: SociDB.cpp:98
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::OpenView::succ
boost::optional< key_type > succ(key_type const &key, boost::optional< key_type > const &last=boost::none) const override
Return the key of the next state item.
Definition: OpenView.cpp:156
ripple::LedgerInfo::parentCloseTime
NetClock::time_point parentCloseTime
Definition: ReadView.h:88