diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index c11c6a6..252f4f9 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -5,6 +5,7 @@ #include #include #include +#include const QString DataBaseLMS::TypeUserDBInstructor = "instructor"; const QString DataBaseLMS::TypeUserDBTrainee = "trainee"; @@ -28,6 +29,225 @@ void DataBaseLMS::slot_LanguageChanged(QString language) QCoreApplication::installTranslator(&qtLanguageTranslator); } +bool DataBaseLMS::checkDriverQPSQLavailable() +{ + return QSqlDatabase::isDriverAvailable("QPSQL"); +} + +bool DataBaseLMS::checkUserLMSexist() +{ + DataBaseSettings dbSett = getDataBaseSettings(); + QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL"); + + dbCheck.setUserName("postgres"); + dbCheck.setPassword("12345678"); + dbCheck.setHostName(dbSett.dbHostName); + dbCheck.setPort(dbSett.dbPort); + + if (dbCheck.open()) + { + QSqlQuery query = QSqlQuery(dbCheck); + query.prepare("SELECT 1 FROM pg_roles WHERE rolname = :username"); + query.bindValue(":username", dbSett.dbUserName); + + if (query.exec() && query.next()) + { + qDebug() << "Пользователь существует."; + return true; + } + else + { + qDebug() << "Пользователь не существует."; + return false; + } + } + else + { + qDebug() << "Ошибка подключения к PostreSQL."; + return false; + } +} + +bool DataBaseLMS::checkDataBaseLMSexist() +{ + DataBaseSettings dbSett = getDataBaseSettings(); + QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL"); + + bool flDBexist = false; + + dbCheck.setUserName("postgres"); + dbCheck.setPassword("12345678"); + dbCheck.setHostName(dbSett.dbHostName); + dbCheck.setPort(dbSett.dbPort); + + if (dbCheck.open()) + { + QString queryStr = QString("SELECT datname FROM pg_database"); + QSqlQuery query = QSqlQuery(dbCheck); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Инструктор + QString nameDB = ""; + nameDB = query.value(0).toString(); + if(nameDB == dbSettings.dbName) + { + flDBexist = true; + break; + } + } + } + } + else + { + qDebug() << "Ошибка подключения к PostreSQL."; + return false; + } + return flDBexist; +} + +bool DataBaseLMS::createUser(QString name) +{ + DataBaseSettings dbSett = getDataBaseSettings(); + QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL"); + + dbCheck.setUserName("postgres"); + dbCheck.setPassword("12345678"); + dbCheck.setHostName(dbSett.dbHostName); + dbCheck.setPort(dbSett.dbPort); + + if (dbCheck.open()) + { + QString queryStr = QString("CREATE USER %1 WITH ENCRYPTED PASSWORD '%2'").arg(dbSett.dbUserName, dbSett.dbPassword); + QSqlQuery query = QSqlQuery(dbCheck); + + if(queryExec(queryStr, &query)) + { + qDebug() << "Пользователь создан."; + return true; + } + else + { + qDebug() << "Пользователь не создан."; + return false; + } + } + else + { + qDebug() << "Ошибка подключения к PostreSQL."; + return false; + } +} + +bool DataBaseLMS::createDB(QString name) +{ + DataBaseSettings dbSett = getDataBaseSettings(); + QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL"); + + dbCheck.setUserName("postgres"); + dbCheck.setPassword("12345678"); + dbCheck.setHostName(dbSett.dbHostName); + dbCheck.setPort(dbSett.dbPort); + + if (dbCheck.open()) + { + //Создание БД + QString queryStr = QString("CREATE DATABASE %1").arg(dbSett.dbName); + QSqlQuery query = QSqlQuery(dbCheck); + + if(queryExec(queryStr, &query)) + { + qDebug() << "БД создана."; + + //Залитие БД + + QProcess process; + //QString pgRestorePath = "C:\\restoreDB.bat"; // Замените на актуальный путь + QString pgRestorePath = "restoreDB.bat"; // Замените на актуальный путь + + /* + QString dbName = "databaselms2"; + QString user = "postgres"; + QString backupFile = "C:\\DBLMS_EMPTY_30_09_2025.backup"; + + QStringList arguments; + arguments << "-d" << dbName; + arguments << "-U" << user; + arguments << backupFile; + */ + + process.start("cmd /C " + pgRestorePath); + process.waitForFinished(-1); // Ждать бесконечно, пока процесс не завершится + + + //Назначение владельца + QString queryStr = QString("ALTER DATABASE %1 OWNER TO %2").arg(dbSett.dbName, dbSett.dbUserName); + QSqlQuery query = QSqlQuery(dbCheck); + if(queryExec(queryStr, &query)) + { + + } + else + return false; + + + + //return true; + } + else + { + qDebug() << "БД не создана."; + return false; + } + + + + + + } + else + { + qDebug() << "Ошибка подключения к PostreSQL."; + return false; + } + + dbCheck.close(); + + QSqlDatabase dbCheck2 = QSqlDatabase::addDatabase("QPSQL"); + + dbCheck2.setUserName("postgres"); + dbCheck2.setPassword("12345678"); + dbCheck2.setHostName(dbSett.dbHostName); + dbCheck2.setPort(dbSett.dbPort); + dbCheck2.setDatabaseName(dbSett.dbName); + + if (dbCheck2.open()) + { + QString newOwner = dbSett.dbUserName; + + // Получаем список таблиц + QSqlQuery query(dbCheck2); + query.exec("SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public';"); + + while (query.next()) + { + QString tableName = query.value(0).toString(); + QString alterQuery = QString("ALTER TABLE %1 OWNER TO %2;").arg(tableName).arg(newOwner); + qDebug() << "Executing: " << alterQuery; + dbCheck2.exec(alterQuery); + /* + if (dbCheck2.exec(alterQuery)) + { + qDebug() << "Error changing owner for table " << tableName << ":" << dbCheck2.lastError().text(); + return false; + }*/ + } + } + + return true; +} + bool DataBaseLMS::createConnection() { dbSettings = getDataBaseSettings(); @@ -36,34 +256,6 @@ bool DataBaseLMS::createConnection() db = new QSqlDatabase(QSqlDatabase::addDatabase(dbSettings.dbType, dbSettings.connectionName)); - /* - db->setUserName(dbSettings.dbUserName); - db->setPassword(dbSettings.dbPassword); - //db->setHostName(dbSettings.dbHostName); - //db->setPort(dbSettings.dbPort); - bool res1 = db->open(); - - //Проверка наличия БД - QString queryStr = QString("SELECT datname FROM pg_database"); - QSqlQuery query = QSqlQuery(*db); - bool flExist = false; - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Инструктор - QString nameDB = ""; - nameDB = query.value(0).toString(); - if(nameDB == dbSettings.dbName) - flExist = true; - - nameDB = query.value(1).toString(); - nameDB = query.value(2).toString(); - nameDB = query.value(3).toString(); - } - } - */ - - db->setDatabaseName(dbSettings.dbName); db->setUserName(dbSettings.dbUserName); db->setPassword(dbSettings.dbPassword); diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index cbd9b98..cc384ec 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -39,6 +39,15 @@ public: static const QString TypeUserDBInstructor; static const QString TypeUserDBTrainee; +public: + //PostgreSQL + bool checkDriverQPSQLavailable(); + bool checkUserLMSexist(); + bool checkDataBaseLMSexist(); + + bool createUser(QString name); + bool createDB(QString name); + protected: //Подключение bool createConnection(); diff --git a/ServerLMS/CMakeLists.txt b/ServerLMS/CMakeLists.txt index 606a643..9390473 100644 --- a/ServerLMS/CMakeLists.txt +++ b/ServerLMS/CMakeLists.txt @@ -12,6 +12,9 @@ add_library(ServerLMS SHARED dialogsettingstray.cpp dialogsettingstray.h dialogsettingstray.ui + dialogcheckdb.cpp + dialogcheckdb.h + dialogcheckdb.ui clienthandler.cpp clienthandler.h multithreadserver.cpp diff --git a/ServerLMS/ServerLMS.qrc b/ServerLMS/ServerLMS.qrc index 29a560f..42b4a34 100644 --- a/ServerLMS/ServerLMS.qrc +++ b/ServerLMS/ServerLMS.qrc @@ -16,5 +16,8 @@ resources/icons/stop.png resources/icons/settings.png resources/icons/circleGray.png + resources/icons/checkDB.png + resources/icons/editorDB.png + resources/icons/procedure.png diff --git a/ServerLMS/dialogcheckdb.cpp b/ServerLMS/dialogcheckdb.cpp new file mode 100644 index 0000000..4c639cf --- /dev/null +++ b/ServerLMS/dialogcheckdb.cpp @@ -0,0 +1,111 @@ +#include +#include +#include "dialogcheckdb.h" +#include "ui_dialogcheckdb.h" + +DialogCheckDB::DialogCheckDB(ProviderDBLMS* providerDBLMS, QWidget *parent) : + QDialog(parent), + ui(new Ui::DialogCheckDB), + providerDBLMS(providerDBLMS), + resDriver(false), + resUser(false), + resDB(false) +{ + ui->setupUi(this); + + ui->btnRepare->setEnabled(false); + + check(); +} + +DialogCheckDB::~DialogCheckDB() +{ + delete ui; +} + +void DialogCheckDB::check() +{ + resDriver = false; + resUser = false; + resDB = false; + + resDriver = providerDBLMS->checkDriverQPSQLavailable(); + if(resDriver) + { + ui->lblDriverRes->setText(tr("Installed")); + ui->lblDriverResIco->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png"))); + } + else + { + ui->lblDriverRes->setText(tr("Not installed")); + ui->lblDriverResIco->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleRed.png"))); + } + + resUser = providerDBLMS->checkUserLMSexist(); + if(resUser) + { + ui->lblUserRes->setText(tr("Exist")); + ui->lblUserResIco->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png"))); + } + else + { + ui->lblUserRes->setText(tr("Not exist")); + ui->lblUserResIco->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleRed.png"))); + } + + resDB = providerDBLMS->checkDataBaseLMSexist(); + if(resDB) + { + ui->lblDBRes->setText(tr("Exist")); + ui->lblDBResIco->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png"))); + } + else + { + ui->lblDBRes->setText(tr("Not exist")); + ui->lblDBResIco->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleRed.png"))); + } + + if(!resDriver || !resUser || !resDB) + ui->btnRepare->setEnabled(true); + else + ui->btnRepare->setEnabled(false); +} + +void DialogCheckDB::on_btnRepare_clicked() +{ + if(!resDriver) + { + QMessageBox::warning(this, tr("Warning!"), tr("Install PostgreSQL.")); + return; + } + + if(!resUser) + { + if(!providerDBLMS->createUser("nameUser")) + { + QMessageBox::critical(this, tr("Error!"), tr("Failed to create user!")); + return; + } + } + + if(!resDB) + { + if(!providerDBLMS->createDB("nameDB")) + { + QMessageBox::critical(this, tr("Error!"), tr("Failed to create Database!")); + return; + } + } +} + +void DialogCheckDB::on_toolButton_clicked() +{ + QProcess process; + QString program = "cmd.exe"; + QStringList arguments; + arguments << "/C" << "echo Hello from QProcess" << "&&" << "pause"; + process.start(program, arguments); + process.waitForFinished(); + + int i = 0; +} diff --git a/ServerLMS/dialogcheckdb.h b/ServerLMS/dialogcheckdb.h new file mode 100644 index 0000000..43252bd --- /dev/null +++ b/ServerLMS/dialogcheckdb.h @@ -0,0 +1,37 @@ +#ifndef DIALOGCHECKDB_H +#define DIALOGCHECKDB_H + +#include +#include "providerdblms.h" + +namespace Ui { +class DialogCheckDB; +} + +class DialogCheckDB : public QDialog +{ + Q_OBJECT + +public: + explicit DialogCheckDB(ProviderDBLMS* providerDBLMS, QWidget *parent = nullptr); + ~DialogCheckDB(); + +private slots: + void on_btnRepare_clicked(); + + void on_toolButton_clicked(); + +private: + void check(); + +private: + Ui::DialogCheckDB *ui; + + ProviderDBLMS* providerDBLMS; + + bool resDriver; + bool resUser; + bool resDB; +}; + +#endif // DIALOGCHECKDB_H diff --git a/ServerLMS/dialogcheckdb.ui b/ServerLMS/dialogcheckdb.ui new file mode 100644 index 0000000..1bc6b07 --- /dev/null +++ b/ServerLMS/dialogcheckdb.ui @@ -0,0 +1,244 @@ + + + DialogCheckDB + + + + 0 + 0 + 400 + 300 + + + + Database + + + + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + Driver PostgreSQL + + + + + + + ... + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + 32 + 32 + + + + + + + :/resources/icons/circleGray.png + + + + + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + User + + + + + + + ... + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + 32 + 32 + + + + + + + :/resources/icons/circleGray.png + + + + + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + Database + + + + + + + ... + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + 32 + 32 + + + + + + + :/resources/icons/circleGray.png + + + + + + + + + + + + 32 + 32 + + + + ... + + + + + + + + 58 + 58 + + + + Repare + + + + :/resources/icons/procedure.png:/resources/icons/procedure.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + + + + + + + + + + diff --git a/ServerLMS/dialogsettingstray.cpp b/ServerLMS/dialogsettingstray.cpp index cc70e91..ba3d775 100644 --- a/ServerLMS/dialogsettingstray.cpp +++ b/ServerLMS/dialogsettingstray.cpp @@ -2,11 +2,13 @@ #include "dialogsettingstray.h" #include "Systems/tools.h" #include "ui_dialogsettingstray.h" +#include "dialogcheckdb.h" -DialogSettingsTray::DialogSettingsTray(QWidget *parent) : +DialogSettingsTray::DialogSettingsTray(ProviderDBLMS* providerDBLMS, QWidget *parent) : QDialog(parent), ui(new Ui::DialogSettingsTray), settings(nullptr), + providerDBLMS(providerDBLMS), flSettingsServerChanged(false) { ui->setupUi(this); @@ -226,3 +228,19 @@ void DialogSettingsTray::on_editPassword_textChanged(const QString &arg1) ui->btnSave->setEnabled(true); flSettingsServerChanged = true; } + +void DialogSettingsTray::on_btnCheckDB_clicked() +{ + DialogCheckDB dlgCheckDB(providerDBLMS, this); + dlgCheckDB.setWindowFlags(dlgCheckDB.windowFlags() & ~Qt::WindowContextHelpButtonHint); + + switch( dlgCheckDB.exec() ) + { + case QDialog::Accepted: + break; + case QDialog::Rejected: + break; + default: + break; + } +} diff --git a/ServerLMS/dialogsettingstray.h b/ServerLMS/dialogsettingstray.h index 956c17b..72f0916 100644 --- a/ServerLMS/dialogsettingstray.h +++ b/ServerLMS/dialogsettingstray.h @@ -4,6 +4,7 @@ #include #include #include +#include "providerdblms.h" class ServerDBSettings{ public: @@ -25,7 +26,7 @@ class DialogSettingsTray : public QDialog Q_OBJECT public: - explicit DialogSettingsTray(QWidget *parent = nullptr); + explicit DialogSettingsTray(ProviderDBLMS* providerDBLMS, QWidget *parent = nullptr); ~DialogSettingsTray(); ServerDBSettings getSettings(); @@ -55,6 +56,8 @@ private slots: void on_editPassword_textChanged(const QString &arg1); + void on_btnCheckDB_clicked(); + private: bool saveSettings(); @@ -63,6 +66,8 @@ private: ServerDBSettings *settings; + ProviderDBLMS* providerDBLMS; + bool flSettingsServerChanged; }; diff --git a/ServerLMS/dialogsettingstray.ui b/ServerLMS/dialogsettingstray.ui index eb88158..e970c9d 100644 --- a/ServerLMS/dialogsettingstray.ui +++ b/ServerLMS/dialogsettingstray.ui @@ -7,7 +7,7 @@ 0 0 400 - 324 + 427 @@ -179,6 +179,36 @@ + + + + + + + 58 + 58 + + + + Check DB + + + + :/resources/icons/checkDB.png:/resources/icons/checkDB.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + @@ -238,6 +268,7 @@ + diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index f2d504e..c34bd4d 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -64,6 +64,31 @@ DataBaseSettings ProviderDBLMS::getDBSettings() return dbLMS->getDataBaseSettings(); } +bool ProviderDBLMS::checkDriverQPSQLavailable() +{ + return dbLMS->checkDriverQPSQLavailable(); +} + +bool ProviderDBLMS::checkUserLMSexist() +{ + return dbLMS->checkUserLMSexist(); +} + +bool ProviderDBLMS::checkDataBaseLMSexist() +{ + return dbLMS->checkDataBaseLMSexist(); +} + +bool ProviderDBLMS::createUser(QString name) +{ + return dbLMS->createUser(name); +} + +bool ProviderDBLMS::createDB(QString name) +{ + return dbLMS->createDB(name); +} + QString ProviderDBLMS::getMainInstructorName() { mtxAccess.lock(); diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index 15ad89d..d2821b2 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -80,6 +80,14 @@ public: bool DBisConnected(); DataBaseSettings getDBSettings(); + //PostgreSQL + bool checkDriverQPSQLavailable(); + bool checkUserLMSexist(); + bool checkDataBaseLMSexist(); + + bool createUser(QString name); + bool createDB(QString name); + private: InterfaceDataBaseLMS* dbLMS; QMutex mtxAccess; diff --git a/ServerLMS/resources/icons/checkDB.png b/ServerLMS/resources/icons/checkDB.png new file mode 100644 index 0000000..91895c2 Binary files /dev/null and b/ServerLMS/resources/icons/checkDB.png differ diff --git a/ServerLMS/resources/icons/editorDB.png b/ServerLMS/resources/icons/editorDB.png new file mode 100644 index 0000000..bb4ab4e Binary files /dev/null and b/ServerLMS/resources/icons/editorDB.png differ diff --git a/ServerLMS/resources/icons/procedure.png b/ServerLMS/resources/icons/procedure.png new file mode 100644 index 0000000..ca2800a Binary files /dev/null and b/ServerLMS/resources/icons/procedure.png differ diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index baaa8bf..d5dd3a3 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -179,7 +179,7 @@ void ServerLMSWidget::on_btnStopServer_clicked() void ServerLMSWidget::on_btnSettings_clicked() { - DialogSettingsTray dlg(this); + DialogSettingsTray dlg(providerDBLMS, this); dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint); connect(&dlg, &DialogSettingsTray::signal_LanguageChanged, this, &ServerLMSWidget::slot_LanguageChanged);