From 53b622db75f0bf9db2b532b1e5b20bf754af4e06 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 21 Feb 2013 09:47:34 -0800 Subject: [PATCH] Make getSLEi more useful. --- src/cpp/ripple/Ledger.cpp | 17 +++++++++++------ src/cpp/ripple/Ledger.h | 3 +++ src/cpp/ripple/LedgerEntrySet.cpp | 4 ++++ src/cpp/ripple/SerializedLedger.cpp | 13 ++++++++++--- src/cpp/ripple/SerializedLedger.h | 5 +++++ 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index a35155a2bf..a6a53d8b9c 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -966,6 +966,7 @@ SLE::pointer Ledger::getSLEi(const uint256& uId) if (!ret) { ret = boost::make_shared(node->peekSerializer(), node->getTag()); + ret->setImmutable(); theApp->getSLECache().canonicalize(hash, ret); } return ret; @@ -1011,6 +1012,14 @@ uint256 Ledger::getPrevLedgerIndex(const uint256& uHash, const uint256& uBegin) return node->getTag(); } +SLE::pointer Ledger::getASNodeI(const uint256& nodeID, LedgerEntryType let) +{ + SLE::pointer node = getSLEi(nodeID); + if (node && (node->getType() != let)) + node.reset(); + return node; +} + SLE::pointer Ledger::getASNode(LedgerStateParms& parms, const uint256& nodeID, LedgerEntryType let ) { @@ -1047,16 +1056,12 @@ SLE::pointer Ledger::getASNode(LedgerStateParms& parms, const uint256& nodeID, SLE::pointer Ledger::getAccountRoot(const uint160& accountID) { - LedgerStateParms qry = lepNONE; - - return getASNode(qry, getAccountRootIndex(accountID), ltACCOUNT_ROOT); + return getASNodeI(getAccountRootIndex(accountID), ltACCOUNT_ROOT); } SLE::pointer Ledger::getAccountRoot(const RippleAddress& naAccountID) { - LedgerStateParms qry = lepNONE; - - return getASNode(qry, getAccountRootIndex(naAccountID.getAccountID()), ltACCOUNT_ROOT); + return getASNodeI(getAccountRootIndex(naAccountID.getAccountID()), ltACCOUNT_ROOT); } // diff --git a/src/cpp/ripple/Ledger.h b/src/cpp/ripple/Ledger.h index ffbca3fc88..3059f7ed22 100644 --- a/src/cpp/ripple/Ledger.h +++ b/src/cpp/ripple/Ledger.h @@ -97,6 +97,9 @@ private: protected: SLE::pointer getASNode(LedgerStateParms& parms, const uint256& nodeID, LedgerEntryType let); + // returned SLE is immutable + SLE::pointer getASNodeI(const uint256& nodeID, LedgerEntryType let); + static void incPendingSaves(); static void decPendingSaves(); void saveAcceptedLedger(bool fromConsensus, LoadEvent::pointer); diff --git a/src/cpp/ripple/LedgerEntrySet.cpp b/src/cpp/ripple/LedgerEntrySet.cpp index da90db1453..860247768a 100644 --- a/src/cpp/ripple/LedgerEntrySet.cpp +++ b/src/cpp/ripple/LedgerEntrySet.cpp @@ -107,6 +107,7 @@ LedgerEntryAction LedgerEntrySet::hasEntry(const uint256& index) const void LedgerEntrySet::entryCache(SLE::ref sle) { + assert(sle->isMutable()); std::map::iterator it = mEntries.find(sle->getIndex()); if (it == mEntries.end()) { @@ -128,6 +129,7 @@ void LedgerEntrySet::entryCache(SLE::ref sle) void LedgerEntrySet::entryCreate(SLE::ref sle) { + assert(sle->isMutable()); std::map::iterator it = mEntries.find(sle->getIndex()); if (it == mEntries.end()) { @@ -161,6 +163,7 @@ void LedgerEntrySet::entryCreate(SLE::ref sle) void LedgerEntrySet::entryModify(SLE::ref sle) { + assert(sle->isMutable()); std::map::iterator it = mEntries.find(sle->getIndex()); if (it == mEntries.end()) { @@ -193,6 +196,7 @@ void LedgerEntrySet::entryModify(SLE::ref sle) void LedgerEntrySet::entryDelete(SLE::ref sle) { + assert(sle->isMutable()); std::map::iterator it = mEntries.find(sle->getIndex()); if (it == mEntries.end()) { diff --git a/src/cpp/ripple/SerializedLedger.cpp b/src/cpp/ripple/SerializedLedger.cpp index 8d6804a4de..8f07ec715a 100644 --- a/src/cpp/ripple/SerializedLedger.cpp +++ b/src/cpp/ripple/SerializedLedger.cpp @@ -9,7 +9,7 @@ DECLARE_INSTANCE(SerializedLedgerEntry) SETUP_LOG(); SerializedLedgerEntry::SerializedLedgerEntry(SerializerIterator& sit, const uint256& index) - : STObject(sfLedgerEntry), mIndex(index) + : STObject(sfLedgerEntry), mIndex(index), mMutable(true) { set(sit); uint16 type = getFieldU16(sfLedgerEntryType); @@ -22,7 +22,7 @@ SerializedLedgerEntry::SerializedLedgerEntry(SerializerIterator& sit, const uint } SerializedLedgerEntry::SerializedLedgerEntry(const Serializer& s, const uint256& index) - : STObject(sfLedgerEntry), mIndex(index) + : STObject(sfLedgerEntry), mIndex(index), mMutable(true) { SerializerIterator sit(const_cast(s)); // we know 's' isn't going away set(sit); @@ -41,7 +41,7 @@ SerializedLedgerEntry::SerializedLedgerEntry(const Serializer& s, const uint256& } SerializedLedgerEntry::SerializedLedgerEntry(LedgerEntryType type, const uint256& index) : - STObject(sfLedgerEntry), mIndex(index), mType(type) + STObject(sfLedgerEntry), mIndex(index), mType(type), mMutable(true) { mFormat = LedgerEntryFormat::getLgrFormat(type); if (mFormat == NULL) throw std::runtime_error("invalid ledger entry type"); @@ -49,6 +49,13 @@ SerializedLedgerEntry::SerializedLedgerEntry(LedgerEntryType type, const uint256 setFieldU16(sfLedgerEntryType, static_cast(mFormat->t_type)); } +SerializedLedgerEntry::pointer SerializedLedgerEntry::getMutable() const +{ + SerializedLedgerEntry::pointer ret = boost::make_shared(boost::ref(*this)); + ret->mMutable = true; + return ret; +} + std::string SerializedLedgerEntry::getFullText() const { std::string ret = "\""; diff --git a/src/cpp/ripple/SerializedLedger.h b/src/cpp/ripple/SerializedLedger.h index ec344d9b91..2abdd1aaa1 100644 --- a/src/cpp/ripple/SerializedLedger.h +++ b/src/cpp/ripple/SerializedLedger.h @@ -18,6 +18,7 @@ protected: uint256 mIndex; LedgerEntryType mType; const LedgerEntryFormat* mFormat; + bool mMutable; SerializedLedgerEntry* duplicate() const { return new SerializedLedgerEntry(*this); } @@ -34,6 +35,10 @@ public: const uint256& getIndex() const { return mIndex; } void setIndex(const uint256& i) { mIndex = i; } + void setImmutable() { mMutable = false; } + bool isMutable() { return mMutable; } + SerializedLedgerEntry::pointer getMutable() const; + LedgerEntryType getType() const { return mType; } uint16 getVersion() const { return getFieldU16(sfLedgerEntryType); } const LedgerEntryFormat* getFormat() { return mFormat; }