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);
|
uv_async_send(&sql_work->async);
|
||||||
sqlite3_stmt* statement = NULL;
|
sqlite3_stmt* statement = NULL;
|
||||||
sql_work->result = sqlite3_prepare_v2(db, sql_work->query, -1, &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;
|
const uint8_t* p = sql_work->binds;
|
||||||
int column = 0;
|
int column = 0;
|
||||||
@ -1162,7 +1162,11 @@ static void _tf_ssb_sqlAsync_work(tf_ssb_t* ssb, void* user_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
sql_work->result = r;
|
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))
|
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);
|
_tf_ssb_sql_append(&sql_work->rows, &sql_work->rows_count, &(uint8_t[]) { 0 }, 1);
|
||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
}
|
}
|
||||||
else
|
else if (sql_work->result != SQLITE_OK)
|
||||||
{
|
{
|
||||||
sql_work->error = tf_strdup(sqlite3_errmsg(db));
|
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);
|
uv_mutex_lock(&sql_work->lock);
|
||||||
sql_work->db = NULL;
|
sql_work->db = NULL;
|
||||||
uv_mutex_unlock(&sql_work->lock);
|
uv_mutex_unlock(&sql_work->lock);
|
||||||
|
Reference in New Issue
Block a user