Files
xahaud/modules/ripple_app/tx/TransactionMaster.cpp

101 lines
2.3 KiB
C++

//------------------------------------------------------------------------------
/*
Copyright (c) 2011-2013, OpenCoin, Inc.
*/
//==============================================================================
#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 (uint256 const& hash, uint32 ledger)
{
Transaction::pointer txn = mCache.fetch (hash);
if (!txn)
return false;
txn->setStatus (COMMITTED, ledger);
return true;
}
Transaction::pointer TransactionMaster::fetch (uint256 const& 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 = 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::canonicalize (Transaction::pointer& txn)
{
uint256 tid = txn->getID ();
if (!tid)
return false;
if (mCache.canonicalize (tid, txn))
return true;
return false;
}
void TransactionMaster::sweep (void)
{
mCache.sweep ();
}