/
seneka.y
/
ClientServer
Обзор
Документация
Войти
/
seneka.y
/
ClientServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server/database.cpp
192 строки
4 KB
Julia Sinika
Initial commit
09 ноя 2025, 22:05
09 ноя 2025, 22:05
bfef146
Код
Авторство
О чём код?
#include "database.h" #include <QSqlQuery> #include <QSqlError> #include <QSqlRecord> #include <QDebug> #include <QThread> #include <QJsonObject> Database::Database() : m_dbPath("users.db") {} Database::~Database() { const QStringList connections = QSqlDatabase::connectionNames(); for (const QString& conn : connections) { QSqlDatabase::removeDatabase(conn); } } Database& Database::instance() { static Database inst; return inst; } bool Database::initialize(const QString& dbPath) { QMutexLocker locker(&m_mutex); m_dbPath = dbPath; QSqlDatabase db = getConnection(); if (!db.isOpen()) { qCritical() << "Failed to open database:" << db.lastError().text(); return false; } return createTable(); } QSqlDatabase Database::getConnection() { QString connectionName = QString("db_%1").arg((qint64)QThread::currentThread(), 0, 16); if (QSqlDatabase::contains(connectionName)) { QSqlDatabase db = QSqlDatabase::database(connectionName); if (db.isOpen()) { return db; } } QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName); db.setDatabaseName(m_dbPath); if (!db.open()) { qCritical() << "Failed to open database:" << db.lastError().text(); return QSqlDatabase(); } return db; } bool Database::createTable() { QSqlDatabase db = getConnection(); if (!db.isOpen()) { qCritical() << "Database not open"; return false; } QSqlQuery query(db); QString createTableSQL = R"( CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, email TEXT NOT NULL ) )"; if (!query.exec(createTableSQL)) { qCritical() << "Failed to create table:" << query.lastError().text(); return false; } return true; } bool Database::addUser(const QString& username, const QString& email, QString& errorMsg) { QMutexLocker locker(&m_mutex); QSqlDatabase db = getConnection(); if (!db.isOpen()) { errorMsg = "Database not open"; return false; } QSqlQuery query(db); query.prepare("INSERT INTO users (username, email) VALUES (:username, :email)"); query.addBindValue(username); query.addBindValue(email); if (!query.exec()) { errorMsg = query.lastError().text(); return false; } return true; } QJsonArray Database::getAllUsers(QString& errorMsg) { QMutexLocker locker(&m_mutex); QJsonArray usersArray; QSqlDatabase db = getConnection(); if (!db.isOpen()) { errorMsg = "Database not open"; return usersArray; } QSqlQuery query(db); if (!query.exec("SELECT id, username, email FROM users")) { errorMsg = query.lastError().text(); return usersArray; } int count = 0; while (query.next()) { QJsonObject user; user["id"] = query.value(0).toInt(); user["username"] = query.value(1).toString(); user["email"] = query.value(2).toString(); usersArray.append(user); count++; } return usersArray; } bool Database::deleteUser(int id, QString& errorMsg) { QMutexLocker locker(&m_mutex); QSqlDatabase db = getConnection(); if (!db.isOpen()) { errorMsg = "Database not open"; return false; } QSqlQuery query(db); query.prepare("DELETE FROM users WHERE id = :id"); query.addBindValue(id); if (!query.exec()) { errorMsg = query.lastError().text(); return false; } int rowsAffected = query.numRowsAffected(); if (rowsAffected == 0) { errorMsg = "User not found"; return false; } return true; } bool Database::updateUser(int id, const QString& username, const QString& email, QString& errorMsg) { QMutexLocker locker(&m_mutex); QSqlDatabase db = getConnection(); if (!db.isOpen()) { errorMsg = "Database not open"; return false; } QSqlQuery query(db); query.prepare("UPDATE users SET username = :username, email = :email WHERE id = :id"); query.addBindValue(username); query.addBindValue(email); query.addBindValue(id); if (!query.exec()) { errorMsg = query.lastError().text(); return false; } int rowsAffected = query.numRowsAffected(); if (rowsAffected == 0) { errorMsg = "User not found"; return false; } return true; }