mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-27 07:35:57 -05:00
Handle SQLITE_SCHEMA error in db_exec()
This happens under database load with many concurrent threads doing updates; queries failing with SQLITE_SCHEMA at step time need to retried from scratch until they succeeded or hit a best-effort limit of 5 retries.
This commit is contained in:
parent
4594cc3d63
commit
4f3635e354
27
src/db.c
27
src/db.c
@ -535,30 +535,35 @@ static int
|
||||
db_exec(const char *query, char **errmsg)
|
||||
{
|
||||
sqlite3_stmt *stmt;
|
||||
int try;
|
||||
int ret;
|
||||
|
||||
*errmsg = NULL;
|
||||
|
||||
ret = db_blocking_prepare_v2(query, -1, &stmt, NULL);
|
||||
if (ret != SQLITE_OK)
|
||||
for (try = 0; try < 5; try++)
|
||||
{
|
||||
*errmsg = sqlite3_mprintf("prepare failed: %s", sqlite3_errmsg(hdl));
|
||||
return ret;
|
||||
}
|
||||
ret = db_blocking_prepare_v2(query, -1, &stmt, NULL);
|
||||
if (ret != SQLITE_OK)
|
||||
{
|
||||
*errmsg = sqlite3_mprintf("prepare failed: %s", sqlite3_errmsg(hdl));
|
||||
return ret;
|
||||
}
|
||||
|
||||
while ((ret = db_blocking_step(stmt)) == SQLITE_ROW)
|
||||
; /* EMPTY */
|
||||
while ((ret = db_blocking_step(stmt)) == SQLITE_ROW)
|
||||
; /* EMPTY */
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
|
||||
if (ret != SQLITE_SCHEMA)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret != SQLITE_DONE)
|
||||
{
|
||||
*errmsg = sqlite3_mprintf("step failed: %s", sqlite3_errmsg(hdl));
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return ret;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user