first draft

This commit is contained in:
jed
2013-02-05 13:04:38 -08:00
parent 62f6d030c6
commit eb27240610
9 changed files with 200 additions and 20 deletions

View File

@@ -2,6 +2,7 @@
#include "Log.h"
#include <boost/foreach.hpp>
SETUP_LOG();
OrderBookDB::OrderBookDB()
{
@@ -11,6 +12,10 @@ OrderBookDB::OrderBookDB()
// TODO: this would be way faster if we could just look under the order dirs
void OrderBookDB::setup(Ledger::pointer ledger)
{
mXRPOrders.clear();
mIssuerMap.clear();
mKnownMap.clear();
// walk through the entire ledger looking for orderbook entries
uint256 currentIndex=ledger->getFirstLedgerIndex();
while(currentIndex.isNonZero())
@@ -60,9 +65,37 @@ void OrderBookDB::getBooks(const uint160& issuerID, const uint160& currencyID, s
}
}
OrderBook::pointer OrderBookDB::getBook(uint160 mCurrencyIn, uint160 mCurrencyOut, uint160 mIssuerIn, uint160 mIssuerOut)
BookListeners::pointer OrderBookDB::makeBookListeners(uint160 currencyIn, uint160 currencyOut, uint160 issuerIn, uint160 issuerOut)
{
BookListeners::pointer ret=getBookListeners(currencyIn, currencyOut, issuerIn, issuerOut);
if(!ret)
{
ret=BookListeners::pointer(new BookListeners);
mListeners[issuerIn][issuerOut][currencyIn][currencyOut]=ret;
}
return(ret);
}
BookListeners::pointer OrderBookDB::getBookListeners(uint160 currencyIn, uint160 currencyOut, uint160 issuerIn, uint160 issuerOut)
{
std::map<uint160, std::map<uint160, std::map<uint160, std::map<uint160, BookListeners::pointer> > > >::iterator it0=mListeners.find(issuerIn);
if(it0 != mListeners.end())
{
std::map<uint160, std::map<uint160, std::map<uint160, BookListeners::pointer> > >::iterator it1=(*it0).second.find(issuerOut);
if(it1 != (*it0).second.end())
{
std::map<uint160, std::map<uint160, BookListeners::pointer> >::iterator it2=(*it1).second.find(currencyIn);
if(it2 != (*it1).second.end())
{
std::map<uint160, BookListeners::pointer>::iterator it3=(*it2).second.find(currencyOut);
if(it3 != (*it2).second.end())
{
return( (*it3).second );
}
}
}
}
return(BookListeners::pointer());
}
/*
@@ -80,19 +113,101 @@ OrderBook::pointer OrderBookDB::getBook(uint160 mCurrencyIn, uint160 mCurrencyOu
"value" : "1"
}
}
}*/
}
"ModifiedNode" : {
"FinalFields" : {
"Account" : "rHTxKLzRbniScyQFGMb3NodmxA848W8dKM",
"BookDirectory" : "407AF8FFDE71114B1981574FDDA9B0334572D56FC579735B4B0BD7A625405555",
"BookNode" : "0000000000000000",
"Flags" : 0,
"OwnerNode" : "0000000000000000",
"Sequence" : 32,
"TakerGets" : "149900000000",
"TakerPays" : {
"currency" : "USD",
"issuer" : "r9vbV3EHvXWjSkeQ6CAcYVPGeq7TuiXY2X",
"value" : "49.96666666666667"
}
},
"LedgerEntryType" : "Offer",
"LedgerIndex" : "C60F8CC514208FA5F7BD03CF1B64B38B7183CD52318FCBBD3726350D4FE693B0",
"PreviousFields" : {
"TakerGets" : "150000000000",
"TakerPays" : {
"currency" : "USD",
"issuer" : "r9vbV3EHvXWjSkeQ6CAcYVPGeq7TuiXY2X",
"value" : "50"
}
},
"PreviousTxnID" : "1A6AAE3F1AC5A8A7554A5ABC395D17FED5BF62CD90181AA8E4315EDFED4EDEB3",
"PreviousTxnLgrSeq" : 140734
}
*/
// Based on the meta, send the meta to the streams that are listening
// We need to determine which streams a given meta effects
void OrderBookDB::processTxn(const SerializedTransaction& stTxn, TER terResult,TransactionMetaSet::pointer& meta,Json::Value& jvObj)
{
// check if this is an offer or an offer cancel or a payment that consumes an offer
//check to see what the meta looks like
BOOST_FOREACH(STObject& node,meta->getNodes())
if(terResult==tesSUCCESS)
{
if(node.getFieldU16(sfLedgerEntryType)==ltOFFER)
// check if this is an offer or an offer cancel or a payment that consumes an offer
//check to see what the meta looks like
BOOST_FOREACH(STObject& node,meta->getNodes())
{
try{
if(node.getFieldU16(sfLedgerEntryType)==ltOFFER)
{
SField* field=NULL;
if(node.getFName() == sfModifiedNode)
{
field=&sfPreviousFields;
}else if(node.getFName() == sfCreatedNode)
{
field=&sfNewFields;
}
const STObject* previous = dynamic_cast<const STObject*>(node.peekAtPField(*field));
if(previous)
{
STAmount& takerGets = previous->getFieldAmount(sfTakerGets);
uint160 currencyOut=takerGets.getCurrency();
uint160 issuerOut=takerGets.getIssuer();
STAmount& takerPays = previous->getFieldAmount(sfTakerPays);
uint160 currencyIn=takerPays.getCurrency();
uint160 issuerIn=takerPays.getIssuer();
// determine the OrderBook
BookListeners::pointer book=getBookListeners(currencyIn,currencyOut,issuerIn,issuerOut);
if(book) book->publish(jvObj);
}
}
}catch(...)
{
cLog(lsINFO) << "Fields not found in OrderBookDB::processTxn";
}
}
}
}
void BookListeners::addSubscriber(InfoSub* sub)
{
mListeners.insert(sub);
}
void BookListeners::removeSubscriber(InfoSub* sub)
{
mListeners.erase(sub);
}
void BookListeners::publish(Json::Value& jvObj)
{
//Json::Value jvObj=node.getJson(0);
BOOST_FOREACH(InfoSub* sub,mListeners)
{
sub->send(jvObj);
}
}