From d7e5935396d07de26f799e7e39987d8330916db2 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 14:34:48 +0200 Subject: [PATCH] Sqlite: Handle cases that the database is busy This should be not be happen but better be save than sorry. Change-Id: I7b4afe491c07f8d5da2dc13aaffd2f354384a3ae Reviewed-by: Tim Jenssen --- src/libs/sqlite/sqlitedatabasebackend.cpp | 28 +++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/libs/sqlite/sqlitedatabasebackend.cpp b/src/libs/sqlite/sqlitedatabasebackend.cpp index bf9dfab6fc2..91e8df1b37d 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.cpp +++ b/src/libs/sqlite/sqlitedatabasebackend.cpp @@ -25,10 +25,10 @@ #include "sqlitedatabasebackend.h" +#include "sqlitebasestatement.h" #include "sqliteexception.h" #include "sqlitereadstatement.h" #include "sqlitereadwritestatement.h" -#include "sqlitebasestatement.h" #include "sqlitewritestatement.h" #include @@ -177,8 +177,12 @@ void DatabaseBackend::setLastInsertedRowId(int64_t rowId) void DatabaseBackend::execute(Utils::SmallStringView sqlStatement) { - ReadWriteStatement statement(sqlStatement, m_database); - statement.execute(); + try { + ReadWriteStatement statement(sqlStatement, m_database); + statement.execute(); + } catch (StatementIsBusy &) { + execute(sqlStatement); + } } void DatabaseBackend::close() @@ -217,14 +221,14 @@ void DatabaseBackend::registerBusyHandler() void DatabaseBackend::registerRankingFunction() { - sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25", -1, SQLITE_ANY, 0, okapi_bm25, 0, 0, 0); - sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f", -1, SQLITE_UTF8, 0, okapi_bm25f, 0, 0, 0); - sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f_kb", -1, SQLITE_UTF8, 0, okapi_bm25f_kb, 0, 0, 0); + // sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25", -1, SQLITE_ANY, 0, okapi_bm25, 0, 0, 0); + // sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f", -1, SQLITE_UTF8, 0, okapi_bm25f, 0, 0, 0); + // sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f_kb", -1, SQLITE_UTF8, 0, okapi_bm25f_kb, 0, 0, 0); } int DatabaseBackend::busyHandlerCallback(void *, int counter) { - Q_UNUSED(counter); + Q_UNUSED(counter) #ifdef QT_DEBUG //qWarning() << "Busy handler invoked" << counter << "times!"; #endif @@ -453,11 +457,15 @@ void DatabaseBackend::throwDatabaseIsNotOpen(const char *whatHasHappens) const template Type DatabaseBackend::toValue(Utils::SmallStringView sqlStatement) { - ReadWriteStatement statement(sqlStatement, m_database); + try { + ReadWriteStatement statement(sqlStatement, m_database); - statement.next(); + statement.next(); - return statement.fetchValue(0); + return statement.fetchValue(0); + } catch (StatementIsBusy &) { + return toValue(sqlStatement); + } } } // namespace Sqlite