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,