From f9babc22cf6ea6065e6536ad8023b347771ba2f7 Mon Sep 17 00:00:00 2001 From: John Magdy Lotfy Kamel <19735243+Zorono@users.noreply.github.com> Date: Thu, 17 Jul 2025 21:18:24 +0300 Subject: [PATCH 1/5] Update database_connection.cpp --- .../Databases/database_connection.cpp | 51 +++++++++++++++++-- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/Server/Components/Databases/database_connection.cpp b/Server/Components/Databases/database_connection.cpp index 3975d7c11..fc7bbffab 100644 --- a/Server/Components/Databases/database_connection.cpp +++ b/Server/Components/Databases/database_connection.cpp @@ -42,14 +42,55 @@ IDatabaseResultSet* DatabaseConnection::executeQuery(StringView query) IDatabaseResultSet* ret(parentDatabasesComponent->createResultSet()); if (ret) { - // TODO: Properly handle errors parentDatabasesComponent->logQuery("[log_sqlite_queries]: %.*s", PRINT_VIEW(query)); - if (sqlite3_exec(databaseConnectionHandle, query.data(), queryStepExecuted, ret, nullptr) != SQLITE_OK) + char *sqlError = nullptr; + int sqlRet = 999; + sqlRet = sqlite3_exec(databaseConnectionHandle, query.data(), queryStepExecuted, ret, &sqlError); + if(sqlRet == SQLITE_BUSY) { - parentDatabasesComponent->log(LogLevel::Error, "[log_sqlite]: Error executing query."); - parentDatabasesComponent->freeResultSet(*ret); - ret = nullptr; + int sqlRetries = 5; + while (sqlRetries-- > 0) { + parentDatabasesComponent->log(LogLevel::Error, "[log_sqlite]: Error executing query. Database is busy, retrying..."); + sqlite3_sleep(100); + sqlRet = sqlite3_exec(databaseConnectionHandle, query.data(), queryStepExecuted, ret, &sqlError); + if (sqlRet != SQLITE_OK) + { + if(sqlRet != SQLITE_BUSY) + { + if(sqlError) + { + parentDatabasesComponent->log(LogLevel::Error, "[log_sqlite]: Error executing query. %s", sqlError); + } + else + { + parentDatabasesComponent->log(LogLevel::Error, "[log_sqlite]: Error executing query."); + } + break; + } + } + else + { + break; + } + } } + else + { + if(sqlRet != SQLITE_OK) + { + if(sqlError) + { + parentDatabasesComponent->log(LogLevel::Error, "[log_sqlite]: Error executing query. %s", sqlError); + } + else + { + parentDatabasesComponent->log(LogLevel::Error, "[log_sqlite]: Error executing query."); + } + parentDatabasesComponent->freeResultSet(*ret); + ret = nullptr; + } + } + sqlite3_free(sqlError); } else { From 02988dcef1d6f618a533e486e368e1f9f6ab2b1f Mon Sep 17 00:00:00 2001 From: John Magdy Lotfy Kamel <19735243+Zorono@users.noreply.github.com> Date: Thu, 17 Jul 2025 21:20:54 +0300 Subject: [PATCH 2/5] Update databases_component.cpp --- Server/Components/Databases/databases_component.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Server/Components/Databases/databases_component.cpp b/Server/Components/Databases/databases_component.cpp index e709409c9..40d0d4d44 100644 --- a/Server/Components/Databases/databases_component.cpp +++ b/Server/Components/Databases/databases_component.cpp @@ -74,6 +74,11 @@ IDatabaseConnection* DatabasesComponent::open(StringView path, int flags) sqlite3_close_v2(database_connection_handle); } } + else + { + this->log(LogLevel::Error, "[log_sqlite]: Cannot open database '%s'. %s", path.data(), sqlite3_errmsg(database_connection_handle)); + sqlite3_close_v2(database_connection_handle); + } return ret; } From b8f5fc1e935e4a185ab5e3bee918960922f2b122 Mon Sep 17 00:00:00 2001 From: John Magdy Lotfy Kamel <19735243+Zorono@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:23:02 +0300 Subject: [PATCH 3/5] Update databases_component.cpp --- Server/Components/Databases/databases_component.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Server/Components/Databases/databases_component.cpp b/Server/Components/Databases/databases_component.cpp index 40d0d4d44..80fb7404a 100644 --- a/Server/Components/Databases/databases_component.cpp +++ b/Server/Components/Databases/databases_component.cpp @@ -28,6 +28,7 @@ void DatabasesComponent::onLoad(ICore* c) core_ = c; logSQLite_ = core_->getConfig().getBool("logging.log_sqlite"); logSQLiteQueries_ = core_->getConfig().getBool("logging.log_sqlite_queries"); + SQLiteTimeout_ = core_->getConfig().getInt("sqlite_timeout"); } /// To optionally log things from connections. @@ -68,6 +69,10 @@ IDatabaseConnection* DatabasesComponent::open(StringView path, int flags) sqlite3* database_connection_handle(nullptr); if (sqlite3_open_v2(path.data(), &database_connection_handle, flags, nullptr) == SQLITE_OK) { + if(SQLiteTimeout_ && *SQLiteTimeout_) + { + sqlite3_busy_timeout(database_connection_handle, reinterpret_cast(SQLiteTimeout_)); + } ret = databaseConnections.emplace(this, database_connection_handle); if (!ret) { From 1fa17d675814298286ab6c3dbb5d71e813f0d629 Mon Sep 17 00:00:00 2001 From: John Magdy Lotfy Kamel <19735243+Zorono@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:23:44 +0300 Subject: [PATCH 4/5] Update databases_component.hpp --- Server/Components/Databases/databases_component.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/Components/Databases/databases_component.hpp b/Server/Components/Databases/databases_component.hpp index 45ca0459a..edbfd50fe 100644 --- a/Server/Components/Databases/databases_component.hpp +++ b/Server/Components/Databases/databases_component.hpp @@ -26,6 +26,7 @@ class DatabasesComponent final : public IDatabasesComponent, public NoCopy bool* logSQLite_; bool* logSQLiteQueries_; + int* SQLiteTimeout_; ICore* core_; From f2de37507f8b973de54cdc5e82cd7b4cf6574040 Mon Sep 17 00:00:00 2001 From: John Magdy Lotfy Kamel <19735243+Zorono@users.noreply.github.com> Date: Sat, 19 Jul 2025 18:28:12 +0300 Subject: [PATCH 5/5] just a beginner try to fix error with GCC --- Server/Components/Databases/databases_component.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/Components/Databases/databases_component.cpp b/Server/Components/Databases/databases_component.cpp index 80fb7404a..680f69c1f 100644 --- a/Server/Components/Databases/databases_component.cpp +++ b/Server/Components/Databases/databases_component.cpp @@ -71,7 +71,7 @@ IDatabaseConnection* DatabasesComponent::open(StringView path, int flags) { if(SQLiteTimeout_ && *SQLiteTimeout_) { - sqlite3_busy_timeout(database_connection_handle, reinterpret_cast(SQLiteTimeout_)); + sqlite3_busy_timeout(database_connection_handle, *SQLiteTimeout_); } ret = databaseConnections.emplace(this, database_connection_handle); if (!ret)