119 lines
3.0 KiB
C++
119 lines
3.0 KiB
C++
|
|
#include "databasemanager.h"
|
|||
|
|
|
|||
|
|
// Singleton instance
|
|||
|
|
DatabaseManager& DatabaseManager::instance()
|
|||
|
|
{
|
|||
|
|
static DatabaseManager instance;
|
|||
|
|
return instance;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Конструктор: создаем подключение
|
|||
|
|
DatabaseManager::DatabaseManager()
|
|||
|
|
{
|
|||
|
|
db = QSqlDatabase::addDatabase("QSQLITE");
|
|||
|
|
db.setDatabaseName("mydatabase.db");
|
|||
|
|
|
|||
|
|
if (!db.open())
|
|||
|
|
{
|
|||
|
|
qDebug() << "Ошибка открытия БД:" << db.lastError().text();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
qDebug() << "База данных успешно открыта";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Деструктор: закрываем подключение
|
|||
|
|
DatabaseManager::~DatabaseManager()
|
|||
|
|
{
|
|||
|
|
if (db.isOpen())
|
|||
|
|
{
|
|||
|
|
db.close();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Возвращает ссылку на объект БД
|
|||
|
|
QSqlDatabase& DatabaseManager::database()
|
|||
|
|
{
|
|||
|
|
return db;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Выполняет SQL-запрос (без параметров)
|
|||
|
|
bool DatabaseManager::executeQuery(const QString& query)
|
|||
|
|
{
|
|||
|
|
QSqlQuery q;
|
|||
|
|
if (!q.exec(query))
|
|||
|
|
{
|
|||
|
|
qDebug() << "Ошибка выполнения запроса:" << q.lastError().text();
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Выполняет подготовленный SQL-запрос с параметрами
|
|||
|
|
bool DatabaseManager::executePreparedQuery(const QString& query, const QStringList& values)
|
|||
|
|
{
|
|||
|
|
QSqlQuery q;
|
|||
|
|
q.prepare(query);
|
|||
|
|
|
|||
|
|
for (const auto& value : values)
|
|||
|
|
q.addBindValue(value);
|
|||
|
|
|
|||
|
|
if (!q.exec())
|
|||
|
|
{
|
|||
|
|
qDebug() << "Ошибка выполнения подготовленного запроса:" << q.lastError().text();
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QList<QVariantList> DatabaseManager::executeSelectQuery(const QString& query, const QStringList& values)
|
|||
|
|
{
|
|||
|
|
QSqlQuery q;
|
|||
|
|
q.prepare(query);
|
|||
|
|
|
|||
|
|
for (const auto& value : values)
|
|||
|
|
q.addBindValue(value);
|
|||
|
|
|
|||
|
|
if (!q.exec())
|
|||
|
|
{
|
|||
|
|
qDebug() << "Ошибка выполнения SELECT запроса:" << q.lastError().text();
|
|||
|
|
return {};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QList<QVariantList> results;
|
|||
|
|
while (q.next())
|
|||
|
|
{
|
|||
|
|
QVariantList row;
|
|||
|
|
for (int i = 0; i < q.record().count(); ++i)
|
|||
|
|
row.append(q.value(i));
|
|||
|
|
results.append(row);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return results;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QList<QVariantList> DatabaseManager::executeSelect(const SelectBuilder& selectBuilder)
|
|||
|
|
{
|
|||
|
|
const auto queryString = selectBuilder.getSelect();
|
|||
|
|
qDebug() << "Подготовленный запрос: " << queryString;
|
|||
|
|
|
|||
|
|
QSqlQuery q;
|
|||
|
|
if (!q.prepare(queryString))
|
|||
|
|
qDebug() << "Ошибка при подготовке запроса:" << q.lastError().text();
|
|||
|
|
|
|||
|
|
if (!q.exec())
|
|||
|
|
qDebug() << "Ошибка при выполнении запроса:" << q.lastError().text();
|
|||
|
|
|
|||
|
|
QList<QVariantList> results;
|
|||
|
|
while (q.next()) // Проходимся по строкам
|
|||
|
|
{
|
|||
|
|
QVariantList row;
|
|||
|
|
for (int i = 0; i < q.record().count(); ++i) // Проходимся по столбцам
|
|||
|
|
row.append(q.value(i));
|
|||
|
|
results.append(row);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return results;
|
|||
|
|
}
|