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.
All checks were successful
Build Tilde Friends / Build-All (push) Successful in 31m9s

This commit is contained in:
2025-07-09 12:36:58 -04:00
parent 7e1d738f8d
commit e26af21f63

View File

@ -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);