Skip to content

Commit

Permalink
Add SetupSQLStatements
Browse files Browse the repository at this point in the history
Summary:
This is a backport of [[bitcoin/bitcoin#19077 | core#19077]] [10/26]
bitcoin/bitcoin@7aa4562

Depends on D10552

Test Plan:
With clang-tidy:
`ninja`

Reviewers: #bitcoin_abc, Fabien

Reviewed By: #bitcoin_abc, Fabien

Differential Revision: https://reviews.bitcoinabc.org/D10553
  • Loading branch information
achow101 authored and PiRK committed Nov 26, 2021
1 parent 6df1701 commit cb6d8fa
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 0 deletions.
88 changes: 88 additions & 0 deletions src/wallet/sqlite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,55 @@ SQLiteDatabase::SQLiteDatabase(const fs::path &dir_path,
}
}

void SQLiteBatch::SetupSQLStatements() {
int res;
if (!m_read_stmt) {
if ((res = sqlite3_prepare_v2(
m_database.m_db, "SELECT value FROM main WHERE key = ?", -1,
&m_read_stmt, nullptr)) != SQLITE_OK) {
throw std::runtime_error(strprintf(
"SQLiteDatabase: Failed to setup SQL statements: %s\n",
sqlite3_errstr(res)));
}
}
if (!m_insert_stmt) {
if ((res = sqlite3_prepare_v2(m_database.m_db,
"INSERT INTO main VALUES(?, ?)", -1,
&m_insert_stmt, nullptr)) != SQLITE_OK) {
throw std::runtime_error(strprintf(
"SQLiteDatabase: Failed to setup SQL statements: %s\n",
sqlite3_errstr(res)));
}
}
if (!m_overwrite_stmt) {
if ((res = sqlite3_prepare_v2(
m_database.m_db, "INSERT or REPLACE into main values(?, ?)",
-1, &m_overwrite_stmt, nullptr)) != SQLITE_OK) {
throw std::runtime_error(strprintf(
"SQLiteDatabase: Failed to setup SQL statements: %s\n",
sqlite3_errstr(res)));
}
}
if (!m_delete_stmt) {
if ((res = sqlite3_prepare_v2(m_database.m_db,
"DELETE FROM main WHERE key = ?", -1,
&m_delete_stmt, nullptr)) != SQLITE_OK) {
throw std::runtime_error(strprintf(
"SQLiteDatabase: Failed to setup SQL statements: %s\n",
sqlite3_errstr(res)));
}
}
if (!m_cursor_stmt) {
if ((res = sqlite3_prepare_v2(m_database.m_db,
"SELECT key, value FROM main", -1,
&m_cursor_stmt, nullptr)) != SQLITE_OK) {
throw std::runtime_error(strprintf(
"SQLiteDatabase: Failed to setup SQL statements : %s\n",
sqlite3_errstr(res)));
}
}
}

SQLiteDatabase::~SQLiteDatabase() {
Cleanup();
}
Expand Down Expand Up @@ -213,6 +262,8 @@ std::unique_ptr<DatabaseBatch> SQLiteDatabase::MakeBatch(bool flush_on_close) {
SQLiteBatch::SQLiteBatch(SQLiteDatabase &database) : m_database(database) {
// Make sure we have a db handle
assert(m_database.m_db);

SetupSQLStatements();
}

void SQLiteBatch::Close() {
Expand All @@ -227,6 +278,43 @@ void SQLiteBatch::Close() {
"SQLiteBatch: Batch closed and failed to abort transaction\n");
}
}

// Free all of the prepared statements
int ret = sqlite3_finalize(m_read_stmt);
if (ret != SQLITE_OK) {
LogPrintf("SQLiteBatch: Batch closed but could not finalize read "
"statement: %s\n",
sqlite3_errstr(ret));
}
ret = sqlite3_finalize(m_insert_stmt);
if (ret != SQLITE_OK) {
LogPrintf("SQLiteBatch: Batch closed but could not finalize insert "
"statement: %s\n",
sqlite3_errstr(ret));
}
ret = sqlite3_finalize(m_overwrite_stmt);
if (ret != SQLITE_OK) {
LogPrintf("SQLiteBatch: Batch closed but could not finalize overwrite "
"statement: %s\n",
sqlite3_errstr(ret));
}
ret = sqlite3_finalize(m_delete_stmt);
if (ret != SQLITE_OK) {
LogPrintf("SQLiteBatch: Batch closed but could not finalize delete "
"statement: %s\n",
sqlite3_errstr(ret));
}
ret = sqlite3_finalize(m_cursor_stmt);
if (ret != SQLITE_OK) {
LogPrintf("SQLiteBatch: Batch closed but could not finalize cursor "
"statement: %s\n",
sqlite3_errstr(ret));
}
m_read_stmt = nullptr;
m_insert_stmt = nullptr;
m_overwrite_stmt = nullptr;
m_delete_stmt = nullptr;
m_cursor_stmt = nullptr;
}

bool SQLiteBatch::ReadKey(CDataStream &&key, CDataStream &value) {
Expand Down
8 changes: 8 additions & 0 deletions src/wallet/sqlite.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ class SQLiteBatch : public DatabaseBatch {
private:
SQLiteDatabase &m_database;

sqlite3_stmt *m_read_stmt{nullptr};
sqlite3_stmt *m_insert_stmt{nullptr};
sqlite3_stmt *m_overwrite_stmt{nullptr};
sqlite3_stmt *m_delete_stmt{nullptr};
sqlite3_stmt *m_cursor_stmt{nullptr};

void SetupSQLStatements();

bool ReadKey(CDataStream &&key, CDataStream &value) override;
bool WriteKey(CDataStream &&key, CDataStream &&value,
bool overwrite = true) override;
Expand Down

0 comments on commit cb6d8fa

Please sign in to comment.