// 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 ( Ledger::ref ledger, const AcceptedLedgerTx& alTx, Json::Value const& jvObj) { ScopedLockType sl (mLock); if (alTx.getResult () == tesSUCCESS) { // 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. for (auto& node : alTx.getMeta ()->getNodes ()) { try { if (node.getFieldU16 (sfLedgerEntryType) == ltOFFER) { SField const* field = nullptr; // We need a field that contains the TakerGets and TakerPays // parameters. if (node.getFName () == sfModifiedNode) field = &sfPreviousFields; else if (node.getFName () == sfCreatedNode) field = &sfNewFields; else if (node.getFName () == sfDeletedNode) field = &sfFinalFields; if (field) { auto data = dynamic_cast<const STObject*> ( node.peekAtPField (*field)); if (data) { // determine the OrderBook auto listeners = getBookListeners ( {data->getFieldAmount (sfTakerGets).issue(), data->getFieldAmount (sfTakerPays).issue()}); if (listeners) listeners->publish (jvObj); } } } } catch (...) { WriteLog (lsINFO, OrderBookDB) << "Fields not found in OrderBookDB::processTxn"; } } } }
// 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 ( std::shared_ptr<ReadView const> const& ledger, const AcceptedLedgerTx& alTx) { std::lock_guard <std::recursive_mutex> sl (mLock); Json::Value jvObj; bool bJvObjInitialized = false; if (alTx.getResult () == tesSUCCESS) { std::set<BookListeners::pointer> listenersSet; // 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. for (auto& node : alTx.getMeta ()->getNodes ()) { try { if (node.getFieldU16 (sfLedgerEntryType) == ltOFFER) { SField const* field = nullptr; // We need a field that contains the TakerGets and TakerPays // parameters. if (node.getFName () == sfModifiedNode) field = &sfPreviousFields; else if (node.getFName () == sfCreatedNode) field = &sfNewFields; else if (node.getFName () == sfDeletedNode) field = &sfFinalFields; if (field) { auto data = dynamic_cast<const STObject*> ( node.peekAtPField (*field)); if (data && data->isFieldPresent (sfTakerPays) && data->isFieldPresent (sfTakerGets)) { // determine the OrderBook auto listeners = getBookListeners ( {data->getFieldAmount (sfTakerGets).issue(), data->getFieldAmount (sfTakerPays).issue()}); if (listeners) { listenersSet.insert(listeners); } } } } } catch (std::exception const&) { JLOG (j_.info) << "Fields not found in OrderBookDB::processTxn"; } } for (auto& listeners: listenersSet) { if (!bJvObjInitialized) { jvObj = NetworkOPs_transJson (*alTx.getTxn (), alTx.getResult (), true, ledger, app_); jvObj[jss::meta] = alTx.getMeta ()->getJson (0); bJvObjInitialized = true; } listeners->publish (jvObj); } } }