diff --git a/src/cpp/database/SqliteDatabase.cpp b/src/cpp/database/SqliteDatabase.cpp index 4bb0850bf7..c9a540ff83 100644 --- a/src/cpp/database/SqliteDatabase.cpp +++ b/src/cpp/database/SqliteDatabase.cpp @@ -279,6 +279,14 @@ SqliteStatement::SqliteStatement(SqliteDatabase* db, const char *sql) throw j; } +SqliteStatement::SqliteStatement(SqliteDatabase* db, const std::string& sql) +{ + assert(db); + int j = sqlite3_prepare_v2(db->peekConnection(), sql.c_str(), sql.size() + 1, &statement, NULL); + if (j != SQLITE_OK) + throw j; +} + SqliteStatement::~SqliteStatement() { sqlite3_finalize(statement); diff --git a/src/cpp/database/SqliteDatabase.h b/src/cpp/database/SqliteDatabase.h index ed2d829457..19569a69b8 100644 --- a/src/cpp/database/SqliteDatabase.h +++ b/src/cpp/database/SqliteDatabase.h @@ -73,6 +73,7 @@ protected: public: SqliteStatement(SqliteDatabase* db, const char *statement); + SqliteStatement(SqliteDatabase* db, const std::string& statement); ~SqliteStatement(); sqlite3_stmt* peekStatement(); diff --git a/src/cpp/ripple/AmountRound.cpp b/src/cpp/ripple/AmountRound.cpp index 12deef7c9a..68633a6f4f 100644 --- a/src/cpp/ripple/AmountRound.cpp +++ b/src/cpp/ripple/AmountRound.cpp @@ -105,7 +105,9 @@ STAmount STAmount::addRound(const STAmount& v1, const STAmount& v2, bool roundUp } int64 fv = vv1 + vv2; - if (fv >= 0) + if ((fv >= -10) && (fv <= -10)) + return STAmount(v1.getFName(), v1.mCurrency, v1.mIssuer); + else if (fv >= 0) { uint64 v = static_cast(fv); canonicalizeRound(false, v, ov1, roundUp); @@ -168,7 +170,9 @@ STAmount STAmount::subRound(const STAmount& v1, const STAmount& v2, bool roundUp } int64 fv = vv1 + vv2; - if (fv >= 0) + if ((fv >= -10) && (fv <= -10)) + return STAmount(v1.getFName(), v1.mCurrency, v1.mIssuer); + else if (fv >= 0) { uint64 v = static_cast(fv); canonicalizeRound(false, v, ov1, roundUp); diff --git a/src/cpp/ripple/HashedObject.cpp b/src/cpp/ripple/HashedObject.cpp index 313b955f98..cc8b21a686 100644 --- a/src/cpp/ripple/HashedObject.cpp +++ b/src/cpp/ripple/HashedObject.cpp @@ -183,12 +183,13 @@ HashedObject::pointer HashedObjectStore::retrieve(const uint256& hash) #ifndef NO_SQLITE3_PREPARE { + std::string sql = "SELECT ObjType,LedgerIndex,Object FROM CommittedObjects WHERE Hash = '"; + sql.append(hash.GetHex()); + sql.append("';"); + ScopedLock sl(theApp->getHashNodeDB()->getDBLock()); LoadEvent::autoptr event(theApp->getJobQueue().getLoadEventAP(jtDISK, "HOS::retrieve")); - SqliteStatement pSt(theApp->getHashNodeDB()->getDB()->getSqliteDB(), - "SELECT ObjType,LedgerIndex,Object FROM CommittedObjects WHERE Hash = ?;"); - - pSt.bind(1, hash.GetHex()); + SqliteStatement pSt(theApp->getHashNodeDB()->getDB()->getSqliteDB(), sql.c_str()); int ret = pSt.step(); if (pSt.isDone(ret)) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index 7fa42d7d35..a9471493a7 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -74,10 +74,10 @@ void LedgerMaster::switchLedgers(Ledger::pointer lastClosed, Ledger::pointer cur mFinalizedLedger->setClosed(); mFinalizedLedger->setAccepted(); mCurrentLedger = current; - } - assert(!mCurrentLedger->isClosed()); - mEngine.setLedger(mCurrentLedger); + assert(!mCurrentLedger->isClosed()); + mEngine.setLedger(mCurrentLedger); + } checkAccept(lastClosed->getHash(), lastClosed->getLedgerSeq()); } @@ -122,6 +122,7 @@ Ledger::pointer LedgerMaster::closeLedger(bool recover) TER LedgerMaster::doTransaction(SerializedTransaction::ref txn, TransactionEngineParams params, bool& didApply) { + boost::recursive_mutex::scoped_lock sl(mLock); TER result = mEngine.applyTransaction(*txn, params, didApply); // if (didApply) theApp->getOPs().pubProposedTransaction(mEngine.getLedger(), txn, result);