static void updateHelper (SLE::ref entry, hash_set< uint256 >& seen, OrderBookDB::IssueToOrderBook& destMap, OrderBookDB::IssueToOrderBook& sourceMap, hash_set< Issue >& XDVBooks, int& books) { if (entry->getType () == ltDIR_NODE && entry->isFieldPresent (sfExchangeRate) && entry->getFieldH256 (sfRootIndex) == entry->getIndex()) { Book book; book.in.currency.copyFrom (entry->getFieldH160 (sfTakerPaysCurrency)); book.in.account.copyFrom (entry->getFieldH160 (sfTakerPaysIssuer)); book.out.account.copyFrom (entry->getFieldH160 (sfTakerGetsIssuer)); book.out.currency.copyFrom (entry->getFieldH160 (sfTakerGetsCurrency)); uint256 index = getBookBase (book); if (seen.insert (index).second) { auto orderBook = std::make_shared<OrderBook> (index, book); sourceMap[book.in].push_back (orderBook); destMap[book.out].push_back (orderBook); if (isXDV(book.out)) XDVBooks.insert(book.in); ++books; } } }
void OrderBookDB::addOrderBook(Book const& book) { bool toXDV = isXDV (book.out); ScopedLockType sl (mLock); if (toXDV) { // We don't want to search through all the to-XDV or from-XDV order // books! for (auto ob: mSourceMap[book.in]) { if (isXDV (ob->getCurrencyOut ())) // also to XDV return; } } else { for (auto ob: mDestMap[book.out]) { if (ob->getCurrencyIn() == book.in.currency && ob->getIssuerIn() == book.in.account) { return; } } } uint256 index = getBookBase(book); auto orderBook = std::make_shared<OrderBook> (index, book); mSourceMap[book.in].push_back (orderBook); mDestMap[book.out].push_back (orderBook); if (toXDV) mXDVBooks.insert(book.in); }
BookTip::BookTip (ApplyView& view, Book const& book) : view_ (view) , m_valid (false) , m_book (getBookBase (book)) , m_end (getQualityNext (m_book)) { }
void OrderBookDB::addOrderBook(Book const& book) { bool toXRP = isXRP (book.out); std::lock_guard <std::recursive_mutex> sl (mLock); if (toXRP) { // We don't want to search through all the to-XRP or from-XRP order // books! for (auto ob: mSourceMap[book.in]) { if (isXRP (ob->getCurrencyOut ())) // also to XRP return; } } else { for (auto ob: mDestMap[book.out]) { if (ob->getCurrencyIn() == book.in.currency && ob->getIssuerIn() == book.in.account) { return; } } } uint256 index = getBookBase(book); auto orderBook = std::make_shared<OrderBook> (index, book); mSourceMap[book.in].push_back (orderBook); mDestMap[book.out].push_back (orderBook); if (toXRP) mXRPBooks.insert(book.in); }
void OrderBookDB::update( std::shared_ptr<ReadView const> const& ledger) { hash_set< uint256 > seen; OrderBookDB::IssueToOrderBook destMap; OrderBookDB::IssueToOrderBook sourceMap; hash_set< Issue > XRPBooks; JLOG (j_.debug) << "OrderBookDB::update>"; if (app_.config().PATH_SEARCH_MAX == 0) { // pathfinding has been disabled return; } // walk through the entire ledger looking for orderbook entries int books = 0; try { for(auto& sle : ledger->sles) { if (sle->getType () == ltDIR_NODE && sle->isFieldPresent (sfExchangeRate) && sle->getFieldH256 (sfRootIndex) == sle->getIndex()) { Book book; book.in.currency.copyFrom(sle->getFieldH160( sfTakerPaysCurrency)); book.in.account.copyFrom(sle->getFieldH160 ( sfTakerPaysIssuer)); book.out.account.copyFrom(sle->getFieldH160( sfTakerGetsIssuer)); book.out.currency.copyFrom (sle->getFieldH160( sfTakerGetsCurrency)); uint256 index = getBookBase (book); if (seen.insert (index).second) { auto orderBook = std::make_shared<OrderBook> (index, book); sourceMap[book.in].push_back (orderBook); destMap[book.out].push_back (orderBook); if (isXRP(book.out)) XRPBooks.insert(book.in); ++books; } } } } catch (const SHAMapMissingNode&) { JLOG (j_.info) << "OrderBookDB::update encountered a missing node"; std::lock_guard <std::recursive_mutex> sl (mLock); mSeq = 0; return; } JLOG (j_.debug) << "OrderBookDB::update< " << books << " books found"; { std::lock_guard <std::recursive_mutex> sl (mLock); mXRPBooks.swap(XRPBooks); mSourceMap.swap(sourceMap); mDestMap.swap(destMap); } app_.getLedgerMaster().newOrderBookDB(); }