Don't wipe the order book while it's being used.

Fix OrderBookDB::getBooks so it can return something.
Fix some cases of the find/[] anti-pattern. (You don't need to search twice.)
This commit is contained in:
JoelKatz
2013-02-13 05:27:31 -08:00
parent 57a9f6afdc
commit ca57bf8290
3 changed files with 15 additions and 11 deletions

View File

@@ -64,17 +64,19 @@ void OrderBookDB::setup(Ledger::ref ledger)
// return list of all orderbooks that want IssuerID // return list of all orderbooks that want IssuerID
std::vector<OrderBook::pointer>& OrderBookDB::getBooks(const uint160& issuerID) std::vector<OrderBook::pointer>& OrderBookDB::getBooks(const uint160& issuerID)
{ {
return mIssuerMap.find(issuerID) == mIssuerMap.end() std::map< uint160, std::vector<OrderBook::pointer> >::iterator it = mIssuerMap.find(issuerID);
return (it == mIssuerMap.end())
? mEmptyVector ? mEmptyVector
: mIssuerMap[issuerID]; : it->second;
} }
// return list of all orderbooks that want this issuerID and currencyID // return list of all orderbooks that want this issuerID and currencyID
void OrderBookDB::getBooks(const uint160& issuerID, const uint160& currencyID, std::vector<OrderBook::pointer>& bookRet) void OrderBookDB::getBooks(const uint160& issuerID, const uint160& currencyID, std::vector<OrderBook::pointer>& bookRet)
{ {
if (mIssuerMap.find(issuerID) == mIssuerMap.end()) std::map< uint160, std::vector<OrderBook::pointer> >::iterator it = mIssuerMap.find(issuerID);
if (it != mIssuerMap.end())
{ {
BOOST_FOREACH(OrderBook::ref book, mIssuerMap[issuerID]) BOOST_FOREACH(OrderBook::ref book, it->second)
{ {
if (book->getCurrencyIn() == currencyID) if (book->getCurrencyIn() == currencyID)
bookRet.push_back(book); bookRet.push_back(book);

View File

@@ -139,7 +139,7 @@ Pathfinder::Pathfinder(Ledger::ref ledger,
mLedger(ledger) mLedger(ledger)
{ {
theApp->getOrderBookDB().setup(mLedger); // TODO: have the orderbook update itself rather than rebuild it from scratch each time mOrderBook.setup(mLedger); // TODO: have the orderbook update itself rather than rebuild it from scratch each time
mLoadMonitor = theApp->getJobQueue().getLoadEvent(jtPATH_FIND); mLoadMonitor = theApp->getJobQueue().getLoadEvent(jtPATH_FIND);
@@ -351,7 +351,7 @@ bool Pathfinder::findPaths(const unsigned int iMaxSteps, const unsigned int iMax
else if (!speEnd.mCurrencyID) else if (!speEnd.mCurrencyID)
{ {
// Cursor is for XRP, continue with qualifying books: XRP -> non-XRP // Cursor is for XRP, continue with qualifying books: XRP -> non-XRP
BOOST_FOREACH(OrderBook::ref book, theApp->getOrderBookDB().getXRPInBooks()) BOOST_FOREACH(OrderBook::ref book, mOrderBook.getXRPInBooks())
{ {
// New end is an order book with the currency and issuer. // New end is an order book with the currency and issuer.
@@ -445,7 +445,7 @@ bool Pathfinder::findPaths(const unsigned int iMaxSteps, const unsigned int iMax
std::vector<OrderBook::pointer> books; std::vector<OrderBook::pointer> books;
theApp->getOrderBookDB().getBooks(speEnd.mIssuerID, speEnd.mCurrencyID, books); mOrderBook.getBooks(speEnd.mIssuerID, speEnd.mCurrencyID, books);
BOOST_FOREACH(OrderBook::ref book, books) BOOST_FOREACH(OrderBook::ref book, books)
{ {
@@ -593,7 +593,7 @@ void Pathfinder::addOptions(PathOption::pointer tail)
{ {
if (!tail->mCurrencyID) if (!tail->mCurrencyID)
{ // source XRP { // source XRP
BOOST_FOREACH(OrderBook::ref book, theApp->getOrderBookDB().getXRPInBooks()) BOOST_FOREACH(OrderBook::ref book, mOrderBook.getXRPInBooks())
{ {
PathOption::pointer pathOption(new PathOption(tail)); PathOption::pointer pathOption(new PathOption(tail));
@@ -627,7 +627,7 @@ void Pathfinder::addOptions(PathOption::pointer tail)
// every offer that wants the source currency // every offer that wants the source currency
std::vector<OrderBook::pointer> books; std::vector<OrderBook::pointer> books;
theApp->getOrderBookDB().getBooks(tail->mCurrentAccount, tail->mCurrencyID, books); mOrderBook.getBooks(tail->mCurrentAccount, tail->mCurrencyID, books);
BOOST_FOREACH(OrderBook::ref book,books) BOOST_FOREACH(OrderBook::ref book,books)
{ {

View File

@@ -1,10 +1,12 @@
#ifndef __PATHFINDER__ #ifndef __PATHFINDER__
#define __PATHFINDER__ #define __PATHFINDER__
#include <boost/shared_ptr.hpp>
#include "SerializedTypes.h" #include "SerializedTypes.h"
#include "RippleAddress.h" #include "RippleAddress.h"
#include "RippleCalc.h" #include "RippleCalc.h"
#include <boost/shared_ptr.hpp> #include "OrderBookDB.h"
#if 0 #if 0
// //
@@ -41,7 +43,7 @@ class Pathfinder
uint160 mSrcIssuerID; uint160 mSrcIssuerID;
STAmount mSrcAmount; STAmount mSrcAmount;
//OrderBookDB mOrderBook; OrderBookDB mOrderBook;
Ledger::pointer mLedger; Ledger::pointer mLedger;
PathState::pointer mPsDefault; PathState::pointer mPsDefault;
LoadEvent::pointer mLoadMonitor; LoadEvent::pointer mLoadMonitor;