Skip to content

Commit 6173269

Browse files
committed
Set and check the sqlite user version
1 parent 9d3d2d2 commit 6173269

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

src/wallet/sqlite.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <stdint.h>
1919

2020
static const char* const DATABASE_FILENAME = "wallet.dat";
21+
static constexpr int32_t WALLET_SCHEMA_VERSION = 0;
2122

2223
static Mutex g_sqlite_mutex;
2324
static int g_sqlite_count GUARDED_BY(g_sqlite_mutex) = 0;
@@ -137,6 +138,27 @@ bool SQLiteDatabase::Verify(bilingual_str& error)
137138
return false;
138139
}
139140

141+
// Check our schema version
142+
sqlite3_stmt* user_ver_stmt{nullptr};
143+
ret = sqlite3_prepare_v2(m_db, "PRAGMA user_version", -1, &user_ver_stmt, nullptr);
144+
if (ret != SQLITE_OK) {
145+
sqlite3_finalize(user_ver_stmt);
146+
error = strprintf(_("SQLiteDatabase: Failed to prepare the statement to fetch sqlite wallet schema version: %s"), sqlite3_errstr(ret));
147+
return false;
148+
}
149+
ret = sqlite3_step(user_ver_stmt);
150+
if (ret != SQLITE_ROW) {
151+
sqlite3_finalize(user_ver_stmt);
152+
error = strprintf(_("SQLiteDatabase: Failed to fetch sqlite wallet schema version: %s"), sqlite3_errstr(ret));
153+
return false;
154+
}
155+
int32_t user_ver = sqlite3_column_int(user_ver_stmt, 0);
156+
sqlite3_finalize(user_ver_stmt);
157+
if (user_ver != WALLET_SCHEMA_VERSION) {
158+
error = strprintf(_("SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported"), user_ver, WALLET_SCHEMA_VERSION);
159+
return false;
160+
}
161+
140162
sqlite3_stmt* stmt{nullptr};
141163
ret = sqlite3_prepare_v2(m_db, "PRAGMA integrity_check", -1, &stmt, nullptr);
142164
if (ret != SQLITE_OK) {
@@ -246,6 +268,13 @@ void SQLiteDatabase::Open()
246268
if (ret != SQLITE_OK) {
247269
throw std::runtime_error(strprintf("SQLiteDatabase: Failed to set the application id: %s\n", sqlite3_errstr(ret)));
248270
}
271+
272+
// Set the user version
273+
std::string set_user_ver = strprintf("PRAGMA user_version = %d", WALLET_SCHEMA_VERSION);
274+
ret = sqlite3_exec(m_db, set_user_ver.c_str(), nullptr, nullptr, nullptr);
275+
if (ret != SQLITE_OK) {
276+
throw std::runtime_error(strprintf("SQLiteDatabase: Failed to set the wallet schema version: %s\n", sqlite3_errstr(ret)));
277+
}
249278
}
250279
}
251280

0 commit comments

Comments
 (0)