diff --git a/src/cpp/ripple/Amount.cpp b/src/cpp/ripple/Amount.cpp index 2edc7ad32..ceca79163 100644 --- a/src/cpp/ripple/Amount.cpp +++ b/src/cpp/ripple/Amount.cpp @@ -643,7 +643,7 @@ std::string STAmount::getText() const return std::string("-") + lexical_cast_i(mValue); else return lexical_cast_i(mValue); } - if ((mOffset < -25) || (mOffset > -5)) + if ((mOffset != 0) && ((mOffset < -25) || (mOffset > -5))) { if (mIsNegative) return std::string("-") + lexical_cast_i(mValue) + diff --git a/src/cpp/ripple/SerializedTransaction.cpp b/src/cpp/ripple/SerializedTransaction.cpp index 5961d25f7..285b5d58c 100644 --- a/src/cpp/ripple/SerializedTransaction.cpp +++ b/src/cpp/ripple/SerializedTransaction.cpp @@ -214,6 +214,16 @@ std::string SerializedTransaction::getSQLInsertHeader() return "INSERT INTO Transactions " + getSQLValueHeader() + " VALUES "; } +std::string SerializedTransaction::getSQLInsertIgnoreHeader() +{ + return "INSERT OR IGNORE INTO Transactions " + getSQLValueHeader() + " VALUES "; +} + +std::string SerializedTransaction::getSQLInsertReplaceHeader() +{ + return "INSERT OR REPLACE INTO Transactions " + getSQLValueHeader() + " VALUES "; +} + std::string SerializedTransaction::getMetaSQLInsertHeader() { return "INSERT INTO Transactions " + getMetaSQLValueHeader() + " VALUES "; diff --git a/src/cpp/ripple/SerializedTransaction.h b/src/cpp/ripple/SerializedTransaction.h index 5294532f6..91186d396 100644 --- a/src/cpp/ripple/SerializedTransaction.h +++ b/src/cpp/ripple/SerializedTransaction.h @@ -73,6 +73,8 @@ public: // SQL Functions static std::string getSQLValueHeader(); static std::string getSQLInsertHeader(); + static std::string getSQLInsertIgnoreHeader(); + static std::string getSQLInsertReplaceHeader(); std::string getSQL(std::string& sql, uint32 inLedger, char status) const; std::string getSQL(uint32 inLedger, char status) const; std::string getSQL(Serializer rawTxn, uint32 inLedger, char status) const; diff --git a/src/cpp/ripple/Transaction.cpp b/src/cpp/ripple/Transaction.cpp index 889eea6a2..3e1b0b427 100644 --- a/src/cpp/ripple/Transaction.cpp +++ b/src/cpp/ripple/Transaction.cpp @@ -126,35 +126,25 @@ void Transaction::setStatus(TransStatus ts, uint32 lseq) mInLedger = lseq; } -void Transaction::saveTransaction(const Transaction::pointer& txn) +void Transaction::save() { - txn->save(); -} - -bool Transaction::save() -{ - if ((mStatus == INVALID) || (mStatus == REMOVED)) return false; + if ((mStatus == INVALID) || (mStatus == REMOVED)) + return; char status; switch (mStatus) { - case NEW: status = TXN_SQL_NEW; break; - case INCLUDED: status = TXN_SQL_INCLUDED; break; - case CONFLICTED: status = TXN_SQL_CONFLICT; break; - case COMMITTED: status = TXN_SQL_VALIDATED; break; - case HELD: status = TXN_SQL_HELD; break; - default: status = TXN_SQL_UNKNOWN; + case NEW: status = TXN_SQL_NEW; break; + case INCLUDED: status = TXN_SQL_INCLUDED; break; + case CONFLICTED: status = TXN_SQL_CONFLICT; break; + case COMMITTED: status = TXN_SQL_VALIDATED; break; + case HELD: status = TXN_SQL_HELD; break; + default: status = TXN_SQL_UNKNOWN; } - static boost::format selStat("SELECT Status FROM Transactions WHERE TransID = '%s';"); - std::string exists = boost::str(selStat % mTransaction->getTransactionID().GetHex()); - Database *db = theApp->getTxnDB()->getDB(); ScopedLock dbLock(theApp->getTxnDB()->getDBLock()); - if (SQL_EXISTS(db, exists)) - return false; - return - db->executeSQL(mTransaction->getSQLInsertHeader() + mTransaction->getSQL(getLedger(), status) + ";"); + db->executeSQL(mTransaction->getSQLInsertReplaceHeader() + mTransaction->getSQL(getLedger(), status) + ";"); } Transaction::pointer Transaction::transactionFromSQL(Database* db, bool bValidate) diff --git a/src/cpp/ripple/Transaction.h b/src/cpp/ripple/Transaction.h index 29505f285..e15bf0477 100644 --- a/src/cpp/ripple/Transaction.h +++ b/src/cpp/ripple/Transaction.h @@ -97,8 +97,7 @@ public: void setLedger(uint32 ledger) { mInLedger = ledger; } // database functions - static void saveTransaction(Transaction::ref); - bool save(); + void save(); static Transaction::pointer load(const uint256& id); static Transaction::pointer findFrom(const RippleAddress& fromID, uint32 seq); diff --git a/src/cpp/ripple/TransactionMaster.cpp b/src/cpp/ripple/TransactionMaster.cpp index ed6b575d6..d92aa5e90 100644 --- a/src/cpp/ripple/TransactionMaster.cpp +++ b/src/cpp/ripple/TransactionMaster.cpp @@ -66,19 +66,18 @@ SerializedTransaction::pointer TransactionMaster::fetch(SHAMapItem::ref item, SH return txn; } -static void saveTransactionHelper(Transaction::pointer txn, LoadEvent::pointer) -{ - Transaction::saveTransaction(txn); -} - bool TransactionMaster::canonicalize(Transaction::pointer& txn, bool may_be_new) { uint256 tid = txn->getID(); - if (!tid) return false; - if (mCache.canonicalize(tid, txn)) return true; + if (!tid) + return false; + + if (mCache.canonicalize(tid, txn)) + return true; + if (may_be_new) - theApp->getAuxService().post(boost::bind(&saveTransactionHelper, txn, - theApp->getJobQueue().getLoadEvent(jtDISK))); + txn->save(); + return false; } // vim:ts=4