aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/salis.c4
-rw-r--r--core/sql.c18
2 files changed, 15 insertions, 7 deletions
diff --git a/core/salis.c b/core/salis.c
index d6efcf2..a5b517a 100644
--- a/core/salis.c
+++ b/core/salis.c
@@ -691,7 +691,7 @@ void salis_push_data_header(void) {
log_info("Creating core table in SQLite database");
sql_exec(
- 0, NULL, NULL,
+ 0, NULL, NULL, NULL, NULL,
"create table core ("
#define EVENT_ARRAY(core, index, ev) \
#ev "_size_" #core " int not null, " \
@@ -778,7 +778,7 @@ void salis_push_data_line(void) {
log_info("Pushing row to core table in SQLite database");
sql_exec(
- CORES * EVENT_ARRAYS_COUNT, (const void **)blobs, (int *)blob_sizes,
+ CORES * EVENT_ARRAYS_COUNT, (const void **)blobs, (int *)blob_sizes, NULL, NULL,
"insert into core ("
#define EVENT_ARRAY(core, index, ev) \
#ev "_size_" #core ", " \
diff --git a/core/sql.c b/core/sql.c
index 4cfa1b0..b1c0c2a 100644
--- a/core/sql.c
+++ b/core/sql.c
@@ -2,7 +2,7 @@
sqlite3 *g_sim_db;
-void sql_exec(int blob_cnt, const void **blobs, const int *blob_sizes, const char *sql_format, ...) {
+void sql_exec(int blob_cnt, const void **blobs, const int *blob_sizes, void (*callback)(void *data), void *data, const char *sql_format, ...) {
assert(sql_format);
va_list args;
@@ -29,18 +29,26 @@ void sql_exec(int blob_cnt, const void **blobs, const int *blob_sizes, const cha
assert(sql_res == SQLITE_OK);
}
- // Only handle SQLITE_BUSY error, in which case we retry the query.
- // Setting 'journal_mode=wal;' should help prevent busy database errors.
while (true) {
sql_res = sqlite3_step(sql_stmt);
- if (sql_res == SQLITE_DONE || sql_res == SQLITE_ROW) {
+ if (sql_res == SQLITE_ROW) {
+ if (callback) {
+ callback(data);
+ }
+
+ continue;
+ }
+
+ if (sql_res == SQLITE_DONE) {
break;
}
log_warn("SQLite database returned error %d with message:", sql_res);
log_warn(sqlite3_errmsg(g_sim_db));
+ // Only handle SQLITE_BUSY error, in which case we retry the query.
+ // Setting 'journal_mode=wal;' should help prevent busy database errors.
if (sql_res == SQLITE_BUSY) {
log_info("Will retry query...");
continue;
@@ -62,7 +70,7 @@ void sql_open(void) {
// Enable Write-Ahead Logging (WAL)
// This seems to help prevent DB locks when displaying live data.
// See: https://sqlite.org/wal.html
- sql_exec(0, NULL, NULL, "pragma journal_mode=wal;");
+ sql_exec(0, NULL, NULL, NULL, NULL, "pragma journal_mode=wal;");
}
void sql_close(void) {