Complete the transaction-specific part of the ledger comparison logic.

This commit is contained in:
JoelKatz
2011-12-06 11:57:47 -08:00
parent 7375c1d22b
commit e07acea505
2 changed files with 51 additions and 0 deletions

View File

@@ -230,3 +230,47 @@ Transaction::pointer Transaction::findFrom(const uint160& fromID, uint32 seq)
return transactionFromSQL(sql);
}
bool Transaction::convertToTransactions(uint32 firstLedgerSeq, uint32 secondLedgerSeq,
bool checkFirstTransactions, bool checkSecondTransactions,
const std::map<uint256, std::pair<SHAMapItem::pointer, SHAMapItem::pointer> >& inMap,
std::map<uint256, std::pair<Transaction::pointer, Transaction::pointer> >& outMap)
{ // convert a straight SHAMap payload difference to a transaction difference table
// return value: true=ledgers are valid, false=a ledger is invalid
bool ret=true;
std::map<uint256, std::pair<SHAMapItem::pointer, SHAMapItem::pointer> >::const_iterator it;
for(it=inMap.begin(); it!=inMap.end(); ++it)
{
const uint256& id=it->first;
const SHAMapItem::pointer& first=it->second.first;
const SHAMapItem::pointer& second=it->second.second;
Transaction::pointer firstTrans, secondTrans;
if(!!first)
{ // transaction in our table
firstTrans=Transaction::pointer(new Transaction(first->getData(), checkFirstTransactions));
if( (firstTrans->getStatus()==INVALID) || (firstTrans->getID()!=id) )
{
firstTrans->setStatus(INVALID, firstLedgerSeq);
ret=false;
}
else firstTrans->setStatus(INCLUDED, firstLedgerSeq);
}
if(!!second)
{ // transaction in other table
secondTrans=Transaction::pointer(new Transaction(second->getData(), checkSecondTransactions));
if( (secondTrans->getStatus()==INVALID) || (secondTrans->getID()!=id) )
{
secondTrans->setStatus(INVALID, secondLedgerSeq);
ret=false;
}
else secondTrans->setStatus(INCLUDED, secondLedgerSeq);
}
assert(firstTrans || secondTrans);
if(firstTrans && secondTrans && (firstTrans->getStatus()!=INVALID) && (secondTrans->getStatus()!=INVALID))
ret=false; // one or the other SHAMap is structurally invalid or a miracle has happened
outMap[id]=std::pair<Transaction::pointer, Transaction::pointer>(firstTrans, secondTrans);
}
return ret;
}

View File

@@ -11,6 +11,7 @@
#include "Hanko.h"
#include "Serializer.h"
#include "Account.h"
#include "SHAMap.h"
/*
We could have made something that inherited from the protobuf transaction but this seemed simpler
@@ -82,6 +83,12 @@ public:
static Transaction::pointer load(const uint256& id);
static Transaction::pointer findFrom(const uint160& fromID, uint32 seq);
// conversion function
static bool convertToTransactions(uint32 ourLedgerSeq, uint32 otherLedgerSeq,
bool checkFirstTransactions, bool checkSecondTransactions,
const std::map<uint256, std::pair<SHAMapItem::pointer,SHAMapItem::pointer> >& inMap,
std::map<uint256, std::pair<Transaction::pointer, Transaction::pointer> >& outMap);
bool operator<(const Transaction &) const;
bool operator>(const Transaction &) const;
bool operator==(const Transaction &) const;