From e26af21f63579636c25a5587df1f2c8a2481e4e6 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Wed, 9 Jul 2025 12:36:58 -0400 Subject: [PATCH] ssb: Disambiguate some sqlite errors better. Today I learned there are various cases it doesn't update the error message, and prepare can succeed and not produce a statement. --- src/ssb.js.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ssb.js.c b/src/ssb.js.c index 200673af..9064be63 100644 --- a/src/ssb.js.c +++ b/src/ssb.js.c @@ -1082,7 +1082,7 @@ static void _tf_ssb_sqlAsync_work(tf_ssb_t* ssb, void* user_data) uv_async_send(&sql_work->async); sqlite3_stmt* statement = NULL; sql_work->result = sqlite3_prepare_v2(db, sql_work->query, -1, &statement, NULL); - if (sql_work->result == SQLITE_OK) + if (sql_work->result == SQLITE_OK && statement) { const uint8_t* p = sql_work->binds; int column = 0; @@ -1162,7 +1162,11 @@ static void _tf_ssb_sqlAsync_work(tf_ssb_t* ssb, void* user_data) } } sql_work->result = r; - if (r != SQLITE_OK && r != SQLITE_DONE) + if (r == SQLITE_MISUSE) + { + sql_work->error = tf_strdup(sqlite3_errstr(sql_work->result)); + } + else if (r != SQLITE_OK && r != SQLITE_DONE) { if (sqlite3_is_interrupted(db)) { @@ -1176,10 +1180,15 @@ static void _tf_ssb_sqlAsync_work(tf_ssb_t* ssb, void* user_data) _tf_ssb_sql_append(&sql_work->rows, &sql_work->rows_count, &(uint8_t[]) { 0 }, 1); sqlite3_finalize(statement); } - else + else if (sql_work->result != SQLITE_OK) { sql_work->error = tf_strdup(sqlite3_errmsg(db)); } + else + { + sql_work->result = SQLITE_ERROR; + sql_work->error = tf_strdup("Statement not prepared"); + } uv_mutex_lock(&sql_work->lock); sql_work->db = NULL; uv_mutex_unlock(&sql_work->lock);