From b789154c0818127c589a6be7a2f9a34ed2b910a9 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 16 Aug 2012 15:59:27 -0700 Subject: [PATCH] SLE support for threading through transactions. --- src/LedgerFormats.cpp | 2 +- src/SerializedLedger.cpp | 30 ++++++++++++++++++++++++++++++ src/SerializedLedger.h | 6 ++++++ src/SerializedObject.h | 3 ++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/LedgerFormats.cpp b/src/LedgerFormats.cpp index 5b031ffc99..58507b6d9d 100644 --- a/src/LedgerFormats.cpp +++ b/src/LedgerFormats.cpp @@ -10,7 +10,7 @@ LedgerEntryFormat LedgerFormats[]= { S_FIELD(Sequence), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(Balance), STI_AMOUNT, SOE_REQUIRED, 0 }, { S_FIELD(LastReceive), STI_UINT32, SOE_REQUIRED, 0 }, - { S_FIELD(LastTxn), STI_UINT32, SOE_REQUIRED, 0 }, + { S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(AuthorizedKey), STI_ACCOUNT, SOE_IFFLAG, 1 }, { S_FIELD(EmailHash), STI_HASH128, SOE_IFFLAG, 2 }, { S_FIELD(WalletLocator), STI_HASH256, SOE_IFFLAG, 4 }, diff --git a/src/SerializedLedger.cpp b/src/SerializedLedger.cpp index 372e9cd730..33d42d46c1 100644 --- a/src/SerializedLedger.cpp +++ b/src/SerializedLedger.cpp @@ -73,4 +73,34 @@ bool SerializedLedgerEntry::isEquivalent(const SerializedType& t) const if (mObject != v->mObject) return false; return true; } + +bool SerializedLedgerEntry::isThreadedType() +{ + return getIFieldIndex(sfLastTxnID) != -1; +} + +bool SerializedLedgerEntry::isThreaded() +{ + return getIFieldPresent(sfLastTxnID); +} + +uint256 SerializedLedgerEntry::getThreadedTransaction() +{ + return getIFieldH256(sfLastTxnID); +} + +uint32 SerializedLedgerEntry::getThreadedLedger() +{ + return getIFieldU32(sfLastTxnSeq); +} + +void SerializedLedgerEntry::thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID) +{ + prevTxID = getIFieldH256(sfLastTxnID); + prevLedgerID = getIFieldU32(sfLastTxnID); + assert(prevTxID != txID); + setIFieldH256(sfLastTxnID, txID); + setIFieldU32(sfLastTxnSeq, ledgerSeq); +} + // vim:ts=4 diff --git a/src/SerializedLedger.h b/src/SerializedLedger.h index 6df79d7e88..c629ddbbce 100644 --- a/src/SerializedLedger.h +++ b/src/SerializedLedger.h @@ -62,6 +62,12 @@ public: STAmount getIValueFieldAmount(SOE_Field field) const { return mObject.getValueFieldAmount(field); } STVector256 getIFieldV256(SOE_Field field) { return mObject.getValueFieldV256(field); } + bool isThreadedType(); // is this a ledger entry that can be threaded + bool isThreaded(); // is this ledger entry actually threaded + uint256 getThreadedTransaction(); + uint32 getThreadedLedger(); + void thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID); + void setIFieldU8(SOE_Field field, unsigned char v) { return mObject.setValueFieldU8(field, v); } void setIFieldU16(SOE_Field field, uint16 v) { return mObject.setValueFieldU16(field, v); } void setIFieldU32(SOE_Field field, uint32 v) { return mObject.setValueFieldU32(field, v); } diff --git a/src/SerializedObject.h b/src/SerializedObject.h index 0480266bee..e8df6729f4 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -64,7 +64,8 @@ enum SOE_Field sfInvoiceID, sfLastNode, sfLastReceive, - sfLastTxn, + sfLastTxnID, + sfLastTxnSeq, sfLedgerHash, sfLimitAmount, sfLowID,