69 lines
2.3 KiB
C++
69 lines
2.3 KiB
C++
#include "DatabaseManager.h"
|
||
#include <QCoreApplication>
|
||
#include <QSqlError>
|
||
#include <QDebug>
|
||
#include <QSettings>
|
||
#include <QThread>
|
||
|
||
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);
|
||
const QSettings settings("config.ini", QSettings::IniFormat);
|
||
// qDebug() << settings.value("db/dbPath").toString();
|
||
// db.setDatabaseName(QCoreApplication::applicationDirPath() + "/database/app_data.db");
|
||
db.setDatabaseName(settings.value("db/dbPath").toString());
|
||
|
||
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<quintptr>(QThread::currentThreadId()));
|
||
}
|
||
|
||
|
||
void DatabaseManager::closeConnection() {
|
||
QMutexLocker locker(&mutex);
|
||
if (const QString name = connectionName(); connectionPool.contains(name)) {
|
||
connectionPool.remove(name);
|
||
QSqlDatabase::removeDatabase(name);
|
||
qDebug() << "Соединение" << name << "удалено вручную";
|
||
}
|
||
}
|