Enable busy_timeout and be more verbose about problems loading the db

This commit is contained in:
luisangelsm
2026-04-12 13:11:48 +02:00
parent 8fc7c9e814
commit 10843cdf19

View File

@ -129,36 +129,57 @@ QSqlDatabase DataBaseManagement::createDatabase(QString dest)
QSqlDatabase DataBaseManagement::loadDatabase(QString libraryDataPath) 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(); return QSqlDatabase();
} }
QString threadId = QString::number((long long)QThread::currentThreadId(), 16); QString threadId = QString::number((quintptr)QThread::currentThreadId(), 16);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", libraryDataPath + threadId); QString connectionName = dbPath + threadId;
db.setDatabaseName(libraryDataPath + "/library.ydb");
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=2000");
db.setDatabaseName(dbPath);
if (!db.open()) { if (!db.open()) {
const QString error = db.lastError().text();
db = QSqlDatabase();
QSqlDatabase::removeDatabase(connectionName);
QLOG_ERROR() << "loadDatabase: failed to open" << dbPath << error;
return QSqlDatabase(); 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; return db;
} }
QSqlDatabase DataBaseManagement::loadDatabaseFromFile(QString filePath) QSqlDatabase DataBaseManagement::loadDatabaseFromFile(QString filePath)
{ {
if (!QFile::exists(filePath)) { const QString dbPath = QDir::cleanPath(filePath);
if (!QFile::exists(dbPath)) {
return QSqlDatabase(); return QSqlDatabase();
} }
QString threadId = QString::number((long long)QThread::currentThreadId(), 16); QString threadId = QString::number((quintptr)QThread::currentThreadId(), 16);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", filePath + threadId); QString connectionName = dbPath + threadId;
db.setDatabaseName(filePath); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=2000");
db.setDatabaseName(dbPath);
if (!db.open()) { if (!db.open()) {
// se devuelve una base de datos vacía e inválida // 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(); 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; return db;
} }