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
All checks were successful
Build Tilde Friends / Build-All (push) Successful in 31m9s
This commit is contained in:
15
src/ssb.js.c
15
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);
|
||||
|
Reference in New Issue
Block a user