Transaction::pointer Transaction::transactionFromSQL (Database* db, bool bValidate) { Serializer rawTxn; std::string status; std::uint32_t inLedger; int txSize = 2048; rawTxn.resize (txSize); db->getStr ("Status", status); inLedger = db->getInt ("LedgerSeq"); txSize = db->getBinary ("RawTxn", &*rawTxn.begin (), rawTxn.getLength ()); if (txSize > rawTxn.getLength ()) { rawTxn.resize (txSize); db->getBinary ("RawTxn", &*rawTxn.begin (), rawTxn.getLength ()); } rawTxn.resize (txSize); SerializerIterator it (rawTxn); SerializedTransaction::pointer txn = boost::make_shared<SerializedTransaction> (boost::ref (it)); Transaction::pointer tr = boost::make_shared<Transaction> (txn, bValidate); TransStatus st (INVALID); switch (status[0]) { case TXN_SQL_NEW: st = NEW; break; case TXN_SQL_CONFLICT: st = CONFLICTED; break; case TXN_SQL_HELD: st = HELD; break; case TXN_SQL_VALIDATED: st = COMMITTED; break; case TXN_SQL_INCLUDED: st = INCLUDED; break; case TXN_SQL_UNKNOWN: break; default: assert (false); } tr->setStatus (st); tr->setLedger (inLedger); return tr; }
SerializedTransaction::pointer TransactionMaster::fetch (SHAMapItem::ref item, SHAMapTreeNode::TNType type, bool checkDisk, uint32 uCommitLedger) { SerializedTransaction::pointer txn; Transaction::pointer iTx = getApp().getMasterTransaction ().fetch (item->getTag (), false); if (!iTx) { if (type == SHAMapTreeNode::tnTRANSACTION_NM) { SerializerIterator sit (item->peekSerializer ()); txn = boost::make_shared<SerializedTransaction> (boost::ref (sit)); } else if (type == SHAMapTreeNode::tnTRANSACTION_MD) { Serializer s; int length; item->peekSerializer ().getVL (s.modData (), 0, length); SerializerIterator sit (s); txn = boost::make_shared<SerializedTransaction> (boost::ref (sit)); } } else { if (uCommitLedger) iTx->setStatus (COMMITTED, uCommitLedger); txn = iTx->getSTransaction (); } return txn; }
bool TransactionMaster::inLedger (uint256 const& hash, std::uint32_t ledger) { Transaction::pointer txn = mCache.fetch (hash); if (!txn) return false; txn->setStatus (COMMITTED, ledger); return true; }
// DAVID: would you rather duplicate this code or keep the lock longer? Transaction::pointer Transaction::transactionFromSQL(const std::string& sql) { Serializer rawTxn; std::string status; uint32 inLedger; int txSize = 2048; rawTxn.resize(txSize); { ScopedLock sl(theApp->getTxnDB()->getDBLock()); Database* db = theApp->getTxnDB()->getDB(); if (!db->executeSQL(sql, true) || !db->startIterRows()) return Transaction::pointer(); db->getStr("Status", status); inLedger = db->getInt("LedgerSeq"); txSize = db->getBinary("RawTxn", &*rawTxn.begin(), rawTxn.getLength()); if (txSize > rawTxn.getLength()) { rawTxn.resize(txSize); db->getBinary("RawTxn", &*rawTxn.begin(), rawTxn.getLength()); } db->endIterRows(); } rawTxn.resize(txSize); SerializerIterator it(rawTxn); SerializedTransaction::pointer txn = boost::make_shared<SerializedTransaction>(boost::ref(it)); Transaction::pointer tr = boost::make_shared<Transaction>(txn, true); TransStatus st(INVALID); switch (status[0]) { case TXN_SQL_NEW: st = NEW; break; case TXN_SQL_CONFLICT: st = CONFLICTED; break; case TXN_SQL_HELD: st = HELD; break; case TXN_SQL_VALIDATED: st = COMMITTED; break; case TXN_SQL_INCLUDED: st = INCLUDED; break; case TXN_SQL_UNKNOWN: break; default: assert(false); } tr->setStatus(st); tr->setLedger(inLedger); return tr; }