@@ -84,8 +84,10 @@ void Database::configureSQLITE() {
84
84
/* **********************************************************************************/
85
85
void Database::configureDBConnection () {
86
86
execStatement (" PRAGMA journal_mode = MEMORY" );
87
+ execStatement (" PRAGMA temp_store = MEMORY" );
87
88
execStatement (" PRAGMA synchronous = OFF" );
88
89
execStatement (" PRAGMA foreign_keys = ON;" );
90
+ execStatement (" PRAGMA locking_mode = EXCLUSIVE" );
89
91
}
90
92
91
93
/* **********************************************************************************/
@@ -117,7 +119,14 @@ void Database::execStatement(const std::string& sqlStatement, int (*callback)(vo
117
119
Database::stmtPtr Database::prepareStatement (const std::string& sqlStatement) {
118
120
sqlite3_stmt* stmt{ nullptr };
119
121
120
- sqlite3_prepare_v2 (m_DBHandle, sqlStatement.data (), sqlStatement.length (), &stmt, nullptr );
122
+ const auto res{
123
+ sqlite3_prepare_v2 (m_DBHandle, sqlStatement.data (), sqlStatement.length (), &stmt, nullptr )
124
+ };
125
+
126
+ if (res != SQLITE_OK) {
127
+ std::cerr << " Error preparing SQL statement: " << sqlStatement << " . Error code " << res << ' \n ' ;
128
+ std::cout << " https://www.sqlite.org/c3ref/c_abort.html\n " ;
129
+ }
121
130
122
131
return stmtPtr (stmt, [](auto * s) { sqlite3_finalize (s); });
123
132
}
@@ -126,11 +135,10 @@ Database::stmtPtr Database::prepareStatement(const std::string& sqlStatement) {
126
135
void Database::insertHistorical (const ds::DatasetDesc& datasetDesc) {
127
136
128
137
createHistoricalTable ();
129
-
130
- auto insertFilePathStmt{ prepareStatement (" INSERT INTO Filepaths(filepath) VALUES (@PT);" ) };
131
- auto insertVariableStmt{ prepareStatement (" INSERT INTO Variables(variable, units, longName, validMin, validMax) VALUES (@VS, @UT, @LN, @VN, @VX);" ) };
132
- auto insertTimestampStmt{ prepareStatement (" INSERT INTO Timestamps(timestamp) VALUES (@TS);" ) };
133
- auto insertDimStmt{ prepareStatement (" INSERT INTO Dimensions(name) VALUES (@DM);" ) };
138
+ auto insertFilePathStmt{ prepareStatement (" INSERT OR IGNORE INTO Filepaths(filepath) VALUES (@PT);" ) };
139
+ auto insertVariableStmt{ prepareStatement (" INSERT OR IGNORE INTO Variables(variable, units, longName, validMin, validMax) VALUES (@VS, @UT, @LN, @VN, @VX);" ) };
140
+ auto insertTimestampStmt{ prepareStatement (" INSERT OR IGNORE INTO Timestamps(timestamp) VALUES (@TS);" ) };
141
+ auto insertDimStmt{ prepareStatement (" INSERT OR IGNORE INTO Dimensions(name) VALUES (@DM);" ) };
134
142
135
143
std::unordered_set<ds::timestamp_t > insertedTimestamps;
136
144
std::unordered_set<std::string> insertedDimensions;
@@ -163,7 +171,6 @@ void Database::insertHistorical(const ds::DatasetDesc& datasetDesc) {
163
171
if (insertedDimensions.contains (dim)) {
164
172
continue ;
165
173
}
166
-
167
174
sqlite3_bind_text (&(*insertDimStmt), 1 , dim.c_str (), -1 , SQLITE_TRANSIENT);
168
175
sqlite3_step (&(*insertDimStmt)); // Execute statement
169
176
sqlite3_clear_bindings (&(*insertDimStmt));
@@ -200,7 +207,7 @@ void Database::createDimensionsTable() {
200
207
const auto createDimsTableQuery{
201
208
" CREATE TABLE IF NOT EXISTS Dimensions ("
202
209
" id INTEGER PRIMARY KEY, "
203
- " name TEXT UNIQUE NOT NULL"
210
+ " name TEXT UNIQUE NOT NULL ON CONFLICT IGNORE "
204
211
" );"
205
212
};
206
213
@@ -212,7 +219,7 @@ void Database::createVariablesTable() {
212
219
const auto createVariablesTableQuery{
213
220
" CREATE TABLE IF NOT EXISTS Variables ("
214
221
" id INTEGER PRIMARY KEY,"
215
- " variable TEXT UNIQUE NOT NULL, "
222
+ " variable TEXT UNIQUE NOT NULL ON CONFLICT IGNORE , "
216
223
" units TEXT, "
217
224
" longName TEXT, "
218
225
" validMin REAL, "
@@ -252,7 +259,8 @@ void Database::createVariablesDimensionsTable() {
252
259
void Database::populateHistoricalJoinTable (const ds::DatasetDesc& datasetDesc) {
253
260
auto insertJoinTableStmt{ prepareStatement (" INSERT INTO TimestampVariableFilepath(filepath_id, variable_id, timestamp_id) VALUES ((SELECT id FROM Filepaths WHERE filepath = @PT), \
254
261
(SELECT id FROM Variables WHERE variable = @VR), \
255
- (SELECT id from Timestamps WHERE timestamp = @TS)); \
262
+ (SELECT id from Timestamps WHERE timestamp = @TS)) \
263
+ ON CONFLICT DO NOTHING; \
256
264
" )};
257
265
258
266
execStatement (" BEGIN TRANSACTION" );
@@ -280,7 +288,8 @@ void Database::populateHistoricalJoinTable(const ds::DatasetDesc& datasetDesc) {
280
288
void Database::populateVarsDimTable (const std::unordered_set<ds::VariableDesc>& insertedVariables) {
281
289
282
290
auto insertStmt{ prepareStatement (" INSERT INTO VarsDims(variable_id, dim_id) VALUES ((SELECT id from Variables WHERE variable = @VR), \
283
- (SELECT id FROM Dimensions WHERE name = @DM) ); \
291
+ (SELECT id FROM Dimensions WHERE name = @DM) ) \
292
+ ON CONFLICT DO NOTHING; \
284
293
" ) };
285
294
286
295
execStatement (" BEGIN TRANSACTION" );
@@ -307,14 +316,14 @@ void Database::createHistoricalTable() {
307
316
const auto createFilepathsTableQuery{
308
317
" CREATE TABLE IF NOT EXISTS Filepaths ("
309
318
" id INTEGER PRIMARY KEY, "
310
- " filepath TEXT NOT NULL"
319
+ " filepath TEXT UNIQUE NOT NULL ON CONFLICT IGNORE "
311
320
" );"
312
321
};
313
322
314
323
const auto createTimestampTableQuery{
315
324
" CREATE TABLE IF NOT EXISTS Timestamps ("
316
325
" id INTEGER PRIMARY KEY,"
317
- " timestamp INTEGER UNIQUE NOT NULL"
326
+ " timestamp INTEGER UNIQUE NOT NULL ON CONFLICT IGNORE "
318
327
" );"
319
328
};
320
329
0 commit comments