int GetMaxHeight() override { EXT_LOCK (MtxSqlite) { if (SqliteCommand("SELECT * FROM blocks", m_db).ExecuteReader().Read()) return (int)SqliteCommand("SELECT MAX(id) FROM blocks", m_db).ExecuteInt64Scalar(); else return -1; } }
void DeleteBlock(int height, const vector<Int64>& txids) override { CoinEng& eng = Eng(); ostringstream os; os << "DELETE FROM txes WHERE id IN ("; for (int i=0; i<txids.size(); ++i) os << (i ? ", " : "") << txids[i]; os << ")"; //!!!R SqliteCommand(EXT_STR("DELETE FROM txes WHERE blockord=" << height), m_db).ExecuteNonQuery(); SqliteCommand(os.str(), m_db).ExecuteNonQuery(); SqliteCommand(EXT_STR("DELETE FROM blocks WHERE id=" << height), m_db).ExecuteNonQuery(); }
void InsertTx(const Tx& tx, const TxHashesOutNums& hashesOutNums, const HashValue& txHash, int height, const ConstBuf& txIns, const ConstBuf& spend, const ConstBuf& data) override { CoinEng& eng = Eng(); m_cmdInsertTx .Bind(1, ReducedHashValue(txHash)) .Bind(2, (Int64)height) .Bind(3, txIns) .Bind(4, spend); m_cmdInsertTx.Bind(5, data); try { DBG_LOCAL_IGNORE_NAME(MAKE_HRESULT(SEVERITY_ERROR, FACILITY_SQLITE, SQLITE_CONSTRAINT_PRIMARYKEY), ignSQLITE_CONSTRAINT_PRIMARYKEY); m_cmdInsertTx.ExecuteNonQuery(); } catch (const SqliteException&) { TRC(1, "Duplicated Transaction: " << txHash); if (height >= eng.ChainParams.CheckDupTxHeight && ContainsInLinear(GetCoinsByTxHash(txHash), true)) Throw(E_COIN_DupNonSpentTx); SqliteCommand("UPDATE txes SET coins=? WHERE id=?", m_db) .Bind(1, spend) .Bind(2, ReducedHashValue(txHash)) .ExecuteNonQuery(); } if (eng.Mode == EngMode::BlockExplorer) InsertPubkeyToTxes(tx); }
void OptionalDeleteExpiredDomains(uint32_t height) override { if (ResolverMode) { if (!(heightExpired & 0xFF)) { SqliteCommand(EXT_STR("DELETE FROM domains WHERE height <= " << heightExpired), m_db) .ExecuteNonQuery(); } } else { Block blockExpired = GetBlockByHeight(heightExpired); EXT_FOR (const TxHashOutNum& hom, blockExpired.get_TxHashesOutNums()) { m_cmdDeleteDomain .Bind(1, ReducedHashValue(hom.HashTx)) .ExecuteNonQuery(); } } }