Files
2026-07-12 14:34:52 +04:00

112 lines
3.4 KiB
C++

#include "database_manager.h"
#include "config.h"
#include "execute_sql_file.h"
#include <QFile>
#include <QSqlError>
#include <qsqldatabase.h>
DatabaseManager::~DatabaseManager() {
disconnectDefaultDatabase();
QString defaultConnectionName = QSqlDatabase::database().connectionName();
QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());
qInfo() << "Database with default connection name:" << defaultConnectionName
<< "was removed";
}
DatabaseManager::CreateDatabaseResult
DatabaseManager::createDefaultDatabaseIfMissing(
const QString &databaseFileName) {
if (QFile::exists(databaseFileName)) {
qInfo()
<< "Database file name already exists and will not be created again:"
<< databaseFileName;
return CreateDatabaseResult::AlreadyExists;
}
if (!connectToDefaultDatabase(databaseFileName)) {
qWarning() << "Failed to create and connect to the database";
return CreateDatabaseResult::Error;
}
// Execute SQL files to initialize the database
QStringList sqlFiles = {":/sql/create_tables.sql", ":/sql/create_indexes.sql",
":/sql/create_views.sql", ":/sql/create_triggers.sql",
":/sql/insert_role.sql"};
#ifndef NDEBUG
QStringList additionalSqlFiles = {
":/sql/insert_genre.sql", ":/sql/insert_hall.sql",
":/sql/insert_movie.sql", ":/sql/insert_user.sql"};
sqlFiles.append(additionalSqlFiles);
#endif
QSqlDatabase defaultDatabase = QSqlDatabase::database();
bool success = executeSqlFiles(sqlFiles, defaultDatabase);
disconnectDefaultDatabase();
if (success) {
qInfo() << "Database created and initialized successfully";
return CreateDatabaseResult::Success;
}
qWarning() << "Failed to execute initialization SQL files";
if (QFile::remove(databaseFileName)) {
qInfo() << "Database file deleted due to initialization failure:"
<< databaseFileName;
} else {
qWarning() << "Failed to delete database file:" << databaseFileName;
}
return CreateDatabaseResult::Error;
}
bool DatabaseManager::connectToDefaultDatabase(
const QString &databaseFileName) {
QSqlDatabase defaultDatabase = QSqlDatabase::database();
defaultDatabase.setDatabaseName(databaseFileName);
if (defaultDatabase.isValid() && defaultDatabase.isOpen()) {
qInfo() << "Database is already connected";
return true;
}
// Constructor does not open/close the connection
defaultDatabase = QSqlDatabase::addDatabase(DATABASE_DRIVER);
defaultDatabase.setDatabaseName(databaseFileName);
if (!defaultDatabase.open()) {
qWarning() << "Failed to connect to the database:" << databaseFileName;
return false;
}
qDebug() << "Database was connected successfully: Connection name:"
<< defaultDatabase.connectionName();
return true;
}
void DatabaseManager::disconnectDefaultDatabase() {
QSqlDatabase defaultDatabase = QSqlDatabase::database();
if (defaultDatabase.isOpen()) {
defaultDatabase.close();
qInfo() << "Database disconnected";
}
}
bool DatabaseManager::executeSqlFiles(const QStringList &filePaths,
QSqlDatabase &database) {
ExecuteSqlFile executor(database);
for (const QString &filePath : filePaths) {
qInfo() << "Executing SQL file:" << filePath;
if (!executor(filePath)) {
qWarning() << "Failed to execute SQL file:" << filePath;
return false;
}
}
return true;
}