mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
101 lines
2.3 KiB
C++
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 ();
|
|
}
|