void storeBatch (NodeStore::Batch const& batch) { // VFALCO TODO Rewrite this to use Beast::db DeprecatedScopedLock sl (m_db->getDBLock()); static SqliteStatement pStB (m_db->getDB()->getSqliteDB(), "BEGIN TRANSACTION;"); static SqliteStatement pStE (m_db->getDB()->getSqliteDB(), "END TRANSACTION;"); static SqliteStatement pSt (m_db->getDB()->getSqliteDB(), "INSERT OR IGNORE INTO CommittedObjects " "(Hash,ObjType,LedgerIndex,Object) VALUES (?, ?, ?, ?);"); pStB.step(); pStB.reset(); BOOST_FOREACH (NodeObject::Ptr const& object, batch) { doBind (pSt, object); pSt.step(); pSt.reset(); }
void HashedObjectStore::bulkWrite() { while (1) { std::vector< boost::shared_ptr<HashedObject> > set; set.reserve(128); { boost::mutex::scoped_lock sl(mWriteMutex); mWriteSet.swap(set); assert(mWriteSet.empty()); ++mWriteGeneration; mWriteCondition.notify_all(); if (set.empty()) { mWritePending = false; return; } } // cLog(lsTRACE) << "HOS: writing " << set.size(); #ifndef NO_SQLITE3_PREPARE { Database* db = theApp->getHashNodeDB()->getDB(); ScopedLock sl(theApp->getHashNodeDB()->getDBLock()); static SqliteStatement pSt(db->getSqliteDB(), "INSERT OR IGNORE INTO CommittedObjects " "(Hash,ObjType,LedgerIndex,Object) VALUES (?, ?, ?, ?);"); db->executeSQL("BEGIN TRANSACTION;"); BOOST_FOREACH(const boost::shared_ptr<HashedObject>& it, set) { const char* type; switch (it->getType()) { case hotLEDGER: type = "L"; break; case hotTRANSACTION: type = "T"; break; case hotACCOUNT_NODE: type = "A"; break; case hotTRANSACTION_NODE: type = "N"; break; default: type = "U"; } pSt.reset(); pSt.bind(1, it->getHash().GetHex()); pSt.bind(2, type); pSt.bind(3, it->getIndex()); pSt.bindStatic(4, it->getData()); int ret = pSt.step(); if (!pSt.isDone(ret)) { cLog(lsFATAL) << "Error saving hashed object " << ret; assert(false); } } db->executeSQL("END TRANSACTION;"); } #else static boost::format fAdd("INSERT OR IGNORE INTO CommittedObjects " "(Hash,ObjType,LedgerIndex,Object) VALUES ('%s','%c','%u',%s);"); Database* db = theApp->getHashNodeDB()->getDB(); { ScopedLock sl(theApp->getHashNodeDB()->getDBLock()); db->executeSQL("BEGIN TRANSACTION;"); BOOST_FOREACH(const boost::shared_ptr<HashedObject>& it, set) { char type; switch (it->getType()) { case hotLEDGER: type = 'L'; break; case hotTRANSACTION: type = 'T'; break; case hotACCOUNT_NODE: type = 'A'; break; case hotTRANSACTION_NODE: type = 'N'; break; default: type = 'U'; } db->executeSQL(boost::str(fAdd % it->getHash().GetHex() % type % it->getIndex() % sqlEscape(it->getData()))); } db->executeSQL("END TRANSACTION;"); } #endif }