From 10843cdf198abe34071038f68074b19a65ee34f4 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sun, 12 Apr 2026 13:11:48 +0200 Subject: [PATCH] Enable busy_timeout and be more verbose about problems loading the db --- YACReaderLibrary/db/data_base_management.cpp | 41 +++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/YACReaderLibrary/db/data_base_management.cpp b/YACReaderLibrary/db/data_base_management.cpp index 33c7ed46..5a2389be 100644 --- a/YACReaderLibrary/db/data_base_management.cpp +++ b/YACReaderLibrary/db/data_base_management.cpp @@ -129,36 +129,57 @@ QSqlDatabase DataBaseManagement::createDatabase(QString dest) QSqlDatabase DataBaseManagement::loadDatabase(QString libraryDataPath) { - if (!QFile::exists(libraryDataPath + "/library.ydb")) { + const QString dbPath = QDir::cleanPath(libraryDataPath + "/library.ydb"); + if (!QFile::exists(dbPath)) { return QSqlDatabase(); } - QString threadId = QString::number((long long)QThread::currentThreadId(), 16); - QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", libraryDataPath + threadId); - db.setDatabaseName(libraryDataPath + "/library.ydb"); + QString threadId = QString::number((quintptr)QThread::currentThreadId(), 16); + QString connectionName = dbPath + threadId; + + QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName); + db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=2000"); + db.setDatabaseName(dbPath); if (!db.open()) { + const QString error = db.lastError().text(); + db = QSqlDatabase(); + QSqlDatabase::removeDatabase(connectionName); + QLOG_ERROR() << "loadDatabase: failed to open" << dbPath << error; return QSqlDatabase(); } - QSqlQuery pragma("PRAGMA foreign_keys = ON", db); + QSqlQuery pragmaFK(db); + if (!pragmaFK.exec("PRAGMA foreign_keys = ON")) { + QLOG_ERROR() << "loadDatabase: failed to enable foreign keys for" << dbPath << pragmaFK.lastError().text(); + } return db; } QSqlDatabase DataBaseManagement::loadDatabaseFromFile(QString filePath) { - if (!QFile::exists(filePath)) { + const QString dbPath = QDir::cleanPath(filePath); + if (!QFile::exists(dbPath)) { return QSqlDatabase(); } - QString threadId = QString::number((long long)QThread::currentThreadId(), 16); - QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", filePath + threadId); - db.setDatabaseName(filePath); + QString threadId = QString::number((quintptr)QThread::currentThreadId(), 16); + QString connectionName = dbPath + threadId; + QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName); + db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=2000"); + db.setDatabaseName(dbPath); if (!db.open()) { // se devuelve una base de datos vacía e inválida + const QString error = db.lastError().text(); + db = QSqlDatabase(); + QSqlDatabase::removeDatabase(connectionName); + QLOG_ERROR() << "loadDatabaseFromFile: failed to open" << dbPath << error; return QSqlDatabase(); } - QSqlQuery pragma("PRAGMA foreign_keys = ON", db); + QSqlQuery pragmaFK(db); + if (!pragmaFK.exec("PRAGMA foreign_keys = ON")) { + QLOG_ERROR() << "loadDatabaseFromFile: failed to enable foreign keys for" << dbPath << pragmaFK.lastError().text(); + } return db; }