@@ -61,6 +61,36 @@ SQLiteDatabase::SQLiteDatabase(const fs::path& dir_path, const fs::path& file_pa
61
61
}
62
62
}
63
63
64
+ void SQLiteBatch::SetupSQLStatements ()
65
+ {
66
+ int res;
67
+ if (!m_read_stmt) {
68
+ if ((res = sqlite3_prepare_v2 (m_database.m_db , " SELECT value FROM main WHERE key = ?" , -1 , &m_read_stmt, nullptr )) != SQLITE_OK) {
69
+ throw std::runtime_error (strprintf (" SQLiteDatabase: Failed to setup SQL statements: %s\n " , sqlite3_errstr (res)));
70
+ }
71
+ }
72
+ if (!m_insert_stmt) {
73
+ if ((res = sqlite3_prepare_v2 (m_database.m_db , " INSERT INTO main VALUES(?, ?)" , -1 , &m_insert_stmt, nullptr )) != SQLITE_OK) {
74
+ throw std::runtime_error (strprintf (" SQLiteDatabase: Failed to setup SQL statements: %s\n " , sqlite3_errstr (res)));
75
+ }
76
+ }
77
+ if (!m_overwrite_stmt) {
78
+ if ((res = sqlite3_prepare_v2 (m_database.m_db , " INSERT or REPLACE into main values(?, ?)" , -1 , &m_overwrite_stmt, nullptr )) != SQLITE_OK) {
79
+ throw std::runtime_error (strprintf (" SQLiteDatabase: Failed to setup SQL statements: %s\n " , sqlite3_errstr (res)));
80
+ }
81
+ }
82
+ if (!m_delete_stmt) {
83
+ if ((res = sqlite3_prepare_v2 (m_database.m_db , " DELETE FROM main WHERE key = ?" , -1 , &m_delete_stmt, nullptr )) != SQLITE_OK) {
84
+ throw std::runtime_error (strprintf (" SQLiteDatabase: Failed to setup SQL statements: %s\n " , sqlite3_errstr (res)));
85
+ }
86
+ }
87
+ if (!m_cursor_stmt) {
88
+ if ((res = sqlite3_prepare_v2 (m_database.m_db , " SELECT key, value FROM main" , -1 , &m_cursor_stmt, nullptr )) != SQLITE_OK) {
89
+ throw std::runtime_error (strprintf (" SQLiteDatabase: Failed to setup SQL statements : %s\n " , sqlite3_errstr (res)));
90
+ }
91
+ }
92
+ }
93
+
64
94
SQLiteDatabase::~SQLiteDatabase ()
65
95
{
66
96
Cleanup ();
@@ -178,6 +208,8 @@ SQLiteBatch::SQLiteBatch(SQLiteDatabase& database)
178
208
{
179
209
// Make sure we have a db handle
180
210
assert (m_database.m_db );
211
+
212
+ SetupSQLStatements ();
181
213
}
182
214
183
215
void SQLiteBatch::Close ()
@@ -190,6 +222,33 @@ void SQLiteBatch::Close()
190
222
LogPrintf (" SQLiteBatch: Batch closed and failed to abort transaction\n " );
191
223
}
192
224
}
225
+
226
+ // Free all of the prepared statements
227
+ int ret = sqlite3_finalize (m_read_stmt);
228
+ if (ret != SQLITE_OK) {
229
+ LogPrintf (" SQLiteBatch: Batch closed but could not finalize read statement: %s\n " , sqlite3_errstr (ret));
230
+ }
231
+ ret = sqlite3_finalize (m_insert_stmt);
232
+ if (ret != SQLITE_OK) {
233
+ LogPrintf (" SQLiteBatch: Batch closed but could not finalize insert statement: %s\n " , sqlite3_errstr (ret));
234
+ }
235
+ ret = sqlite3_finalize (m_overwrite_stmt);
236
+ if (ret != SQLITE_OK) {
237
+ LogPrintf (" SQLiteBatch: Batch closed but could not finalize overwrite statement: %s\n " , sqlite3_errstr (ret));
238
+ }
239
+ ret = sqlite3_finalize (m_delete_stmt);
240
+ if (ret != SQLITE_OK) {
241
+ LogPrintf (" SQLiteBatch: Batch closed but could not finalize delete statement: %s\n " , sqlite3_errstr (ret));
242
+ }
243
+ ret = sqlite3_finalize (m_cursor_stmt);
244
+ if (ret != SQLITE_OK) {
245
+ LogPrintf (" SQLiteBatch: Batch closed but could not finalize cursor statement: %s\n " , sqlite3_errstr (ret));
246
+ }
247
+ m_read_stmt = nullptr ;
248
+ m_insert_stmt = nullptr ;
249
+ m_overwrite_stmt = nullptr ;
250
+ m_delete_stmt = nullptr ;
251
+ m_cursor_stmt = nullptr ;
193
252
}
194
253
195
254
bool SQLiteBatch::ReadKey (CDataStream&& key, CDataStream& value)
0 commit comments