Include the transaction result in the metadata.

This commit is contained in:
JoelKatz
2012-10-16 14:36:36 -07:00
parent 0ae65b5fd0
commit 25d888ff48
5 changed files with 42 additions and 15 deletions

View File

@@ -348,7 +348,7 @@ bool LedgerEntrySet::threadOwners(SLE::ref node, Ledger::ref ledger,
return false;
}
void LedgerEntrySet::calcRawMeta(Serializer& s)
void LedgerEntrySet::calcRawMeta(Serializer& s, TER result)
{ // calculate the raw meta data and return it. This must be called before the set is committed
// Entries modified only as a result of building the transaction metadata
@@ -476,7 +476,7 @@ void LedgerEntrySet::calcRawMeta(Serializer& s)
cLog(lsINFO) << "Metadata:" << mSet.getJson(0);
#endif
mSet.addRaw(s);
mSet.addRaw(s, result);
}
// <-- uNodeDir: For deletion, present to make dirDelete efficient.

View File

@@ -120,7 +120,7 @@ public:
STAmount accountFunds(const uint160& uAccountID, const STAmount& saDefault);
Json::Value getJson(int) const;
void calcRawMeta(Serializer&);
void calcRawMeta(Serializer&, TER result);
// iterator functions
bool isEmpty() const { return mEntries.empty(); }

View File

@@ -457,7 +457,7 @@ TER TransactionEngine::applyTransaction(const SerializedTransaction& txn, Transa
{
// Transaction succeeded fully or (retries are not allowed and the transaction succeeded partially).
Serializer m;
mNodes.calcRawMeta(m);
mNodes.calcRawMeta(m, terResult);
txnWrite();

View File

@@ -7,13 +7,18 @@
#include <boost/foreach.hpp>
TransactionMetaSet::TransactionMetaSet(const uint256& txid, uint32 ledger, const std::vector<unsigned char>& vec) :
mTransactionID(txid), mLedger(ledger), mNodes(sfTransactionMetaData)
mTransactionID(txid), mLedger(ledger), mNodes(sfAffectedNodes)
{
Serializer s(vec);
SerializerIterator sit(s);
std::auto_ptr<SerializedType> obj = STArray::deserialize(sit, sfTransactionMetaData);
mNodes = * static_cast<STArray*>(obj.get());
std::auto_ptr<SerializedType> pobj = STObject::deserialize(sit, sfAffectedNodes);
STObject *obj = static_cast<STObject*>(pobj.get());
if (!obj)
throw std::runtime_error("bad metadata");
mResult = obj->getFieldU8(sfTransactionResult);
mNodes = * dynamic_cast<STArray*>(&obj->getField(sfAffectedNodes));
}
bool TransactionMetaSet::isNodeAffected(const uint256& node) const
@@ -57,7 +62,7 @@ void TransactionMetaSet::init(const uint256& id, uint32 ledger)
{
mTransactionID = id;
mLedger = ledger;
mNodes = STArray(sfTransactionMetaData);
mNodes = STArray(sfAffectedNodes);
}
void TransactionMetaSet::swap(TransactionMetaSet& s)
@@ -85,10 +90,28 @@ static bool compare(const STObject& o1, const STObject& o2)
return o1.getFieldH256(sfLedgerIndex) < o2.getFieldH256(sfLedgerIndex);
}
void TransactionMetaSet::addRaw(Serializer& s)
STObject TransactionMetaSet::getAsObject() const
{
STObject metaData(sfTransactionMetaData);
metaData.setFieldU8(sfTransactionResult, mResult);
metaData.addObject(mNodes);
return metaData;
}
void TransactionMetaSet::addRaw(Serializer& s, TER result)
{
mResult = 255;
if (result == tesSUCCESS)
mResult = 0;
else if (result == tepPATH_DRY)
mResult = 1;
else if (result == tepPATH_PARTIAL)
mResult = 2;
mNodes.sort(compare);
mNodes.add(s);
getAsObject().add(s);
}
// vim:ts=4

View File

@@ -12,6 +12,7 @@
#include "Serializer.h"
#include "SerializedTypes.h"
#include "SerializedObject.h"
#include "TransactionErr.h"
class TransactionMetaSet
{
@@ -19,13 +20,14 @@ public:
typedef boost::shared_ptr<TransactionMetaSet> pointer;
protected:
uint256 mTransactionID;
uint32 mLedger;
uint256 mTransactionID;
uint32 mLedger;
int mResult;
STArray mNodes;
public:
TransactionMetaSet() : mLedger(0) { ; }
TransactionMetaSet() : mLedger(0), mResult(255) { ; }
TransactionMetaSet(const uint256& txID, uint32 ledger) : mTransactionID(txID), mLedger(ledger) { ; }
TransactionMetaSet(const uint256& txID, uint32 ledger, const std::vector<unsigned char>&);
@@ -40,8 +42,10 @@ public:
STObject& getAffectedNode(const uint256&, SField::ref type, bool overrideType);
const STObject& peekAffectedNode(const uint256&) const;
Json::Value getJson(int p) const { return mNodes.getJson(p); }
void addRaw(Serializer&);
Json::Value getJson(int p) const { return getAsObject().getJson(p); }
void addRaw(Serializer&, TER);
STObject getAsObject() const;
static bool thread(STObject& node, const uint256& prevTxID, uint32 prevLgrID);
};