From e07acea50598e89f8de6469797fce7f3ecaae572 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 6 Dec 2011 11:57:47 -0800 Subject: [PATCH] Complete the transaction-specific part of the ledger comparison logic. --- Transaction.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ Transaction.h | 7 +++++++ 2 files changed, 51 insertions(+) diff --git a/Transaction.cpp b/Transaction.cpp index 920f5fc7fa..4c8e6f3795 100644 --- a/Transaction.cpp +++ b/Transaction.cpp @@ -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 >& inMap, + std::map >& 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 >::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(firstTrans, secondTrans); + } + return ret; +} diff --git a/Transaction.h b/Transaction.h index e77ab5be57..5f1a6b6c5b 100644 --- a/Transaction.h +++ b/Transaction.h @@ -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 >& inMap, + std::map >& outMap); + bool operator<(const Transaction &) const; bool operator>(const Transaction &) const; bool operator==(const Transaction &) const;