#include "TransactionMaster.h" #include #include "Application.h" #ifndef CACHED_TRANSACTION_NUM #define CACHED_TRANSACTION_NUM 65536 #endif #ifndef CACHED_TRANSACTION_AGE #define CACHED_TRANSACTION_AGE 1800 #endif TransactionMaster::TransactionMaster() : mCache("TransactionCache", CACHED_TRANSACTION_NUM, CACHED_TRANSACTION_AGE) { ; } bool TransactionMaster::inLedger(const uint256& hash, uint32 ledger) { Transaction::pointer txn = mCache.fetch(hash); if (!txn) return false; txn->setStatus(COMMITTED, ledger); return true; } Transaction::pointer TransactionMaster::fetch(const uint256& txnID, bool checkDisk) { Transaction::pointer txn = mCache.fetch(txnID); if (!checkDisk || txn) return txn; txn = Transaction::load(txnID); if (!txn) return txn; mCache.canonicalize(txnID, txn); return txn; } SerializedTransaction::pointer TransactionMaster::fetch(SHAMapItem::ref item, SHAMapTreeNode::TNType type, bool checkDisk, uint32 uCommitLedger) { SerializedTransaction::pointer txn; Transaction::pointer iTx = theApp->getMasterTransaction().fetch(item->getTag(), false); if (!iTx) { if (type == SHAMapTreeNode::tnTRANSACTION_NM) { SerializerIterator sit(item->peekSerializer()); txn = boost::make_shared(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(boost::ref(sit)); } } else { if (uCommitLedger) iTx->setStatus(COMMITTED, uCommitLedger); txn = iTx->getSTransaction(); } return txn; } bool TransactionMaster::canonicalize(Transaction::pointer& txn, bool may_be_new) { uint256 tid = txn->getID(); if (!tid) return false; if (mCache.canonicalize(tid, txn)) return true; if (may_be_new) txn->save(); return false; } // vim:ts=4