#include "DatabaseManager.h" #include #include #include #include DatabaseManager::DatabaseManager() = default; DatabaseManager::~DatabaseManager() { QMutexLocker locker(&mutex); for (auto it = connectionPool.begin(); it != connectionPool.end(); ++it) { QSqlDatabase::removeDatabase(it.key()); } qDebug() << "Все соединения закрыты"; } DatabaseManager &DatabaseManager::instance() { static DatabaseManager instance; return instance; } QSqlDatabase DatabaseManager::database() { QMutexLocker locker(&mutex); QString name = connectionName(); // Создаем новое соединение, если его ещё нет if (!connectionPool.contains(name)) { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", name); db.setDatabaseName(QCoreApplication::applicationDirPath() + "/database/app_data.db"); if (!db.open()) { qWarning() << "Ошибка открытия базы данных:" << db.lastError().text(); } connectionPool[name] = db; // Автоматическое удаление соединения при завершении потока QObject::connect(QThread::currentThread(), &QThread::finished, [this, name]() { QMutexLocker cLocker(&mutex); if (connectionPool.contains(name)) { connectionPool.remove(name); QSqlDatabase::removeDatabase(name); qDebug() << "Соединение" << name << "удалено"; } }); } return connectionPool[name]; } QString DatabaseManager::connectionName() { return QString("connection_%1").arg(reinterpret_cast(QThread::currentThreadId())); } void DatabaseManager::closeConnection() { QMutexLocker locker(&mutex); if (const QString name = connectionName(); connectionPool.contains(name)) { connectionPool.remove(name); QSqlDatabase::removeDatabase(name); qDebug() << "Соединение" << name << "удалено вручную"; } }