diff --git a/DataBaseLMS/CMakeLists.txt b/DataBaseLMS/CMakeLists.txt index 1a7dd55..6ed1ff7 100644 --- a/DataBaseLMS/CMakeLists.txt +++ b/DataBaseLMS/CMakeLists.txt @@ -5,6 +5,11 @@ common_info_for_project(DataBaseLMS) add_library(DataBaseLMS SHARED DataBaseLMS_global.h databaselms.cpp + databaselms_tasks.cpp + databaselms_groups.cpp + databaselms_users.cpp + databaselms_instructors.cpp + databaselms_trainees.cpp databaselms.h interfacedatabaselms.cpp interfacedatabaselms.h @@ -28,6 +33,7 @@ add_library(DataBaseLMS SHARED timingoftrainee.cpp timingoftrainee.h contactModel.h + resources.qrc ) target_link_libraries(DataBaseLMS PRIVATE Qt5::Widgets) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 23892cf..b1a0771 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -4,10 +4,15 @@ #include #include #include +#include -DataBaseLMS::DataBaseLMS(): +const QString DataBaseLMS::TypeUserDBInstructor = "instructor"; +const QString DataBaseLMS::TypeUserDBTrainee = "trainee"; + +DataBaseLMS::DataBaseLMS(QWidget *ownerWidget): db(nullptr), - transactionBegined(false) + transactionBegined(false), + ownerWidget(ownerWidget) { } @@ -19,8 +24,6 @@ DataBaseLMS::~DataBaseLMS() bool DataBaseLMS::createConnection() { - mtxAccess.lock(); - dbSettings = getDataBaseSettings(); dbSettings.connectionName = "Connection_" + dbSettings.dbName; @@ -36,26 +39,19 @@ bool DataBaseLMS::createConnection() if(!res) { - mtxAccess.unlock(); deleteConnection(); return false; } else { bool flHas = db->driver()->hasFeature(QSqlDriver::Transactions); - - //bool resBool = QSqlDatabase::database(connectionName).transaction(); - //resBool = QSqlDatabase::database(connectionName).commit(); - - mtxAccess.unlock(); + qDebug() << "db->driver()->hasFeature(QSqlDriver::Transactions): " << flHas; return true; } } void DataBaseLMS::deleteConnection() { - mtxAccess.lock(); - if(transactionBegined) QSqlDatabase::database().rollback(); @@ -67,29 +63,21 @@ void DataBaseLMS::deleteConnection() delete db; db = nullptr; } - - mtxAccess.unlock(); } bool DataBaseLMS::isConnected() { - mtxAccess.lock(); - if(db == nullptr) { - mtxAccess.unlock(); return false; } else { if(db->isOpen()) { - mtxAccess.unlock(); return true; } } - - mtxAccess.unlock(); return false; } @@ -99,7 +87,7 @@ DataBaseSettings DataBaseLMS::getDataBaseSettings() QFile file("config/settings.xml"); if(!file.open(QIODevice::ReadOnly)) { - QMessageBox::critical(nullptr, "Attention!", "The file could not be opened: config/settings.xml"); + QMessageBox::critical(ownerWidget, "Attention!", "The file could not be opened: config/settings.xml"); return settings; } QXmlStreamReader xmlReader(&file); @@ -111,7 +99,8 @@ DataBaseSettings DataBaseLMS::getDataBaseSettings() if(xmlReader.name() == "DataBaseSettings") { - foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()){ + foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) + { QString name = attr.name().toString(); QString value = attr.value().toString(); @@ -150,1597 +139,6 @@ DataBaseSettings DataBaseLMS::getDataBaseSettings() return settings; } -bool DataBaseLMS::transactionBegin() -{ - /* - if(transactionBegined) - QSqlDatabase::database().rollback(); - - transactionBegined = true; - - return QSqlDatabase::database().transaction(); - */ - return true; -} - -bool DataBaseLMS::transactionEnd() -{ - /* - if(transactionBegined) - { - transactionBegined = false; - - return QSqlDatabase::database().commit(); - } - return false; - */ - return true; -} - -QList DataBaseLMS::selectAllInstructors() -{ - QList listInstructors; - - QString queryStr = QString("SELECT instructor_id, name, login, password, is_admin, archived, logged_in " - "FROM public.instructors " - "ORDER BY instructor_id ASC"); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Инструктор - Instructor instructor; - instructor.setID(query.value(0).toInt()); - instructor.setName(query.value(1).toString()); - instructor.setLogin(query.value(2).toString()); - instructor.setPassword(query.value(3).toString()); - instructor.setIsAdmin(query.value(4).toBool()); - instructor.setArchived(query.value(5).toBool()); - instructor.setLoggedIn(query.value(6).toBool()); - - listInstructors.append(instructor); - } - } - - return listInstructors; -} - -QList DataBaseLMS::selectAllTrainees() -{ - QList listTrainees; - - QString queryStr = QString("SELECT trainees.trainee_id, trainees.name, trainees.login, trainees.password, trainees.archived, trainees.logged_in, " - "groups.group_id, groups.name, " - "computers.computer_id, computers.name, computers.ip_address, " - "classrooms.classroom_id, classrooms.name " - "FROM public.trainees JOIN public.groups ON groups.group_id = trainees.group_trainee " - "LEFT OUTER JOIN public.computers ON computers.computer_id = trainees.computer_trainee " - "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.classroom_computer " - "ORDER BY groups.name, trainees.name ASC"); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Обучаемый - Trainee trainee; - - trainee.setID(query.value(0).toInt()); - trainee.setName(query.value(1).toString()); - trainee.setLogin(query.value(2).toString()); - trainee.setPassword(query.value(3).toString()); - trainee.setArchived(query.value(4).toBool()); - trainee.setLoggedIn(query.value(5).toBool()); - - Group group = Group(query.value(6).toInt(), query.value(7).toString()); - trainee.setGroup(group); - - Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); - Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); - trainee.setComputer(computer); - - listTrainees.append(trainee); - } - } - - return listTrainees; -} - -QList DataBaseLMS::selectAllGroups() -{ - QList listGroups; - - QString queryStr = QString("SELECT group_id, name " - "FROM public.groups " - "ORDER BY group_id ASC"); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Группа - Group group; - group.setID(query.value(0).toInt()); - group.setName(query.value(1).toString()); - - listGroups.append(group); - } - } - - return listGroups; -} - -Instructor DataBaseLMS::selectInstructor(int id_instructor) -{ - Instructor instructor; - - QString queryStr = QString("SELECT instructor_id, name, login, password, is_admin, archived, logged_in " - "FROM public.instructors " - "WHERE instructors.instructor_id = %1 ").arg( - id_instructor); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Инструктор - instructor.setID(query.value(0).toInt()); - instructor.setName(query.value(1).toString()); - instructor.setLogin(query.value(2).toString()); - instructor.setPassword(query.value(3).toString()); - instructor.setIsAdmin(query.value(4).toBool()); - instructor.setArchived(query.value(5).toBool()); - instructor.setLoggedIn(query.value(6).toBool()); - } - } - - return instructor; -} - -int DataBaseLMS::selectInstructorID(QString login, QString password) -{ - QString queryStr; - - if(password != QStringLiteral("")) - { - queryStr = QString("SELECT instructors.instructor_id " - "FROM public.instructors " - "WHERE login = '%1' AND password = '%2' ").arg( - login, - password ); - } - else - { - queryStr = QString("SELECT instructors.instructor_id " - "FROM public.instructors " - "WHERE login = '%1' ").arg( - login ); - } - - return queryExecInt(queryStr); -} - -QString DataBaseLMS::selectInstructorNameByLogin(QString login) -{ - QString queryStr = QString("SELECT instructors.name " - "FROM public.instructors " - "WHERE instructors.login = '%1' ").arg( - login ); - - return queryExecString(queryStr); -} - -bool DataBaseLMS::selectInstructorIsAdmin(int id_instructor) -{ - QString queryStr = QString("SELECT instructors.is_admin " - "FROM public.instructors " - "WHERE instructor_id = %1 ").arg( - id_instructor ); - - return queryExecBool(queryStr); -} - -bool DataBaseLMS::selectInstructorLoggedIn(int id_instructor) -{ - QString queryStr = QString("SELECT instructors.logged_in " - "FROM public.instructors " - "WHERE instructor_id = %1 ").arg( - id_instructor ); - - return queryExecBool(queryStr); -} - -bool DataBaseLMS::selectInstructorArchived(int id_instructor) -{ - QString queryStr = QString("SELECT instructors.archived " - "FROM public.instructors " - "WHERE instructor_id = %1 ").arg( - id_instructor ); - - return queryExecBool(queryStr); -} - -int DataBaseLMS::updateInstructorLoggedIn(int id_instructor, bool loggedIn) -{ - QString queryStr = QString("UPDATE public.instructors " - "SET logged_in = %1 " - "WHERE instructor_id = %2 " - "RETURNING instructors.instructor_id").arg( - loggedIn ? "true" : "false", - QString::number(id_instructor) ); - - return queryExecInt(queryStr); -} - -bool DataBaseLMS::updateAllInstructorsLoggedIn(bool loggedIn) -{ - QString queryStr = QString("UPDATE public.instructors " - "SET logged_in = %1 ").arg( - loggedIn ? "true" : "false"); - - QSqlQuery query = QSqlQuery(*db); - - return queryExec(queryStr, &query); -} - -int DataBaseLMS::updateInstructorArchived(int id_instructor, bool archived) -{ - QString queryStr = QString("UPDATE public.instructors " - "SET archived = %1 " - "WHERE instructor_id = %2 " - "RETURNING instructors.instructor_id").arg( - archived ? "true" : "false", - QString::number(id_instructor) ); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::insertInstructor() -{ - QString queryStr = QString("INSERT INTO public.instructors " - "DEFAULT VALUES " - "RETURNING instructor_id"); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::insertInstructor(Instructor instructor) -{ - QString queryStr = QString("INSERT INTO public.instructors (name, login, password, is_admin, archived, logged_in) " - "VALUES ('%1', '%2', '%3', %4, %5, %6) " - "RETURNING instructor_id").arg( - instructor.getName(), - instructor.getLogin(), - instructor.getPassword(), - instructor.getIsAdmin() ? "true" : "false", - instructor.getArchived() ? "true" : "false", - instructor.getLoggedIn() ? "true" : "false"); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::deleteInstructor(int id_instructor) -{ - QString queryStr = QString("DELETE FROM public.instructors " - "WHERE instructor_id = %1 " - "RETURNING instructors.instructor_id").arg( - QString::number(id_instructor)); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::updateInstructor(Instructor instructor) -{ - QString queryStr = QString("UPDATE public.instructors " - "SET name = '%1', login = '%2', password = '%3', is_admin = %4, archived = %5, logged_in = %6 " - "WHERE instructor_id = %7 " - "RETURNING instructors.instructor_id").arg( - instructor.getName(), - instructor.getLogin(), - instructor.getPassword(), - instructor.getIsAdmin() ? "true" : "false", - instructor.getArchived() ? "true" : "false", - instructor.getLoggedIn() ? "true" : "false", - QString::number(instructor.getID()) ); - - return queryExecInt(queryStr); -} - -Group DataBaseLMS::selectGroup(int id_group) -{ - Group group; - - QString queryStr = QString("SELECT group_id, name " - "FROM public.groups " - "WHERE groups.group_id = %1 ").arg( - id_group); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Инструктор - group.setID(query.value(0).toInt()); - group.setName(query.value(1).toString()); - } - } - - return group; -} - -int DataBaseLMS::insertGroup() -{ - QString queryStr = QString("INSERT INTO public.groups " - "DEFAULT VALUES " - "RETURNING group_id"); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::insertGroup(Group group) -{ - QString queryStr = QString("INSERT INTO public.groups (name) " - "VALUES ('%1') " - "RETURNING groups.group_id").arg( - group.getName()); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::deleteGroup(int id_group) -{ - QString queryStr = QString("DELETE FROM public.groups " - "WHERE group_id = %1 " - "RETURNING groups.group_id").arg( - QString::number(id_group)); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::updateGroup(Group group) -{ - QString queryStr = QString("UPDATE public.groups SET name = '%1' " - "WHERE group_id = %2 " - "RETURNING groups.group_id").arg( - group.getName(), - QString::number(group.getID()) ); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee) -{ - task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки - - QString queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, trainee_task) " - "VALUES ('%1', '%2', %3) " - "RETURNING tasks_amm.task_id").arg( - task.ammProcedure.title, - task.ammProcedure.dmCode, - QString::number(id_trainee)); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::updateTaskAMM(TaskAmmFim task) -{ - task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки - - QString queryStr = QString("UPDATE public.tasks_amm SET title = '%1', dm_code = '%2', status = '%3' " - "WHERE task_id = %4 " - "RETURNING tasks_amm.task_id").arg( - task.ammProcedure.title, - task.ammProcedure.dmCode, - task.status, - QString::number(task.getID()) ); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::updateStatusTaskAMM(int task_id, QString status) -{ - QString queryStr; - bool resBool = false; - int id_trainee = 0; - - resBool = db->transaction(); - - queryStr = QString("SELECT trainees.trainee_id " - "FROM public.trainees JOIN public.tasks_amm ON trainees.trainee_id = tasks_amm.trainee_task " - "WHERE tasks_amm.task_id = %1 " - "ORDER BY trainees.trainee_id ASC").arg( - QString::number(task_id)); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Обучаемый - id_trainee = query.value(0).toInt(); - } - } - if(!id_trainee) - { - resBool = db->rollback(); - return 0; - } - - - queryStr = QString("UPDATE public.tasks_amm SET status = '%1' " - "WHERE task_id = %2 " - "RETURNING tasks_amm.task_id").arg( - status, - QString::number(task_id) ); - - - if(!queryExecInt(queryStr)) - { - resBool = db->rollback(); - return 0; - } - - resBool = db->commit(); - return id_trainee; -} - -int DataBaseLMS::deleteTaskAMM(int id_task) -{ - QString queryStr; - bool resBool = false; - int id_trainee = 0; - - resBool = db->transaction(); - - queryStr = QString("SELECT trainees.trainee_id " - "FROM public.trainees JOIN public.tasks_amm ON trainees.trainee_id = tasks_amm.trainee_task " - "WHERE tasks_amm.task_id = %1 " - "ORDER BY trainees.trainee_id ASC").arg( - QString::number(id_task)); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Обучаемый - id_trainee = query.value(0).toInt(); - } - } - if(!id_trainee) - { - resBool = db->rollback(); - return 0; - } - - queryStr = QString("DELETE FROM public.tasks_amm " - "WHERE task_id = %1 " - "RETURNING tasks_amm.task_id").arg( - QString::number(id_task)); - - if(!queryExecInt(queryStr)) - { - resBool = db->rollback(); - return 0; - } - - resBool = db->commit(); - return id_trainee; -} - -QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) -{ - QList listTasks; - - QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status, " - "trainees.trainee_id " - "FROM public.tasks_amm JOIN public.trainees ON trainees.trainee_id = tasks_amm.trainee_task " - "WHERE tasks_amm.trainee_task = %1 " - "ORDER BY tasks_amm.task_id ASC").arg( - id_trainee); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Задача - TaskAmmFim task; - - task.setID(query.value(0).toInt()); - task.ammProcedure.title = query.value(1).toString(); - task.ammProcedure.dmCode = query.value(2).toString(); - task.status = query.value(3).toString(); - - listTasks.append(task); - } - } - - return listTasks; -} - -TaskAmmFim DataBaseLMS::selectTaskAMMbyID(int id_task) -{ - TaskAmmFim task; - - QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status " - "FROM public.tasks_amm " - "WHERE tasks_amm.task_id = %1 " - "ORDER BY tasks_amm.task_id ASC").arg( - id_task); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Задача - task.setID(query.value(0).toInt()); - task.ammProcedure.title = query.value(1).toString(); - task.ammProcedure.dmCode = query.value(2).toString(); - task.status = query.value(3).toString(); - } - } - - return task; -} - -int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) -{ - QString queryStr; - bool resBool = false; - - resBool = db->transaction(); - - task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки - - queryStr = QString("INSERT INTO public.tasks_fim (title, trainee_task) " - "VALUES ('%1', %2) " - "RETURNING tasks_fim.task_id").arg( - task.title, - QString::number(id_trainee)); - - int task_id = queryExecInt(queryStr); - if(!task_id) - { - resBool = db->rollback(); - return 0; - } - - for(Malfunction malfanction : task.malfunctionList) - { - malfanction.description = malfanction.description.replace("'", "''"); //Задваиваем одинарные кавычки - - queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, task_fim_malf) " - "VALUES ('%1', '%2', '%3', %4) " - "RETURNING malfunctions.malfunction_id").arg( - malfanction.num, - malfanction.dmCode, - malfanction.description, - QString::number(task_id)); - - int malfunction_id = queryExecInt(queryStr); - if(!malfunction_id) - { - resBool = db->rollback(); - return 0; - } - - //Sign - for(MalfunctionSign sign : malfanction.malfunctionSigns) - { - sign.description = sign.description.replace("'", "''"); //Задваиваем одинарные кавычки - - queryStr = QString("INSERT INTO public.malf_sign (type, description, malf_malf_sign) " - "VALUES ('%1', '%2', %3) " - "RETURNING malf_sign.sign_id").arg( - QString::number(sign.type), - sign.description, - QString::number(malfunction_id)); - - if(!queryExecInt(queryStr)) - { - resBool = db->rollback(); - return 0; - } - } - } - - resBool = db->commit(); - return task_id; -} - -int DataBaseLMS::updateTaskFIM(TaskAmmFim task) -{ - task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки - - QString queryStr = QString("UPDATE public.tasks_fim SET title = '%1', status = '%2' " - "WHERE task_id = %3 " - "RETURNING tasks_fim.task_id").arg( - task.title, - task.status, - QString::number(task.getID()) ); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::updateStatusTaskFIM(int task_id, QString status) -{ - QString queryStr; - bool resBool = false; - int id_trainee = 0; - - resBool = db->transaction(); - - queryStr = QString("SELECT trainees.trainee_id " - "FROM public.trainees JOIN public.tasks_fim ON trainees.trainee_id = tasks_fim.trainee_task " - "WHERE tasks_fim.task_id = %1 " - "ORDER BY trainees.trainee_id ASC").arg( - QString::number(task_id)); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Обучаемый - id_trainee = query.value(0).toInt(); - } - } - if(!id_trainee) - { - resBool = db->rollback(); - return 0; - } - - queryStr = QString("UPDATE public.tasks_fim SET status = '%1' " - "WHERE task_id = %2 " - "RETURNING tasks_fim.task_id").arg( - status, - QString::number(task_id) ); - - QSqlQuery query1 = QSqlQuery(*db); - if(!queryExec(queryStr, &query1)) - { - resBool = db->rollback(); - return 0; - } - - resBool = db->commit(); - return id_trainee; -} - -int DataBaseLMS::deleteTaskFIM(int id_task) -{ - QString queryStr; - bool resBool = false; - int id_trainee = 0; - - resBool = db->transaction(); - - queryStr = QString("SELECT trainees.trainee_id " - "FROM public.trainees JOIN public.tasks_fim ON trainees.trainee_id = tasks_fim.trainee_task " - "WHERE tasks_fim.task_id = %1 " - "ORDER BY trainees.trainee_id ASC").arg( - QString::number(id_task)); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Обучаемый - id_trainee = query.value(0).toInt(); - } - } - if(!id_trainee) - { - resBool = db->rollback(); - return 0; - } - - //Выгребаем все malfunction для этой задачи - queryStr = QString("SELECT malfunctions.malfunction_id " - "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.task_fim_malf " - "WHERE malfunctions.task_fim_malf = %1 " - "ORDER BY malfunctions.malfunction_id ASC").arg( - id_task); - QSqlQuery queryMalf = QSqlQuery(*db); - - if(queryExec(queryStr, &queryMalf)) - { - while (queryMalf.next()) - {//Неисправность - int malfunction_id = 0; - - malfunction_id = queryMalf.value(0).toString().toInt(); - - if(malfunction_id) - { - queryStr = QString("DELETE FROM public.malf_sign " - "WHERE malf_malf_sign = %1 ").arg( - malfunction_id); - - QSqlQuery querySign = QSqlQuery(*db); - if(!queryExec(queryStr, &querySign)) - { - resBool = db->rollback(); - return 0; - } - } - }; - } - else - { - resBool = db->rollback(); - return 0; - } - - - queryStr = QString("DELETE FROM public.malfunctions " - "WHERE task_fim_malf = %1 ").arg( - QString::number(id_task)); - - QSqlQuery query1 = QSqlQuery(*db); - if(!queryExec(queryStr, &query1)) - { - resBool = db->rollback(); - return 0; - } - - queryStr = QString("DELETE FROM public.tasks_fim " - "WHERE task_id = %1 " - "RETURNING tasks_fim.task_id").arg( - QString::number(id_task)); - - if(!queryExecInt(queryStr)) - { - resBool = db->rollback(); - return 0; - } - - resBool = db->commit(); - return id_trainee; -} - -QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) -{ - QList listTasks; - QString queryStr; - bool resBool = false; - - resBool = db->transaction(); - - queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status, " - "trainees.trainee_id " - "FROM public.tasks_fim JOIN public.trainees ON trainees.trainee_id = tasks_fim.trainee_task " - "WHERE tasks_fim.trainee_task = %1 " - "ORDER BY tasks_fim.task_id ASC").arg( - id_trainee); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Задача - TaskAmmFim task; - - task.setID(query.value(0).toInt()); - task.title = query.value(1).toString(); - task.status = query.value(2).toString(); - - //Выгребаем все malfunction для этой задачи - queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, " - "tasks_fim.task_id " - "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.task_fim_malf " - "WHERE malfunctions.task_fim_malf = %1 " - "ORDER BY malfunctions.num ASC").arg( - task.getID()); - - QSqlQuery queryMalf = QSqlQuery(*db); - - if(queryExec(queryStr, &queryMalf)) - { - while (queryMalf.next()) - {//Неисправность - Malfunction malfanction; - int malfunction_id = 0; - - malfunction_id = queryMalf.value(0).toString().toInt(); - malfanction.num = queryMalf.value(1).toString(); - malfanction.dmCode = queryMalf.value(2).toString(); - malfanction.description = queryMalf.value(3).toString(); - - //Выгребаем сигналы для этой неисправности - queryStr = QString("SELECT malf_sign.sign_id, malf_sign.type, malf_sign.description " - "FROM public.malf_sign " - "WHERE malf_malf_sign = %1 " - "ORDER BY malf_sign.sign_id ASC").arg( - QString::number(malfunction_id)); - - QSqlQuery querySign = QSqlQuery(*db); - if(queryExec(queryStr, &querySign)) - { - while (querySign.next()) - {//Сигналы - MalfunctionSign sign; - sign.type = querySign.value(1).toString().toInt(); - sign.description = querySign.value(2).toString(); - - malfanction.malfunctionSigns.append(sign); - }; - } - - task.addMalfunction(malfanction); - }; - } - else - { - resBool = db->rollback(); - return QList(); - } - - - //Выгребаем отчет для этой задачи - int report_id = 0; - queryStr = QString("SELECT reports.report_id " - "FROM public.reports " - "WHERE report_task = %1 " - "ORDER BY reports.report_id ASC").arg( - QString::number(task.getID())); - - QSqlQuery queryReport = QSqlQuery(*db); - - if(queryExec(queryStr, &queryReport)) - { - if (queryReport.first()) - {//Отчет - report_id = queryReport.value(0).toInt(); - task.report.id = report_id; - } - } - else - { - resBool = db->rollback(); - return QList(); - } - - if(report_id) - {//Отчет есть - //Выгребаем все item отчета - - queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.item_report, report_items.number " - "FROM public.report_items " - "WHERE item_report = %1 " - "ORDER BY report_items.number ASC").arg( - QString::number(report_id)); - - QSqlQuery queryItems = QSqlQuery(*db); - - if(queryExec(queryStr, &queryItems)) - { - while (queryItems.next()) - {//report_item - FIMReportItem reportItem; - reportItem.id = queryItems.value(0).toInt(); - reportItem.text = queryItems.value(1).toString(); - reportItem.procedure.doc = queryItems.value(2).toString(); - reportItem.procedure.dmCode = queryItems.value(3).toString(); - reportItem.procedure.title = queryItems.value(4).toString(); - reportItem.procedure.result = queryItems.value(5).toString(); - //item_report - //number - - task.report.itemList.append(reportItem); - } - } - else - { - resBool = db->rollback(); - return QList(); - } - } - - listTasks.append(task); - }; - } - else - { - resBool = db->rollback(); - return QList(); - } - - resBool = db->commit(); - return listTasks; -} - -TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) -{ - TaskAmmFim task; - - QString queryStr; - bool resBool = false; - - resBool = db->transaction(); - - queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status " - "FROM public.tasks_fim " - "WHERE tasks_fim.task_id = %1 " - "ORDER BY tasks_fim.task_id ASC").arg( - id_task); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if(query.first()) - {//Задача - - task.setID(query.value(0).toInt()); - task.title = query.value(1).toString(); - task.status = query.value(2).toString(); - - //Выгребаем все malfunction для этой задачи - queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, " - "tasks_fim.task_id " - "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.task_fim_malf " - "WHERE malfunctions.task_fim_malf = %1 " - "ORDER BY malfunctions.num ASC").arg( - task.getID()); - - QSqlQuery queryMalf = QSqlQuery(*db); - - if(queryExec(queryStr, &queryMalf)) - { - while (queryMalf.next()) - {//Неисправность - Malfunction malfanction; - int malfunction_id = 0; - - malfunction_id = queryMalf.value(0).toString().toInt(); - malfanction.num = queryMalf.value(1).toString(); - malfanction.dmCode = queryMalf.value(2).toString(); - malfanction.description = queryMalf.value(3).toString(); - - //Выгребаем сигналы для этой неисправности - queryStr = QString("SELECT malf_sign.sign_id, malf_sign.type, malf_sign.description " - "FROM public.malf_sign " - "WHERE malf_malf_sign = %1 " - "ORDER BY malf_sign.sign_id ASC").arg( - QString::number(malfunction_id)); - - QSqlQuery querySign = QSqlQuery(*db); - if(queryExec(queryStr, &querySign)) - { - while (querySign.next()) - {//Сигналы - MalfunctionSign sign; - sign.type = querySign.value(1).toString().toInt(); - sign.description = querySign.value(2).toString(); - - malfanction.malfunctionSigns.append(sign); - }; - } - - task.addMalfunction(malfanction); - }; - } - else - { - resBool = db->rollback(); - return task; - } - - - //Выгребаем отчет для этой задачи - int report_id = 0; - queryStr = QString("SELECT reports.report_id " - "FROM public.reports " - "WHERE report_task = %1 " - "ORDER BY reports.report_id ASC").arg( - QString::number(task.getID())); - - QSqlQuery queryReport = QSqlQuery(*db); - - if(queryExec(queryStr, &queryReport)) - { - if (queryReport.first()) - {//Отчет - report_id = queryReport.value(0).toInt(); - task.report.id = report_id; - } - } - else - { - resBool = db->rollback(); - return task; - } - - if(report_id) - {//Отчет есть - //Выгребаем все item отчета - - queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.item_report, report_items.number " - "FROM public.report_items " - "WHERE item_report = %1 " - "ORDER BY report_items.number ASC").arg( - QString::number(report_id)); - - QSqlQuery queryItems = QSqlQuery(*db); - - if(queryExec(queryStr, &queryItems)) - { - while (queryItems.next()) - {//report_item - FIMReportItem reportItem; - reportItem.id = queryItems.value(0).toInt(); - reportItem.text = queryItems.value(1).toString(); - reportItem.procedure.doc = queryItems.value(2).toString(); - reportItem.procedure.dmCode = queryItems.value(3).toString(); - reportItem.procedure.title = queryItems.value(4).toString(); - reportItem.procedure.result = queryItems.value(5).toString(); - //item_report - //number - - task.report.itemList.append(reportItem); - } - } - else - { - resBool = db->rollback(); - return task; - } - } - }; - } - else - { - resBool = db->rollback(); - return task; - } - - resBool = db->commit(); - return task; -} - -int DataBaseLMS::deleteReportFIM(int task_id) -{ - QString queryStr; - bool resBool = false; - int report_id = 0; - - resBool = db->transaction(); - - queryStr = QString("SELECT reports.report_id " - "FROM public.reports " - "WHERE report_task = %1 " - "ORDER BY reports.report_id ASC").arg( - QString::number(task_id)); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Отчет - report_id = query.value(0).toInt(); - } - } - if(!report_id) - { - resBool = db->rollback(); - return 0; - } - - - queryStr = QString("DELETE FROM public.report_items " - "WHERE item_report = %1 ").arg( - QString::number(report_id)); - - QSqlQuery query1 = QSqlQuery(*db); - if(!queryExec(queryStr, &query1)) - { - resBool = db->rollback(); - return 0; - } - - queryStr = QString("DELETE FROM public.reports " - "WHERE report_id = %1 ").arg( - QString::number(report_id)); - - if(!queryExec(queryStr, &query1)) - { - resBool = db->rollback(); - return 0; - } - - - queryStr = QString("UPDATE public.tasks_fim SET status = '%1' " - "WHERE task_id = %2 ").arg( - "new", - QString::number(task_id) ); - - if(!queryExec(queryStr, &query1)) - { - resBool = db->rollback(); - return 0; - } - - - resBool = db->commit(); - return report_id; -} - -int DataBaseLMS::insertReportFIM(TaskAmmFim task) -{ - QString queryStr; - bool resBool = false; - - resBool = db->transaction(); - - //task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки - - queryStr = QString("INSERT INTO public.reports (report_task) " - "VALUES (%1) " - "RETURNING reports.report_id").arg( - task.getID()); - - int report_id = queryExecInt(queryStr); - if(!report_id) - { - resBool = db->rollback(); - return 0; - } - - int number = 0; - for(FIMReportItem reportItem : task.report.itemList) - { - queryStr = QString("INSERT INTO public.report_items (text, doc, dm_code, title, result, item_report, number) " - "VALUES ('%1', '%2', '%3', '%4', '%5', %6, %7) " - "RETURNING report_items.item_id").arg( - reportItem.text, - reportItem.procedure.doc, - reportItem.procedure.dmCode, - reportItem.procedure.title, - reportItem.procedure.result, - QString::number(report_id), - QString::number(++number)); - - if(!queryExecInt(queryStr)) - { - resBool = db->rollback(); - return 0; - } - } - - /* - queryStr = QString("UPDATE public.tasks_fim SET status = '%1' " - "WHERE task_id = %2 ").arg( - "checkup", - QString::number(task.getID()) ); - - QSqlQuery query1 = QSqlQuery(*db); - if(!queryExec(queryStr, &query1)) - { - resBool = db->rollback(); - return 0; - } - */ - - resBool = db->commit(); - return report_id; -} - -Trainee DataBaseLMS::selectTrainee(int id_trainee) -{ - Trainee trainee; - - QString queryStr = QString("SELECT trainees.trainee_id, trainees.name, trainees.login, trainees.password, trainees.archived, trainees.logged_in, " - "groups.group_id, groups.name, " - "computers.computer_id, computers.name, computers.ip_address, " - "classrooms.classroom_id, classrooms.name " - "FROM public.trainees JOIN public.groups ON groups.group_id = trainees.group_trainee " - "LEFT OUTER JOIN public.computers ON computers.computer_id = trainees.computer_trainee " - "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.classroom_computer " - "WHERE trainees.trainee_id = %1 " - "ORDER BY groups.name, trainees.name ASC").arg( - id_trainee); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Инструктор - trainee.setID(query.value(0).toInt()); - trainee.setName(query.value(1).toString()); - trainee.setLogin(query.value(2).toString()); - trainee.setPassword(query.value(3).toString()); - trainee.setArchived(query.value(4).toBool()); - trainee.setLoggedIn(query.value(5).toBool()); - - Group group = Group(query.value(6).toInt(), query.value(7).toString()); - trainee.setGroup(group); - - Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); - Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); - trainee.setComputer(computer); - } - } - - return trainee; -} - -QList DataBaseLMS::selectAllTraineesInGroup(int id_group) -{ - QList listTrainees; - - QString queryStr = QString("SELECT trainees.trainee_id, trainees.name, trainees.login, trainees.password, trainees.archived, trainees.logged_in, " - "groups.group_id, groups.name, " - "computers.computer_id, computers.name, computers.ip_address, " - "classrooms.classroom_id, classrooms.name " - "FROM public.trainees JOIN public.groups ON groups.group_id = trainees.group_trainee " - "LEFT OUTER JOIN public.computers ON computers.computer_id = trainees.computer_trainee " - "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.classroom_computer " - "WHERE trainees.group_trainee = %1 " - "ORDER BY groups.name, trainees.name ASC").arg( - id_group); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Обучаемый - Trainee trainee; - - trainee.setID(query.value(0).toInt()); - trainee.setName(query.value(1).toString()); - trainee.setLogin(query.value(2).toString()); - trainee.setPassword(query.value(3).toString()); - trainee.setArchived(query.value(4).toBool()); - trainee.setLoggedIn(query.value(5).toBool()); - - Group group = Group(query.value(6).toInt(), query.value(7).toString()); - trainee.setGroup(group); - - Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); - Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); - trainee.setComputer(computer); - - listTrainees.append(trainee); - } - } - - return listTrainees; -} - -int DataBaseLMS::selectTraineeID(QString login, QString password) -{ - QString queryStr; - - if(password != QStringLiteral("")) - { - queryStr = QString("SELECT trainees.trainee_id " - "FROM public.trainees " - "WHERE login = '%1' AND password = '%2' ").arg( - login, - password ); - } - else - { - queryStr = QString("SELECT trainees.trainee_id " - "FROM public.trainees " - "WHERE login = '%1' ").arg( - login ); - } - - return queryExecInt(queryStr); -} - -QString DataBaseLMS::selectTraineeNameByLogin(QString login) -{ - QString queryStr = QString("SELECT trainees.name " - "FROM public.trainees " - "WHERE trainees.login = '%1' ").arg( - login ); - - return queryExecString(queryStr); -} - -QString DataBaseLMS::selectTraineeNameOnComputer(QString computer_name) -{ - QString queryStr = QString("SELECT trainees.name " - "FROM public.trainees JOIN public.computers ON computers.computer_id = trainees.computer_trainee " - "WHERE computers.name = '%1' ").arg( - computer_name); - - return queryExecString(queryStr); -} - -Trainee DataBaseLMS::selectTraineeOnComputer(QString computer_name) -{ - Trainee trainee; - - QString queryStr = QString("SELECT trainees.trainee_id, trainees.name, trainees.login, trainees.password, trainees.archived, trainees.logged_in, " - "groups.group_id, groups.name, " - "computers.computer_id, computers.name, computers.ip_address, " - "classrooms.classroom_id, classrooms.name " - "FROM public.trainees JOIN public.groups ON groups.group_id = trainees.group_trainee " - "LEFT OUTER JOIN public.computers ON computers.computer_id = trainees.computer_trainee " - "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.classroom_computer " - "WHERE computers.name = '%1' ").arg( - computer_name); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Инструктор - trainee.setID(query.value(0).toInt()); - trainee.setName(query.value(1).toString()); - trainee.setLogin(query.value(2).toString()); - trainee.setPassword(query.value(3).toString()); - trainee.setArchived(query.value(4).toBool()); - trainee.setLoggedIn(query.value(5).toBool()); - - Group group = Group(query.value(6).toInt(), query.value(7).toString()); - trainee.setGroup(group); - - Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); - Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); - trainee.setComputer(computer); - } - } - - return trainee; -} - -bool DataBaseLMS::selectTraineeArchived(int id_trainee) -{ - QString queryStr = QString("SELECT trainees.archived " - "FROM public.trainees " - "WHERE trainee_id = %1 ").arg( - id_trainee ); - - return queryExecBool(queryStr); -} - -bool DataBaseLMS::selectTraineeLoggedIn(int id_trainee) -{ - QString queryStr = QString("SELECT trainees.logged_in " - "FROM public.trainees " - "WHERE trainee_id = %1 ").arg( - id_trainee ); - - return queryExecBool(queryStr); -} - -int DataBaseLMS::updateTraineeLoggedIn(int id_trainee, bool loggedIn) -{ - QString queryStr = QString("UPDATE public.trainees " - "SET logged_in = %1 " - "WHERE trainee_id = %2 " - "RETURNING trainees.trainee_id").arg( - loggedIn ? "true" : "false", - QString::number(id_trainee) ); - - return queryExecInt(queryStr); -} - -bool DataBaseLMS::updateAllTraineesLoggedIn(bool loggedIn) -{ - QString queryStr = QString("UPDATE public.trainees " - "SET logged_in = %1 ").arg( - loggedIn ? "true" : "false"); - - QSqlQuery query = QSqlQuery(*db); - - return queryExec(queryStr, &query); -} - -int DataBaseLMS::updateTraineeArchived(int id_trainee, bool archived) -{ - QString queryStr = QString("UPDATE public.trainees " - "SET archived = %1 " - "WHERE trainee_id = %2 " - "RETURNING trainees.trainee_id").arg( - archived ? "true" : "false", - QString::number(id_trainee) ); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::insertTrainee(int id_group) -{ - QString queryStr = QString("INSERT INTO public.trainees (name, login, password, archived, logged_in, group_trainee) " - "VALUES (DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, %1) " - "RETURNING trainees.trainee_id").arg( - QString::number(id_group)); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::insertTrainee(Trainee trainee) -{ - QString queryStr = QString("INSERT INTO public.trainees (name, login, password, archived, logged_in, group_trainee) " - "VALUES ('%1', '%2', '%3', %4, %5, %6) " - "RETURNING trainees.trainee_id").arg( - trainee.getName(), - trainee.getLogin(), - trainee.getPassword(), - trainee.getArchived() ? "true" : "false", - trainee.getLoggedIn() ? "true" : "false", - QString::number(trainee.getGroup().getID())); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::deleteTrainee(int id_trainee) -{ - QString queryStr; - int res = 0; - bool resBool = false; - - resBool = db->transaction(); - - QSqlQuery query = QSqlQuery(*db); - - - //Удаление задач AMM - queryStr = QString("DELETE FROM public.tasks_amm " - "WHERE trainee_task = %1 ").arg( - QString::number(id_trainee)); - - if(!queryExec(queryStr, &query)) - { - resBool = db->rollback(); - return 0; - } - - - //Удаление задач FIM - - /*Выборка задач FIM для этого обучаемого*/ - queryStr = QString("SELECT tasks_fim.task_id " - "FROM public.tasks_fim " - "WHERE tasks_fim.trainee_task = %1 " - "ORDER BY tasks_fim.task_id ASC").arg( - id_trainee); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Задача - /*Удаляем все malfunction для этой задачи*/ - queryStr = QString("DELETE FROM public.malfunctions " - "WHERE malfunctions.task_fim_malf = %1 ").arg( - query.value(0).toInt()); - QSqlQuery queryDel = QSqlQuery(*db); - if(!queryExec(queryStr, &queryDel)) - { - resBool = db->rollback(); - return 0; - } - }; - } - else - { - resBool = db->rollback(); - return 0; - } - - /*Удаление непосредственно задач FIM*/ - queryStr = QString("DELETE FROM public.tasks_fim " - "WHERE trainee_task = %1 ").arg( - QString::number(id_trainee)); - - if(!queryExec(queryStr, &query)) - { - resBool = db->rollback(); - return 0; - } - - - //Удаление обучаемого - queryStr = QString("DELETE FROM public.trainees " - "WHERE trainee_id = %1 " - "RETURNING trainees.trainee_id").arg( - QString::number(id_trainee)); - - res = queryExecInt(queryStr); - if(res) - { - resBool = db->commit(); - return res; - } - else - { - resBool = db->rollback(); - return 0; - } -} - -int DataBaseLMS::updateTrainee(Trainee trainee) -{ - QString computer_id = (trainee.getComputer().getID() == 0 ? QStringLiteral("null") : QString::number(trainee.getComputer().getID())); - - QString queryStr = QString("UPDATE public.trainees " - "SET name = '%1', login = '%2', password = '%3', archived = %4, logged_in = %5, " - "group_trainee = %6, " - "computer_trainee = %7 " - "WHERE trainee_id = %8 " - "RETURNING trainees.trainee_id").arg( - trainee.getName(), - trainee.getLogin(), - trainee.getPassword(), - trainee.getArchived() ? "true" : "false", - trainee.getLoggedIn() ? "true" : "false", - QString::number(trainee.getGroup().getID()), - computer_id, - QString::number(trainee.getID()) ); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::insertTimingTrainee(int id_trainee) -{ - QString queryStr = QString("INSERT INTO public.timings (entry_time, exit_time, operating_time, timing_trainee) " - "VALUES (DEFAULT, DEFAULT, DEFAULT, %1) " - "RETURNING timings.timing_id").arg( - QString::number(id_trainee)); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::updateTimingTrainee(int id_trainee, TimingOfTrainee timing) -{ - QString queryStr = QString("UPDATE public.timings " - "SET entry_time = '%1', exit_time = '%2', operating_time = '%3', timing_trainee = %4 " - "WHERE timing_id = %5 " - "RETURNING timings.timing_id").arg( - timing.getEntryTimeS(), - timing.getExitTimeS(), - timing.getOperatingTimeS(), - QString::number(id_trainee), - QString::number(timing.getID()) ); - - return queryExecInt(queryStr); -} - -TimingOfTrainee DataBaseLMS::selectTimingTrainee(int id_trainee) -{ - TimingOfTrainee timing(id_trainee); - - QString queryStr = QString("SELECT timings.timing_id, timings.entry_time, timings.exit_time, timings.operating_time, timings.timing_trainee " - "FROM public.timings " - "WHERE timing_trainee = '%1'").arg(id_trainee); - - QSqlQuery querySel = QSqlQuery(*db); - - if(queryExec(queryStr, &querySel)) - { - if (querySel.first()) - {//Тайминг - timing.setID(querySel.value(0).toInt()); - timing.setEntryTime(querySel.value(1).toDateTime()); - timing.setExitTime(querySel.value(2).toDateTime()); - timing.setOperatingTime(querySel.value(3).toTime()); - timing.setTraineeID(querySel.value(4).toInt()); - } - } - - return timing; -} - int DataBaseLMS::queryExecInt(QString queryStr) { QSqlQuery query = QSqlQuery(*db); @@ -1783,16 +181,53 @@ bool DataBaseLMS::queryExecBool(QString queryStr) bool DataBaseLMS::queryExec(QString queryStr, QSqlQuery *query) { bool res = false; - mtxAccess.lock(); if(! (res = query->exec(queryStr)) ) messageWarningErrorQuery(queryStr, query); - mtxAccess.unlock(); return res; } void DataBaseLMS::messageWarningErrorQuery(QString queryStr, QSqlQuery* query) { - QMessageBox::warning(nullptr, dbSettings.dbName, + //Запись в файл ошибок БД + QDomDocument commonDOM; + + QFile blankFile(":/resources/blankXML/ErrorDB.xml"); + + if (! blankFile.open(QFile::ReadOnly | QFile::Text)) + qDebug() << QString("messageWarningErrorQuery: Couldn't read the file: ") + ":/resources/blankXML/ErrorDB.xml"; + else + { + commonDOM.setContent(blankFile.readAll()); + blankFile.close(); + + QDomNode errorDBNode = commonDOM.namedItem("ErrorDB"); + + QDomNode errorQueryNode = commonDOM.createElement("ErrorQuery"); + errorDBNode.appendChild(errorQueryNode); + errorQueryNode.toElement().setAttribute("text", query->lastError().text()); + + QDomNode stringOfQueryNode = commonDOM.createElement("StringOfQuery"); + errorDBNode.appendChild(stringOfQueryNode); + stringOfQueryNode.toElement().setAttribute("text", queryStr); + + QDomNode executedQueryNode = commonDOM.createElement("ExecutedQuery"); + errorDBNode.appendChild(executedQueryNode); + executedQueryNode.toElement().setAttribute("text", query->executedQuery()); + + QFile xmlOutFile("ErrorDB.xml"); + if (!xmlOutFile.open(QFile::WriteOnly | QFile::Text)) + qDebug() << QString("messageWarningErrorQuery: Failed to write a file: ") + "ErrorDB.xml"; + else + { + QTextStream outFile(&xmlOutFile); + commonDOM.save(outFile, 4); + xmlOutFile.close(); + } + } + + + //Сообщение об ошибке + QMessageBox::warning(ownerWidget, dbSettings.dbName, "Error query:\n" + query->lastError().text() + "\n" + "String of query:\n" + queryStr + "\n" + "Executed query:\n" + query->executedQuery()); diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 0f0568f..a1dbc0b 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -3,6 +3,7 @@ #include #include +#include #include "instructor.h" #include "trainee.h" @@ -25,47 +26,61 @@ public: class DataBaseLMS { public: - DataBaseLMS(); + DataBaseLMS(QWidget *ownerWidget); ~DataBaseLMS(); +public: + static const QString TypeUserDBInstructor; + static const QString TypeUserDBTrainee; + protected: //Подключение bool createConnection(); void deleteConnection(); bool isConnected(); - //Транзакции - bool transactionBegin(); - bool transactionEnd(); - - //Списки - QList selectAllInstructors(); - QList selectAllTrainees(); - QList selectAllGroups(); + //Юзер + int selectUserID(QString type, QString login, QString password = QStringLiteral("")); + QString selectUserNameByLogin(QString type, QString login); + bool selectUserLoggedIn(QString type, int id_user); + bool selectUserArchived(QString type, int id_user); + int updateUserLoggedIn(QString type, int id_user, bool loggedIn); + bool updateAllUsersLoggedIn(QString type, bool loggedIn); + int updateUserArchived(QString type, int id_user, bool archived); //Инструктор + QList selectAllInstructors(); Instructor selectInstructor(int id_instructor); - int selectInstructorID(QString login, QString password = QStringLiteral("")); - QString selectInstructorNameByLogin(QString login); bool selectInstructorIsAdmin(int id_instructor); - bool selectInstructorLoggedIn(int id_instructor); - bool selectInstructorArchived(int id_instructor); - int updateInstructorLoggedIn(int id_instructor, bool loggedIn); - bool updateAllInstructorsLoggedIn(bool loggedIn); - int updateInstructorArchived(int id_instructor, bool archived); - int insertInstructor(); int insertInstructor(Instructor instructor); int deleteInstructor(int id_instructor); int updateInstructor(Instructor instructor); //Группа + QList selectAllGroups(); Group selectGroup(int id_group); int insertGroup(); int insertGroup(Group group); int deleteGroup(int id_group); int updateGroup(Group group); + //Обучаемый + QList selectAllTrainees(); + Trainee selectTrainee(int id_trainee); + QList selectAllTraineesInGroup(int id_group); + QString selectTraineeNameOnComputer(QString computer_name); + Trainee selectTraineeOnComputer(QString computer_name); + int insertTrainee(int id_group); + int insertTrainee(Trainee trainee); + int deleteTrainee(int id_trainee); + int updateTrainee(Trainee trainee); + + //Тайминг + int insertTimingTrainee(int id_trainee); + int updateTimingTrainee(int id_trainee, TimingOfTrainee timing); + TimingOfTrainee selectTimingTrainee(int id_trainee); + //Задача AMM int insertTaskAMM(TaskAmmFim task, int id_trainee); int updateTaskAMM(TaskAmmFim task); @@ -80,32 +95,9 @@ protected: int deleteTaskFIM(int id_task); QList selectTasksFIMofTrainee(int id_trainee); TaskAmmFim selectTaskFIMbyID(int id_task); - - int deleteReportFIM(int task_id); - int insertReportFIM(TaskAmmFim task); - - //Обучаемый - Trainee selectTrainee(int id_trainee); - QList selectAllTraineesInGroup(int id_group); - int selectTraineeID(QString login, QString password = QStringLiteral("")); - QString selectTraineeNameByLogin(QString login); - QString selectTraineeNameOnComputer(QString computer_name); - Trainee selectTraineeOnComputer(QString computer_name); - bool selectTraineeArchived(int id_trainee); - bool selectTraineeLoggedIn(int id_trainee); - int updateTraineeLoggedIn(int id_trainee, bool loggedIn); - bool updateAllTraineesLoggedIn(bool loggedIn); - int updateTraineeArchived(int id_trainee, bool archived); - - int insertTrainee(int id_group); - int insertTrainee(Trainee trainee); - int deleteTrainee(int id_trainee); - int updateTrainee(Trainee trainee); - - //Тайминг - int insertTimingTrainee(int id_trainee); - int updateTimingTrainee(int id_trainee, TimingOfTrainee timing); - TimingOfTrainee selectTimingTrainee(int id_trainee); + //int deleteReportFIMforTask(int task_id); + //int insertReportFIMforTask(TaskAmmFim task); + int updateReportFIMforTask(TaskAmmFim task); private: DataBaseSettings getDataBaseSettings(); @@ -120,8 +112,8 @@ protected: DataBaseSettings dbSettings; private: - bool transactionBegined; - QMutex mtxAccess; + bool transactionBegined; + QWidget* ownerWidget; }; #endif // DATABASELMS_H diff --git a/DataBaseLMS/databaselms_groups.cpp b/DataBaseLMS/databaselms_groups.cpp new file mode 100644 index 0000000..6d7f1e0 --- /dev/null +++ b/DataBaseLMS/databaselms_groups.cpp @@ -0,0 +1,95 @@ +#include "databaselms.h" + +#include +#include +#include +#include + + +QList DataBaseLMS::selectAllGroups() +{ + QList listGroups; + + QString queryStr = QString("SELECT group_id, name " + "FROM public.groups " + "ORDER BY group_id ASC"); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Группа + Group group; + group.setID(query.value(0).toInt()); + group.setName(query.value(1).toString()); + + listGroups.append(group); + } + } + + return listGroups; +} + +Group DataBaseLMS::selectGroup(int id_group) +{ + Group group; + + QString queryStr = QString("SELECT group_id, name " + "FROM public.groups " + "WHERE groups.group_id = %1 ").arg( + id_group); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Инструктор + group.setID(query.value(0).toInt()); + group.setName(query.value(1).toString()); + } + } + + return group; +} + +int DataBaseLMS::insertGroup() +{ + QString queryStr = QString("INSERT INTO public.groups " + "DEFAULT VALUES " + "RETURNING group_id"); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::insertGroup(Group group) +{ + QString queryStr = QString("INSERT INTO public.groups (name) " + "VALUES ('%1') " + "RETURNING groups.group_id").arg( + group.getName()); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::deleteGroup(int id_group) +{ + QString queryStr = QString("DELETE FROM public.groups " + "WHERE group_id = %1 " + "RETURNING groups.group_id").arg( + QString::number(id_group)); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateGroup(Group group) +{ + QString queryStr = QString("UPDATE public.groups SET name = '%1' " + "WHERE group_id = %2 " + "RETURNING groups.group_id").arg( + group.getName(), + QString::number(group.getID()) ); + + return queryExecInt(queryStr); +} diff --git a/DataBaseLMS/databaselms_instructors.cpp b/DataBaseLMS/databaselms_instructors.cpp new file mode 100644 index 0000000..d05c7d6 --- /dev/null +++ b/DataBaseLMS/databaselms_instructors.cpp @@ -0,0 +1,134 @@ +#include "databaselms.h" + +#include +#include +#include +#include + + +QList DataBaseLMS::selectAllInstructors() +{ + QList listInstructors; + + QString queryStr = QString("SELECT user_id, name, login, password, is_admin, archived, logged_in " + "FROM public.users " + "WHERE users.type = '%1' " + "ORDER BY user_id ASC").arg( + TypeUserDBInstructor); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Инструктор + Instructor instructor; + instructor.setID(query.value(0).toInt()); + instructor.setName(query.value(1).toString()); + instructor.setLogin(query.value(2).toString()); + instructor.setPassword(query.value(3).toString()); + instructor.setIsAdmin(query.value(4).toBool()); + instructor.setArchived(query.value(5).toBool()); + instructor.setLoggedIn(query.value(6).toBool()); + + listInstructors.append(instructor); + } + } + + return listInstructors; +} + +Instructor DataBaseLMS::selectInstructor(int id_instructor) +{ + Instructor instructor; + + QString queryStr = QString("SELECT user_id, name, login, password, is_admin, archived, logged_in " + "FROM public.users " + "WHERE users.user_id = %1 AND users.type = '%2' ").arg( + QString::number(id_instructor), + TypeUserDBInstructor); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Инструктор + instructor.setID(query.value(0).toInt()); + instructor.setName(query.value(1).toString()); + instructor.setLogin(query.value(2).toString()); + instructor.setPassword(query.value(3).toString()); + instructor.setIsAdmin(query.value(4).toBool()); + instructor.setArchived(query.value(5).toBool()); + instructor.setLoggedIn(query.value(6).toBool()); + } + } + + return instructor; +} + +bool DataBaseLMS::selectInstructorIsAdmin(int id_instructor) +{ + QString queryStr = QString("SELECT users.is_admin " + "FROM public.users " + "WHERE user_id = %1 AND users.type = '%2' ").arg( + QString::number(id_instructor), + TypeUserDBInstructor ); + + return queryExecBool(queryStr); +} + +int DataBaseLMS::insertInstructor() +{ + QString queryStr = QString("INSERT INTO public.users (type, name, login, password, is_admin, archived, logged_in)" + "VALUES ('%1', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)" + "RETURNING user_id").arg( + TypeUserDBInstructor); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::insertInstructor(Instructor instructor) +{ + QString queryStr = QString("INSERT INTO public.users (type, name, login, password, is_admin, archived, logged_in) " + "VALUES ('%1', '%2', '%3', '%4', %5, %6, %7) " + "RETURNING user_id").arg( + TypeUserDBInstructor, + instructor.getName(), + instructor.getLogin(), + instructor.getPassword(), + instructor.getIsAdmin() ? "true" : "false", + instructor.getArchived() ? "true" : "false", + instructor.getLoggedIn() ? "true" : "false"); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::deleteInstructor(int id_instructor) +{ + QString queryStr = QString("DELETE FROM public.users " + "WHERE user_id = %1 AND users.type = '%2' " + "RETURNING users.user_id").arg( + QString::number(id_instructor), + TypeUserDBInstructor); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateInstructor(Instructor instructor) +{ + QString queryStr = QString("UPDATE public.users " + "SET name = '%1', login = '%2', password = '%3', is_admin = %4, archived = %5, logged_in = %6 " + "WHERE user_id = %7 AND users.type = '%8' " + "RETURNING users.user_id").arg( + instructor.getName(), + instructor.getLogin(), + instructor.getPassword(), + instructor.getIsAdmin() ? "true" : "false", + instructor.getArchived() ? "true" : "false", + instructor.getLoggedIn() ? "true" : "false", + QString::number(instructor.getID()), + TypeUserDBInstructor); + + return queryExecInt(queryStr); +} diff --git a/DataBaseLMS/databaselms_tasks.cpp b/DataBaseLMS/databaselms_tasks.cpp new file mode 100644 index 0000000..adc1d1a --- /dev/null +++ b/DataBaseLMS/databaselms_tasks.cpp @@ -0,0 +1,847 @@ +#include "databaselms.h" + +#include +#include +#include +#include + +int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee) +{ + task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки + + QString queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, fk_trainee_id) " + "VALUES ('%1', '%2', %3) " + "RETURNING tasks_amm.task_id").arg( + task.ammProcedure.title, + task.ammProcedure.dmCode, + QString::number(id_trainee)); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateTaskAMM(TaskAmmFim task) +{ + task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки + + QString queryStr = QString("UPDATE public.tasks_amm SET title = '%1', dm_code = '%2', status = '%3' " + "WHERE task_id = %4 " + "RETURNING tasks_amm.task_id").arg( + task.ammProcedure.title, + task.ammProcedure.dmCode, + task.status, + QString::number(task.getID()) ); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateStatusTaskAMM(int task_id, QString status) +{ + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT users.user_id " + "FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY users.user_id ASC").arg( + QString::number(task_id)); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + id_trainee = query.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + + queryStr = QString("UPDATE public.tasks_amm SET status = '%1' " + "WHERE task_id = %2 " + "RETURNING tasks_amm.task_id").arg( + status, + QString::number(task_id) ); + + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; +} + +int DataBaseLMS::deleteTaskAMM(int id_task) +{ + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT users.user_id " + "FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY users.user_id ASC").arg( + QString::number(id_task)); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + id_trainee = query.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("DELETE FROM public.tasks_amm " + "WHERE task_id = %1 " + "RETURNING tasks_amm.task_id").arg( + QString::number(id_task)); + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; +} + +QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) +{ + QList listTasks; + + QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status, " + "users.user_id " + "FROM public.tasks_amm JOIN public.users ON users.user_id = tasks_amm.fk_trainee_id " + "WHERE tasks_amm.fk_trainee_id = %1 " + "ORDER BY tasks_amm.task_id ASC").arg( + id_trainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Задача + TaskAmmFim task; + + task.setID(query.value(0).toInt()); + task.ammProcedure.title = query.value(1).toString(); + task.ammProcedure.dmCode = query.value(2).toString(); + task.status = query.value(3).toString(); + + listTasks.append(task); + } + } + + return listTasks; +} + +TaskAmmFim DataBaseLMS::selectTaskAMMbyID(int id_task) +{ + TaskAmmFim task; + + QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status " + "FROM public.tasks_amm " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY tasks_amm.task_id ASC").arg( + id_task); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Задача + task.setID(query.value(0).toInt()); + task.ammProcedure.title = query.value(1).toString(); + task.ammProcedure.dmCode = query.value(2).toString(); + task.status = query.value(3).toString(); + } + } + + return task; +} + + +int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) +{ + QString queryStr; + bool resBool = false; + + resBool = db->transaction(); + + task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки + + queryStr = QString("INSERT INTO public.tasks_fim (title, fk_trainee_id) " + "VALUES ('%1', %2) " + "RETURNING tasks_fim.task_id").arg( + task.title, + QString::number(id_trainee)); + + int task_id = queryExecInt(queryStr); + if(!task_id) + { + resBool = db->rollback(); + return 0; + } + + for(Malfunction malfanction : task.malfunctionList) + { + malfanction.description = malfanction.description.replace("'", "''"); //Задваиваем одинарные кавычки + + queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, fk_task_fim_id) " + "VALUES ('%1', '%2', '%3', %4) " + "RETURNING malfunctions.malfunction_id").arg( + malfanction.num, + malfanction.dmCode, + malfanction.description, + QString::number(task_id)); + + int malfunction_id = queryExecInt(queryStr); + if(!malfunction_id) + { + resBool = db->rollback(); + return 0; + } + + //Sign + for(MalfunctionSign sign : malfanction.malfunctionSigns) + { + sign.description = sign.description.replace("'", "''"); //Задваиваем одинарные кавычки + + queryStr = QString("INSERT INTO public.malf_signs (type, description, fk_malfunction_id) " + "VALUES ('%1', '%2', %3) " + "RETURNING malf_signs.sign_id").arg( + QString::number(sign.type), + sign.description, + QString::number(malfunction_id)); + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + } + } + + resBool = db->commit(); + return task_id; +} + +int DataBaseLMS::updateTaskFIM(TaskAmmFim task) +{ + task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки + + QString queryStr = QString("UPDATE public.tasks_fim SET title = '%1', status = '%2' " + "WHERE task_id = %3 " + "RETURNING tasks_fim.task_id").arg( + task.title, + task.status, + QString::number(task.getID()) ); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateStatusTaskFIM(int task_id, QString status) +{ + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT users.user_id " + "FROM public.users JOIN public.tasks_fim ON users.user_id = tasks_fim.fk_trainee_id " + "WHERE tasks_fim.task_id = %1 " + "ORDER BY users.user_id ASC").arg( + QString::number(task_id)); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + id_trainee = query.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("UPDATE public.tasks_fim SET status = '%1' " + "WHERE task_id = %2 " + "RETURNING tasks_fim.task_id").arg( + status, + QString::number(task_id) ); + + QSqlQuery query1 = QSqlQuery(*db); + if(!queryExec(queryStr, &query1)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; +} + +int DataBaseLMS::deleteTaskFIM(int id_task) +{ + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT users.user_id " + "FROM public.users JOIN public.tasks_fim ON users.user_id = tasks_fim.fk_trainee_id " + "WHERE tasks_fim.task_id = %1 " + "ORDER BY users.user_id ASC").arg( + QString::number(id_task)); + + QSqlQuery queryUserSEL = QSqlQuery(*db); + + if(queryExec(queryStr, &queryUserSEL)) + { + if (queryUserSEL.first()) + {//Обучаемый + id_trainee = queryUserSEL.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + //Выгребаем все malfunction для этой задачи + queryStr = QString("SELECT malfunctions.malfunction_id " + "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id " + "WHERE malfunctions.fk_task_fim_id = %1 " + "ORDER BY malfunctions.malfunction_id ASC").arg( + id_task); + QSqlQuery queryMalfSEL = QSqlQuery(*db); + + if(queryExec(queryStr, &queryMalfSEL)) + { + while (queryMalfSEL.next()) + {//Неисправность + int malfunction_id = 0; + + malfunction_id = queryMalfSEL.value(0).toString().toInt(); + + if(malfunction_id) + { + queryStr = QString("DELETE FROM public.malf_signs " + "WHERE fk_malfunction_id = %1 ").arg( + malfunction_id); + + QSqlQuery querySignDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &querySignDEL)) + { + resBool = db->rollback(); + return 0; + } + } + }; + } + else + { + resBool = db->rollback(); + return 0; + } + + + queryStr = QString("DELETE FROM public.malfunctions " + "WHERE fk_task_fim_id = %1 ").arg( + QString::number(id_task)); + + QSqlQuery queryMulfDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryMulfDEL)) + { + resBool = db->rollback(); + return 0; + } + + + + queryStr = QString("SELECT reports.report_id " + "FROM public.reports " + "WHERE fk_task_fim_id = %1 " + "ORDER BY reports.report_id ASC").arg( + QString::number(id_task)); + + int report_id = 0; + + QSqlQuery queryReportsSEL = QSqlQuery(*db); + if(queryExec(queryStr, &queryReportsSEL)) + { + if (queryReportsSEL.first()) + {//Отчет + report_id = queryReportsSEL.value(0).toInt(); + } + } + else + { + resBool = db->rollback(); + return 0; + } + + + queryStr = QString("DELETE FROM public.report_items " + "WHERE fk_report_id = %1 ").arg( + QString::number(report_id)); + + QSqlQuery queryItemsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryItemsDEL)) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("DELETE FROM public.reports " + "WHERE report_id = %1 ").arg( + QString::number(report_id)); + + QSqlQuery queryReportsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryReportsDEL)) + { + resBool = db->rollback(); + return 0; + } + + + + queryStr = QString("DELETE FROM public.tasks_fim " + "WHERE task_id = %1 " + "RETURNING tasks_fim.task_id").arg( + QString::number(id_task)); + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; +} + +QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) +{ + QList listTasks; + QString queryStr; + bool resBool = false; + + resBool = db->transaction(); + + queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status, " + "users.user_id " + "FROM public.tasks_fim JOIN public.users ON users.user_id = tasks_fim.fk_trainee_id " + "WHERE tasks_fim.fk_trainee_id = %1 " + "ORDER BY tasks_fim.task_id ASC").arg( + id_trainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Задача + TaskAmmFim task; + + task.setID(query.value(0).toInt()); + task.title = query.value(1).toString(); + task.status = query.value(2).toString(); + + //Выгребаем все malfunction для этой задачи + queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, " + "tasks_fim.task_id " + "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id " + "WHERE malfunctions.fk_task_fim_id = %1 " + "ORDER BY malfunctions.num ASC").arg( + task.getID()); + + QSqlQuery queryMalf = QSqlQuery(*db); + + if(queryExec(queryStr, &queryMalf)) + { + while (queryMalf.next()) + {//Неисправность + Malfunction malfanction; + int malfunction_id = 0; + + malfunction_id = queryMalf.value(0).toString().toInt(); + malfanction.num = queryMalf.value(1).toString(); + malfanction.dmCode = queryMalf.value(2).toString(); + malfanction.description = queryMalf.value(3).toString(); + + //Выгребаем сигналы для этой неисправности + queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description " + "FROM public.malf_signs " + "WHERE fk_malfunction_id = %1 " + "ORDER BY malf_signs.sign_id ASC").arg( + QString::number(malfunction_id)); + + QSqlQuery querySign = QSqlQuery(*db); + if(queryExec(queryStr, &querySign)) + { + while (querySign.next()) + {//Сигналы + MalfunctionSign sign; + sign.type = querySign.value(1).toString().toInt(); + sign.description = querySign.value(2).toString(); + + malfanction.malfunctionSigns.append(sign); + }; + } + + task.addMalfunction(malfanction); + }; + } + else + { + resBool = db->rollback(); + return QList(); + } + + + //Выгребаем отчет для этой задачи + int report_id = 0; + queryStr = QString("SELECT reports.report_id " + "FROM public.reports " + "WHERE fk_task_fim_id = %1 " + "ORDER BY reports.report_id ASC").arg( + QString::number(task.getID())); + + QSqlQuery queryReport = QSqlQuery(*db); + + if(queryExec(queryStr, &queryReport)) + { + if (queryReport.first()) + {//Отчет + report_id = queryReport.value(0).toInt(); + task.report.id = report_id; + } + } + else + { + resBool = db->rollback(); + return QList(); + } + + if(report_id) + {//Отчет есть + //Выгребаем все item отчета + + queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.fk_report_id, report_items.number " + "FROM public.report_items " + "WHERE fk_report_id = %1 " + "ORDER BY report_items.number ASC").arg( + QString::number(report_id)); + + QSqlQuery queryItems = QSqlQuery(*db); + + if(queryExec(queryStr, &queryItems)) + { + while (queryItems.next()) + {//report_item + FIMReportItem reportItem; + reportItem.id = queryItems.value(0).toInt(); + reportItem.text = queryItems.value(1).toString(); + reportItem.procedure.doc = queryItems.value(2).toString(); + reportItem.procedure.dmCode = queryItems.value(3).toString(); + reportItem.procedure.title = queryItems.value(4).toString(); + reportItem.procedure.result = queryItems.value(5).toString(); + //item_report + //number + + task.report.itemList.append(reportItem); + } + } + else + { + resBool = db->rollback(); + return QList(); + } + } + + listTasks.append(task); + }; + } + else + { + resBool = db->rollback(); + return QList(); + } + + resBool = db->commit(); + return listTasks; +} + +TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) +{ + TaskAmmFim task; + + QString queryStr; + bool resBool = false; + + resBool = db->transaction(); + + queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status " + "FROM public.tasks_fim " + "WHERE tasks_fim.task_id = %1 " + "ORDER BY tasks_fim.task_id ASC").arg( + id_task); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if(query.first()) + {//Задача + + task.setID(query.value(0).toInt()); + task.title = query.value(1).toString(); + task.status = query.value(2).toString(); + + //Выгребаем все malfunction для этой задачи + queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, " + "tasks_fim.task_id " + "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id " + "WHERE malfunctions.fk_task_fim_id = %1 " + "ORDER BY malfunctions.num ASC").arg( + task.getID()); + + QSqlQuery queryMalf = QSqlQuery(*db); + + if(queryExec(queryStr, &queryMalf)) + { + while (queryMalf.next()) + {//Неисправность + Malfunction malfanction; + int malfunction_id = 0; + + malfunction_id = queryMalf.value(0).toString().toInt(); + malfanction.num = queryMalf.value(1).toString(); + malfanction.dmCode = queryMalf.value(2).toString(); + malfanction.description = queryMalf.value(3).toString(); + + //Выгребаем сигналы для этой неисправности + queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description " + "FROM public.malf_signs " + "WHERE fk_malfunction_id = %1 " + "ORDER BY malf_signs.sign_id ASC").arg( + QString::number(malfunction_id)); + + QSqlQuery querySign = QSqlQuery(*db); + if(queryExec(queryStr, &querySign)) + { + while (querySign.next()) + {//Сигналы + MalfunctionSign sign; + sign.type = querySign.value(1).toString().toInt(); + sign.description = querySign.value(2).toString(); + + malfanction.malfunctionSigns.append(sign); + }; + } + + task.addMalfunction(malfanction); + }; + } + else + { + resBool = db->rollback(); + return task; + } + + + //Выгребаем отчет для этой задачи + int report_id = 0; + queryStr = QString("SELECT reports.report_id " + "FROM public.reports " + "WHERE fk_task_fim_id = %1 " + "ORDER BY reports.report_id ASC").arg( + QString::number(task.getID())); + + QSqlQuery queryReport = QSqlQuery(*db); + + if(queryExec(queryStr, &queryReport)) + { + if (queryReport.first()) + {//Отчет + report_id = queryReport.value(0).toInt(); + task.report.id = report_id; + } + } + else + { + resBool = db->rollback(); + return task; + } + + if(report_id) + {//Отчет есть + //Выгребаем все item отчета + + queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.fk_report_id, report_items.number " + "FROM public.report_items " + "WHERE fk_report_id = %1 " + "ORDER BY report_items.number ASC").arg( + QString::number(report_id)); + + QSqlQuery queryItems = QSqlQuery(*db); + + if(queryExec(queryStr, &queryItems)) + { + while (queryItems.next()) + {//report_item + FIMReportItem reportItem; + reportItem.id = queryItems.value(0).toInt(); + reportItem.text = queryItems.value(1).toString(); + reportItem.procedure.doc = queryItems.value(2).toString(); + reportItem.procedure.dmCode = queryItems.value(3).toString(); + reportItem.procedure.title = queryItems.value(4).toString(); + reportItem.procedure.result = queryItems.value(5).toString(); + //item_report + //number + + task.report.itemList.append(reportItem); + } + } + else + { + resBool = db->rollback(); + return task; + } + } + }; + } + else + { + resBool = db->rollback(); + return task; + } + + resBool = db->commit(); + return task; +} + +int DataBaseLMS::updateReportFIMforTask(TaskAmmFim task) +{ + QString queryStr; + bool resBool = false; + int report_id = 0; + int task_id = task.getID(); + + resBool = db->transaction(); + + queryStr = QString("SELECT reports.report_id " + "FROM public.reports " + "WHERE fk_task_fim_id = %1 " + "ORDER BY reports.report_id ASC").arg( + QString::number(task_id)); + + QSqlQuery queryReportsSEL = QSqlQuery(*db); + + if(queryExec(queryStr, &queryReportsSEL)) + { + if (queryReportsSEL.first()) + {//Отчет + report_id = queryReportsSEL.value(0).toInt(); + } + } + else + { + resBool = db->rollback(); + return 0; + } + + if(!report_id) + { + queryStr = QString("INSERT INTO public.reports (fk_task_fim_id) " + "VALUES (%1) " + "RETURNING reports.report_id").arg( + task.getID()); + + report_id = queryExecInt(queryStr); + if(!report_id) + { + resBool = db->rollback(); + return 0; + } + } + else + { + queryStr = QString("DELETE FROM public.report_items " + "WHERE fk_report_id = %1 ").arg( + QString::number(report_id)); + + QSqlQuery queryItemsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryItemsDEL)) + { + resBool = db->rollback(); + return 0; + } + } + + int number = 0; + for(FIMReportItem reportItem : task.report.itemList) + { + queryStr = QString("INSERT INTO public.report_items (text, doc, dm_code, title, result, fk_report_id, number) " + "VALUES ('%1', '%2', '%3', '%4', '%5', %6, %7) " + "RETURNING report_items.item_id").arg( + reportItem.text, + reportItem.procedure.doc, + reportItem.procedure.dmCode, + reportItem.procedure.title, + reportItem.procedure.result, + QString::number(report_id), + QString::number(++number)); + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + } + + queryStr = QString("UPDATE public.tasks_fim SET status = '%1' " + "WHERE task_id = %2 ").arg( + "checkup", + QString::number(task_id) ); + + QSqlQuery queryTaskUPD = QSqlQuery(*db); + if(!queryExec(queryStr, &queryTaskUPD)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return report_id; +} diff --git a/DataBaseLMS/databaselms_trainees.cpp b/DataBaseLMS/databaselms_trainees.cpp new file mode 100644 index 0000000..e447ab0 --- /dev/null +++ b/DataBaseLMS/databaselms_trainees.cpp @@ -0,0 +1,468 @@ +#include "databaselms.h" + +#include +#include +#include +#include + + +QList DataBaseLMS::selectAllTrainees() +{ + QList listTrainees; + + QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, " + "groups.group_id, groups.name, " + "computers.computer_id, computers.name, computers.ip_address, " + "classrooms.classroom_id, classrooms.name " + "FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id " + "LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id " + "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id " + "WHERE users.type = '%1' " + "ORDER BY groups.name, users.name ASC").arg( + TypeUserDBTrainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Обучаемый + Trainee trainee; + + trainee.setID(query.value(0).toInt()); + trainee.setName(query.value(1).toString()); + trainee.setLogin(query.value(2).toString()); + trainee.setPassword(query.value(3).toString()); + trainee.setArchived(query.value(4).toBool()); + trainee.setLoggedIn(query.value(5).toBool()); + + Group group = Group(query.value(6).toInt(), query.value(7).toString()); + trainee.setGroup(group); + + Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); + Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); + trainee.setComputer(computer); + + listTrainees.append(trainee); + } + } + + return listTrainees; +} + +Trainee DataBaseLMS::selectTrainee(int id_trainee) +{ + Trainee trainee; + + QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, " + "groups.group_id, groups.name, " + "computers.computer_id, computers.name, computers.ip_address, " + "classrooms.classroom_id, classrooms.name " + "FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id " + "LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id " + "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id " + "WHERE users.user_id = %1 AND users.type = '%2' " + "ORDER BY groups.name, users.name ASC").arg( + QString::number(id_trainee), + TypeUserDBTrainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + trainee.setID(query.value(0).toInt()); + trainee.setName(query.value(1).toString()); + trainee.setLogin(query.value(2).toString()); + trainee.setPassword(query.value(3).toString()); + trainee.setArchived(query.value(4).toBool()); + trainee.setLoggedIn(query.value(5).toBool()); + + Group group = Group(query.value(6).toInt(), query.value(7).toString()); + trainee.setGroup(group); + + Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); + Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); + trainee.setComputer(computer); + } + } + + return trainee; +} + +QList DataBaseLMS::selectAllTraineesInGroup(int id_group) +{ + QList listTrainees; + + QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, " + "groups.group_id, groups.name, " + "computers.computer_id, computers.name, computers.ip_address, " + "classrooms.classroom_id, classrooms.name " + "FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id " + "LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id " + "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id " + "WHERE users.fk_group_id = %1 AND users.type = '%2' " + "ORDER BY groups.name, users.name ASC").arg( + QString::number(id_group), + TypeUserDBTrainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Обучаемый + Trainee trainee; + + trainee.setID(query.value(0).toInt()); + trainee.setName(query.value(1).toString()); + trainee.setLogin(query.value(2).toString()); + trainee.setPassword(query.value(3).toString()); + trainee.setArchived(query.value(4).toBool()); + trainee.setLoggedIn(query.value(5).toBool()); + + Group group = Group(query.value(6).toInt(), query.value(7).toString()); + trainee.setGroup(group); + + Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); + Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); + trainee.setComputer(computer); + + listTrainees.append(trainee); + } + } + + return listTrainees; +} + +QString DataBaseLMS::selectTraineeNameOnComputer(QString computer_name) +{ + QString queryStr = QString("SELECT users.name " + "FROM public.users JOIN public.computers ON computers.computer_id = users.fk_computer_id " + "WHERE computers.name = '%1' AND users.type = '%2' ").arg( + computer_name, + TypeUserDBTrainee); + + return queryExecString(queryStr); +} + +Trainee DataBaseLMS::selectTraineeOnComputer(QString computer_name) +{ + Trainee trainee; + + QString queryStr = QString("SELECT users.trainee_id, users.name, users.login, users.password, users.archived, users.logged_in, " + "groups.group_id, groups.name, " + "computers.computer_id, computers.name, computers.ip_address, " + "classrooms.classroom_id, classrooms.name " + "FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id " + "LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id " + "LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id " + "WHERE computers.name = '%1' AND users.type = '%2' ").arg( + computer_name, + TypeUserDBTrainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + trainee.setID(query.value(0).toInt()); + trainee.setName(query.value(1).toString()); + trainee.setLogin(query.value(2).toString()); + trainee.setPassword(query.value(3).toString()); + trainee.setArchived(query.value(4).toBool()); + trainee.setLoggedIn(query.value(5).toBool()); + + Group group = Group(query.value(6).toInt(), query.value(7).toString()); + trainee.setGroup(group); + + Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString()); + Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); + trainee.setComputer(computer); + } + } + + return trainee; +} + +int DataBaseLMS::insertTrainee(int id_group) +{ + QString queryStr = QString("INSERT INTO public.users (type, name, login, password, archived, logged_in, fk_group_id) " + "VALUES ('%1', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, %2) " + "RETURNING users.user_id").arg( + TypeUserDBTrainee, + QString::number(id_group)); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::insertTrainee(Trainee trainee) +{ + QString queryStr = QString("INSERT INTO public.users (type, name, login, password, archived, logged_in, fk_group_id) " + "VALUES ('%1', '%2', '%3', '%4', %5, %6, %7) " + "RETURNING users.user_id").arg( + TypeUserDBTrainee, + trainee.getName(), + trainee.getLogin(), + trainee.getPassword(), + trainee.getArchived() ? "true" : "false", + trainee.getLoggedIn() ? "true" : "false", + QString::number(trainee.getGroup().getID())); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::deleteTrainee(int id_trainee) +{ + QString queryStr; + int res = 0; + bool resBool = false; + + resBool = db->transaction(); + + + //Удаление задач AMM + queryStr = QString("DELETE FROM public.tasks_amm " + "WHERE fk_trainee_id = %1 ").arg( + QString::number(id_trainee)); + + QSqlQuery queryTasksAMMDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryTasksAMMDEL)) + { + resBool = db->rollback(); + return 0; + } + + + //Удаление задач FIM + + /*Выборка задач FIM для этого обучаемого*/ + queryStr = QString("SELECT tasks_fim.task_id " + "FROM public.tasks_fim " + "WHERE tasks_fim.fk_trainee_id = %1 " + "ORDER BY tasks_fim.task_id ASC").arg( + id_trainee); + + QSqlQuery queryTasksFIMSEL = QSqlQuery(*db); + if(queryExec(queryStr, &queryTasksFIMSEL)) + { + while (queryTasksFIMSEL.next()) + {//Задача + int task_id = queryTasksFIMSEL.value(0).toInt(); + + /*Выборка неисправностей для этой задачи*/ + queryStr = QString("SELECT malfunctions.malfunction_id " + "FROM public.malfunctions " + "WHERE malfunctions.fk_task_fim_id = %1 " + "ORDER BY malfunctions.malfunction_id ASC").arg( + task_id); + + QSqlQuery queryMulfSEL = QSqlQuery(*db); + if(queryExec(queryStr, &queryMulfSEL)) + { + while (queryMulfSEL.next()) + {//Неисправность + int mulf_id = queryMulfSEL.value(0).toInt(); + + /*Удаление сигналов для этой неисправности*/ + queryStr = QString("DELETE FROM public.malf_signs " + "WHERE malf_signs.fk_malfunction_id = %1 ").arg( + mulf_id); + QSqlQuery querySign = QSqlQuery(*db); + if(!queryExec(queryStr, &querySign)) + { + resBool = db->rollback(); + return 0; + } + }; + + } + else + { + resBool = db->rollback(); + return 0; + } + + /*Удаление неисправностей*/ + queryStr = QString("DELETE FROM public.malfunctions " + "WHERE malfunctions.fk_task_fim_id = %1 ").arg( + task_id); + QSqlQuery queryMulfDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryMulfDEL)) + { + resBool = db->rollback(); + return 0; + } + + /*Удаление отчетов для задачи*/ + /*Выборка отчетов для этой задачи*/ + queryStr = QString("SELECT reports.report_id " + "FROM public.reports " + "WHERE reports.fk_task_fim_id = %1 " + "ORDER BY reports.report_id ASC").arg( + task_id); + QSqlQuery queryReportsSEL = QSqlQuery(*db); + if(queryExec(queryStr, &queryReportsSEL)) + { + while (queryReportsSEL.next()) + {//отчет + int report_id = queryReportsSEL.value(0).toInt(); + + /*Удаление items для этого отчета*/ + queryStr = QString("DELETE FROM public.report_items " + "WHERE report_items.fk_report_id = %1 ").arg( + report_id); + QSqlQuery queryReportDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryReportDEL)) + { + resBool = db->rollback(); + return 0; + } + }; + + } + else + { + resBool = db->rollback(); + return 0; + } + + /*Удаление отчетов*/ + queryStr = QString("DELETE FROM public.reports " + "WHERE reports.fk_task_fim_id = %1 ").arg( + task_id); + QSqlQuery queryReportsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryReportsDEL)) + { + resBool = db->rollback(); + return 0; + } + // //////////////////////////// + }; + } + else + { + resBool = db->rollback(); + return 0; + } + + /*Удаление непосредственно задач FIM*/ + queryStr = QString("DELETE FROM public.tasks_fim " + "WHERE fk_trainee_id = %1 ").arg( + QString::number(id_trainee)); + + QSqlQuery queryTasksFIMDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryTasksFIMDEL)) + { + resBool = db->rollback(); + return 0; + } + + /*Удаление таймингов для обучаемого*/ + queryStr = QString("DELETE FROM public.timings " + "WHERE fk_trainee_id = %1 ").arg( + QString::number(id_trainee)); + + QSqlQuery queryTimingsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryTimingsDEL)) + { + resBool = db->rollback(); + return 0; + } + // //////////////////////////// + + + //Удаление обучаемого + queryStr = QString("DELETE FROM public.users " + "WHERE user_id = %1 AND users.type = '%2' " + "RETURNING users.user_id").arg( + QString::number(id_trainee), + TypeUserDBTrainee); + + res = queryExecInt(queryStr); + if(res) + { + resBool = db->commit(); + return res; + } + else + { + resBool = db->rollback(); + return 0; + } +} + +int DataBaseLMS::updateTrainee(Trainee trainee) +{ + QString computer_id = (trainee.getComputer().getID() == 0 ? QStringLiteral("null") : QString::number(trainee.getComputer().getID())); + + QString queryStr = QString("UPDATE public.users " + "SET name = '%1', login = '%2', password = '%3', archived = %4, logged_in = %5, " + "fk_group_id = %6, " + "fk_computer_id = %7 " + "WHERE user_id = %8 AND users.type = '%9' " + "RETURNING users.user_id").arg( + trainee.getName(), + trainee.getLogin(), + trainee.getPassword(), + trainee.getArchived() ? "true" : "false", + trainee.getLoggedIn() ? "true" : "false", + QString::number(trainee.getGroup().getID()), + computer_id, + QString::number(trainee.getID()), + TypeUserDBTrainee); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::insertTimingTrainee(int id_trainee) +{ + QString queryStr = QString("INSERT INTO public.timings (entry_time, exit_time, operating_time, fk_trainee_id) " + "VALUES (DEFAULT, DEFAULT, DEFAULT, %1) " + "RETURNING timings.timing_id").arg( + QString::number(id_trainee)); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateTimingTrainee(int id_trainee, TimingOfTrainee timing) +{ + QString queryStr = QString("UPDATE public.timings " + "SET entry_time = '%1', exit_time = '%2', operating_time = '%3', fk_trainee_id = %4 " + "WHERE timing_id = %5 " + "RETURNING timings.timing_id").arg( + timing.getEntryTimeS(), + timing.getExitTimeS(), + timing.getOperatingTimeS(), + QString::number(id_trainee), + QString::number(timing.getID()) ); + + return queryExecInt(queryStr); +} + +TimingOfTrainee DataBaseLMS::selectTimingTrainee(int id_trainee) +{ + TimingOfTrainee timing(id_trainee); + + QString queryStr = QString("SELECT timings.timing_id, timings.entry_time, timings.exit_time, timings.operating_time, timings.fk_trainee_id " + "FROM public.timings " + "WHERE fk_trainee_id = '%1'").arg(id_trainee); + + QSqlQuery querySel = QSqlQuery(*db); + + if(queryExec(queryStr, &querySel)) + { + if (querySel.first()) + {//Тайминг + timing.setID(querySel.value(0).toInt()); + timing.setEntryTime(querySel.value(1).toDateTime()); + timing.setExitTime(querySel.value(2).toDateTime()); + timing.setOperatingTime(querySel.value(3).toTime()); + timing.setTraineeID(querySel.value(4).toInt()); + } + } + + return timing; +} diff --git a/DataBaseLMS/databaselms_users.cpp b/DataBaseLMS/databaselms_users.cpp new file mode 100644 index 0000000..aa1641c --- /dev/null +++ b/DataBaseLMS/databaselms_users.cpp @@ -0,0 +1,101 @@ +#include "databaselms.h" + +#include +#include +#include +#include + +int DataBaseLMS::selectUserID(QString type, QString login, QString password) +{ + QString queryStr; + + if(password != QStringLiteral("")) + { + queryStr = QString("SELECT users.user_id " + "FROM public.users " + "WHERE login = '%1' AND password = '%2' AND users.type = '%3' ").arg( + login, + password, + type); + } + else + { + queryStr = QString("SELECT users.user_id " + "FROM public.users " + "WHERE login = '%1' AND users.type = '%2' ").arg( + login, + type); + } + + return queryExecInt(queryStr); +} + +QString DataBaseLMS::selectUserNameByLogin(QString type, QString login) +{ + QString queryStr = QString("SELECT users.name " + "FROM public.users " + "WHERE users.login = '%1' AND users.type = '%2' ").arg( + login, + type ); + + return queryExecString(queryStr); +} + +bool DataBaseLMS::selectUserLoggedIn(QString type, int id_user) +{ + QString queryStr = QString("SELECT users.logged_in " + "FROM public.users " + "WHERE user_id = %1 AND users.type = '%2' ").arg( + QString::number(id_user), + type ); + + return queryExecBool(queryStr); +} + +bool DataBaseLMS::selectUserArchived(QString type, int id_user) +{ + QString queryStr = QString("SELECT users.archived " + "FROM public.users " + "WHERE user_id = %1 AND users.type = '%2' ").arg( + QString::number(id_user), + type ); + + return queryExecBool(queryStr); +} + +int DataBaseLMS::updateUserLoggedIn(QString type, int id_user, bool loggedIn) +{ + QString queryStr = QString("UPDATE public.users " + "SET logged_in = %1 " + "WHERE user_id = %2 AND users.type = '%3' " + "RETURNING users.user_id").arg( + loggedIn ? "true" : "false", + QString::number(id_user), + type); + + return queryExecInt(queryStr); +} + +bool DataBaseLMS::updateAllUsersLoggedIn(QString type, bool loggedIn) +{ + QString queryStr = QString("UPDATE public.users " + "SET logged_in = %1 " + "WHERE users.type = '%2' ").arg( + loggedIn ? "true" : "false", + type); + + return queryExecBool(queryStr); +} + +int DataBaseLMS::updateUserArchived(QString type, int id_user, bool archived) +{ + QString queryStr = QString("UPDATE public.users " + "SET archived = %1 " + "WHERE user_id = %2 AND users.type = '%3' " + "RETURNING users.user_id").arg( + archived ? "true" : "false", + QString::number(id_user), + type); + + return queryExecInt(queryStr); +} diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index c439a8a..4be22c3 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -5,9 +5,10 @@ #include #include "interfacedatabaselms.h" -InterfaceDataBaseLMS::InterfaceDataBaseLMS(QWidget* parent): - QWidget(parent), - DataBaseLMS() +InterfaceDataBaseLMS::InterfaceDataBaseLMS(QWidget *ownerWidget, QObject *parent): + QObject(parent), + DataBaseLMS(ownerWidget), + ownerWidget(ownerWidget) { } @@ -18,210 +19,171 @@ void InterfaceDataBaseLMS::slot_LanguageChanged(QString language) QCoreApplication::installTranslator(&qtLanguageTranslator); } -bool InterfaceDataBaseLMS::ConnectionToDB() +bool InterfaceDataBaseLMS::connectionToDB() { + //QMutexLocker mtxLocker(&mtxAccess); if(!createConnection()) { - QMessageBox::critical(nullptr, dbSettings.dbName, tr("Connection error: ") + db->lastError().text()); + QMessageBox::critical(ownerWidget, dbSettings.dbName, tr("Connection error: ") + db->lastError().text()); return false; } else { - //QMessageBox::information(nullptr, dbName, tr("Connection is successful!")); + //QMessageBox::information(ownerWidget, dbName, tr("Connection is successful!")); return true; } } -bool InterfaceDataBaseLMS::DisConnectionFromDB() -{ +bool InterfaceDataBaseLMS::disConnectionFromDB() +{ + //QMutexLocker mtxLocker(&mtxAccess); deleteConnection(); - //QMessageBox::information(nullptr, dbName, tr("Disconnection is successful!")); + //QMessageBox::information(ownerWidget, dbName, tr("Disconnection is successful!")); return true; } bool InterfaceDataBaseLMS::DBisConnected() { + //QMutexLocker mtxLocker(&mtxAccess); return isConnected(); } //Инструкторы -bool InterfaceDataBaseLMS::AuthorizationInstructor(QString login, QString password) +bool InterfaceDataBaseLMS::authorizationInstructor(QString login, QString password) { - if(! transactionBegin()) - return false; + //QMutexLocker mtxLocker(&mtxAccess); - if(int id = selectInstructorID(login, password)) + if(int id = selectUserID(DataBaseLMS::TypeUserDBInstructor, login, password)) { - if(isArchivedInstructor(id) || isLoggedInInstructor(id)) - { - transactionEnd(); + if(selectUserArchived(DataBaseLMS::TypeUserDBInstructor, id) || selectUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id)) return false; - } - if(updateInstructorLoggedIn(id, true)) - return transactionEnd(); - } - transactionEnd(); + if(updateUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id, true)) + return true; + } return false; } bool InterfaceDataBaseLMS::deAuthorizationInstructor(QString login) { - if(! transactionBegin()) - return false; + //QMutexLocker mtxLocker(&mtxAccess); - if(int id = selectInstructorID(login)) + if(int id = selectUserID(DataBaseLMS::TypeUserDBInstructor, login)) { - if(updateInstructorLoggedIn(id, false)) - return transactionEnd(); + if(updateUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id, false)) + return true; } - - transactionEnd(); return false; } bool InterfaceDataBaseLMS::deAuthorizationAllInstructors() { - return updateAllInstructorsLoggedIn(false); + //QMutexLocker mtxLocker(&mtxAccess); + return updateAllUsersLoggedIn(DataBaseLMS::TypeUserDBInstructor, false); } QString InterfaceDataBaseLMS::getNameInstructorByLogin(QString login) { - return selectInstructorNameByLogin(login); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserNameByLogin(DataBaseLMS::TypeUserDBInstructor, login); } int InterfaceDataBaseLMS::getIdInstructorByLogin(QString login) { - return selectInstructorID(login); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserID(DataBaseLMS::TypeUserDBInstructor, login); } QList InterfaceDataBaseLMS::getListInstructors() { + //QMutexLocker mtxLocker(&mtxAccess); return selectAllInstructors(); } Instructor InterfaceDataBaseLMS::getInstructor(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return selectInstructor(id); } int InterfaceDataBaseLMS::newInstructor() { + //QMutexLocker mtxLocker(&mtxAccess); return insertInstructor(); } int InterfaceDataBaseLMS::delInstructor(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return deleteInstructor(id); } int InterfaceDataBaseLMS::editInstructor(Instructor instructor) { - //Проверка корректности логина, имени, пароля - QList listInstructors = selectAllInstructors(); - for(Instructor exist_instructor : listInstructors) - { - if(instructor.getName() == QStringLiteral("")) - {//Имя не корректно! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("Unacceptable instructor name has been entered.\nThe changes will not be accepted.")); - return 0; - } - - if(instructor.getLogin() == QStringLiteral("")) - {//Логин не корректен! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("Unacceptable instructor login has been entered.\nThe changes will not be accepted.")); - return 0; - } - - if(instructor.getPassword() == QStringLiteral("")) - {//Пароль не корректный! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("Unacceptable instructor password has been entered.\nThe changes will not be accepted.")); - return 0; - } - - if(instructor.getName() == exist_instructor.getName() && instructor.getID() != exist_instructor.getID()) - {//Имя уже существует - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("An existing instructor name has been entered.")); - return 0; - } - - if(instructor.getLogin() == exist_instructor.getLogin() && instructor.getID() != exist_instructor.getID()) - {//Логин уже существует! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("An existing instructor login has been entered.\nThe changes will not be accepted.")); - return 0; - } - } - + //QMutexLocker mtxLocker(&mtxAccess); return updateInstructor(instructor); } bool InterfaceDataBaseLMS::isAdminInstructor(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return selectInstructorIsAdmin(id); } bool InterfaceDataBaseLMS::isArchivedInstructor(int id) { - return selectInstructorArchived(id); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserArchived(DataBaseLMS::TypeUserDBInstructor, id); } bool InterfaceDataBaseLMS::isLoggedInInstructor(int id) { - return selectInstructorLoggedIn(id); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id); } //Инструкторы -bool InterfaceDataBaseLMS::AuthorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name) +bool InterfaceDataBaseLMS::authorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name) { - if(! transactionBegin()) - return false; + //QMutexLocker mtxLocker(&mtxAccess); - if(int id = selectTraineeID(login, password)) + if(int id = selectUserID(DataBaseLMS::TypeUserDBTrainee, login, password)) { - if(isArchivedTrainee(id) || isLoggedInTrainee(id)) - { - transactionEnd(); + if(selectUserArchived(DataBaseLMS::TypeUserDBTrainee, id) || selectUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id)) return false; - } - if(updateTraineeLoggedIn(id, true)) - return transactionEnd(); - } - transactionEnd(); + if(updateUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id, true)) + return true; + } return false; } bool InterfaceDataBaseLMS::deAuthorizationTrainee(QString login) { - if(! transactionBegin()) - return false; + //QMutexLocker mtxLocker(&mtxAccess); - if(int id = selectTraineeID(login)) + if(int id = selectUserID(DataBaseLMS::TypeUserDBTrainee, login)) { - if(updateTraineeLoggedIn(id, false)) - return transactionEnd(); + if(updateUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id, false)) + return true; } - - transactionEnd(); return false; } bool InterfaceDataBaseLMS::deAuthorizationAllTrainees() { - return updateAllTraineesLoggedIn(false); + //QMutexLocker mtxLocker(&mtxAccess); + return updateAllUsersLoggedIn(DataBaseLMS::TypeUserDBTrainee, false); } int InterfaceDataBaseLMS::entryTraineeOnSimulator(int id_trainee) { + //QMutexLocker mtxLocker(&mtxAccess); + TimingOfTrainee timing(id_trainee); timing = selectTimingTrainee(id_trainee); @@ -242,6 +204,8 @@ int InterfaceDataBaseLMS::entryTraineeOnSimulator(int id_trainee) int InterfaceDataBaseLMS::exitTraineeFromSimulator(int id_trainee) { + //QMutexLocker mtxLocker(&mtxAccess); + TimingOfTrainee timing(id_trainee); timing = selectTimingTrainee(id_trainee); @@ -262,218 +226,180 @@ int InterfaceDataBaseLMS::exitTraineeFromSimulator(int id_trainee) QString InterfaceDataBaseLMS::getNameTraineeOnComputer(QString computer_name) { + //QMutexLocker mtxLocker(&mtxAccess); return selectTraineeNameOnComputer(computer_name); } Trainee InterfaceDataBaseLMS::getTraineeOnComputer(QString computer_name) { + //QMutexLocker mtxLocker(&mtxAccess); return selectTraineeOnComputer(computer_name); } QString InterfaceDataBaseLMS::getNameTraineeByLogin(QString login) { - return selectTraineeNameByLogin(login); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserNameByLogin(DataBaseLMS::TypeUserDBTrainee, login); } int InterfaceDataBaseLMS::getIdTraineeByLogin(QString login) { - return selectTraineeID(login); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserID(DataBaseLMS::TypeUserDBTrainee, login); } QList InterfaceDataBaseLMS::getListTraineesInGroup(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return selectAllTraineesInGroup(id); } QList InterfaceDataBaseLMS::getListGroups() { + //QMutexLocker mtxLocker(&mtxAccess); return selectAllGroups(); } QList InterfaceDataBaseLMS::getListTrainees() { + //QMutexLocker mtxLocker(&mtxAccess); return selectAllTrainees(); } Trainee InterfaceDataBaseLMS::getTrainee(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return selectTrainee(id); } Group InterfaceDataBaseLMS::getGroup(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return selectGroup(id); } int InterfaceDataBaseLMS::newGroup() { + //QMutexLocker mtxLocker(&mtxAccess); return insertGroup(); } int InterfaceDataBaseLMS::delGroup(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return deleteGroup(id); } int InterfaceDataBaseLMS::editGroup(Group group) { - //Проверка корректности имени - QList listGroups = selectAllGroups(); - for(Group exist_group : listGroups) - { - if(group.getName() == QStringLiteral("")) - {//Имя не корректно! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("Unacceptable group name has been entered.\nThe changes will not be accepted.")); - return 0; - } - - if(group.getName() == exist_group.getName() && group.getID() != exist_group.getID()) - {//Имя уже существует - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("An existing group name has been entered.\nThe changes will not be accepted.")); - return 0; - } - } - + //QMutexLocker mtxLocker(&mtxAccess); return updateGroup(group); } int InterfaceDataBaseLMS::newTaskAMM(TaskAmmFim task, int id_trainee) { + //QMutexLocker mtxLocker(&mtxAccess); return insertTaskAMM(task, id_trainee); } int InterfaceDataBaseLMS::delTaskAMM(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return deleteTaskAMM(id); } int InterfaceDataBaseLMS::editTaskAMM(TaskAmmFim task) { + //QMutexLocker mtxLocker(&mtxAccess); return updateTaskAMM(task); } QList InterfaceDataBaseLMS::getListTasksAMMofTrainee(int id_trainee) { + //QMutexLocker mtxLocker(&mtxAccess); return selectTasksAMMofTrainee(id_trainee); } QList InterfaceDataBaseLMS::getListTasksFIMofTrainee(int id_trainee) { + //QMutexLocker mtxLocker(&mtxAccess); return selectTasksFIMofTrainee(id_trainee); } TaskAmmFim InterfaceDataBaseLMS::getTaskAMMbyID(int id_task) { + //QMutexLocker mtxLocker(&mtxAccess); return selectTaskAMMbyID(id_task); } TaskAmmFim InterfaceDataBaseLMS::getTaskFIMbyID(int id_task) { + //QMutexLocker mtxLocker(&mtxAccess); return selectTaskFIMbyID(id_task); } int InterfaceDataBaseLMS::newTaskFIM(TaskAmmFim task, int id_trainee) { + //QMutexLocker mtxLocker(&mtxAccess); return insertTaskFIM(task, id_trainee); } int InterfaceDataBaseLMS::delTaskFIM(int id) { - deleteReportFIM(id); + //QMutexLocker mtxLocker(&mtxAccess); return deleteTaskFIM(id); } int InterfaceDataBaseLMS::editTaskFIM(TaskAmmFim task) { + //QMutexLocker mtxLocker(&mtxAccess); return updateTaskFIM(task); } int InterfaceDataBaseLMS::replaceReportFIM(TaskAmmFim task) { - deleteReportFIM(task.getID()); - - if(int report_id = insertReportFIM(task)) - { - updateStatusTaskFIM(task.getID(), "checkup"); - return report_id; - } - - return 0; + //QMutexLocker mtxLocker(&mtxAccess); + return updateReportFIMforTask(task); } int InterfaceDataBaseLMS::changeStatusTaskFIM(int id_task, QString status) { + //QMutexLocker mtxLocker(&mtxAccess); return updateStatusTaskFIM(id_task, status); } int InterfaceDataBaseLMS::changeStatusTaskAMM(int id_task, QString status) { + //QMutexLocker mtxLocker(&mtxAccess); return updateStatusTaskAMM(id_task, status); } int InterfaceDataBaseLMS::newTrainee(int id_group) { + //QMutexLocker mtxLocker(&mtxAccess); return insertTrainee(id_group); } int InterfaceDataBaseLMS::delTrainee(int id) { + //QMutexLocker mtxLocker(&mtxAccess); return deleteTrainee(id); } int InterfaceDataBaseLMS::editTrainee(Trainee trainee) { - //Проверка корректности логина, имени, пароля - QList listTrainees = selectAllTrainees(); - for(Trainee exist_trainee : listTrainees) - { - if(trainee.getName() == QStringLiteral("")) - {//Имя не корректно! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("Unacceptable trainee name has been entered.\nThe changes will not be accepted.")); - return 0; - } - - if(trainee.getLogin() == QStringLiteral("")) - {//Логин не корректен! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("Unacceptable trainee login has been entered.\nThe changes will not be accepted.")); - return 0; - } - - if(trainee.getPassword() == QStringLiteral("")) - {//Пароль не корректный! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("Unacceptable trainee password has been entered.\nThe changes will not be accepted.")); - return 0; - } - - if(trainee.getName() == exist_trainee.getName() && trainee.getID() != exist_trainee.getID()) - {//Имя уже существует - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("An existing trainee name has been entered.")); - return 0; - } - - if(trainee.getLogin() == exist_trainee.getLogin() && trainee.getID() != exist_trainee.getID()) - {//Логин уже существует! - QMessageBox::critical(nullptr, tr("Editing error!"), - tr("An existing trainee login has been entered.\nThe changes will not be accepted.")); - return 0; - } - } - + //QMutexLocker mtxLocker(&mtxAccess); return updateTrainee(trainee); } bool InterfaceDataBaseLMS::isArchivedTrainee(int id) { - return selectTraineeArchived(id); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserArchived(DataBaseLMS::TypeUserDBTrainee, id); } bool InterfaceDataBaseLMS::isLoggedInTrainee(int id) { - return selectTraineeLoggedIn(id); + //QMutexLocker mtxLocker(&mtxAccess); + return selectUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id); } diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index e7484d3..6668637 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -8,25 +8,26 @@ #include "DataBaseLMS_global.h" #include "databaselms.h" -class DATABASELMS_EXPORT InterfaceDataBaseLMS : public /*QObject*/QWidget, DataBaseLMS +class DATABASELMS_EXPORT InterfaceDataBaseLMS : public QObject, DataBaseLMS { Q_OBJECT public: - InterfaceDataBaseLMS(QWidget* parent = nullptr); + InterfaceDataBaseLMS(QWidget *ownerWidget, QObject *parent = nullptr); public Q_SLOTS: void slot_LanguageChanged(QString language); public: //Соединение - bool ConnectionToDB(); - bool DisConnectionFromDB(); + bool connectionToDB(); + bool disConnectionFromDB(); bool DBisConnected(); + //Инструкторы - bool AuthorizationInstructor(QString login, QString password); + bool authorizationInstructor(QString login, QString password); bool deAuthorizationInstructor(QString login); bool deAuthorizationAllInstructors(); @@ -47,7 +48,7 @@ public: //Обучаемые - bool AuthorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name); + bool authorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name); bool deAuthorizationTrainee(QString login); bool deAuthorizationAllTrainees(); @@ -55,9 +56,6 @@ public: int entryTraineeOnSimulator(int id_trainee); int exitTraineeFromSimulator(int id_trainee); - - //void setTasks(QString login, QStringList tasks); - QString getNameTraineeOnComputer(QString computer_name); Trainee getTraineeOnComputer(QString computer_name); @@ -67,14 +65,26 @@ public: QList getListTraineesInGroup(int id); QList getListGroups(); QList getListTrainees(); - Trainee getTrainee(int id); - Group getGroup(int group_id); + int newTrainee(int id_group); + int delTrainee(int id); + int editTrainee(Trainee trainee); + + bool isArchivedTrainee(int id); + bool isLoggedInTrainee(int id); + + + //Группы + + Group getGroup(int group_id); int newGroup(); int delGroup(int id); int editGroup(Group group); + + //Задачи + int newTaskAMM(TaskAmmFim task, int id_trainee); int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); @@ -92,15 +102,10 @@ public: int changeStatusTaskFIM(int id_task, QString status); int changeStatusTaskAMM(int id_task, QString status); - int newTrainee(int id_group); - int delTrainee(int id); - int editTrainee(Trainee trainee); - - bool isArchivedTrainee(int id); - bool isLoggedInTrainee(int id); - private: QTranslator qtLanguageTranslator; + QWidget* ownerWidget; + //QMutex mtxAccess; }; #endif // INTERFACEDATABASELMS_H diff --git a/DataBaseLMS/resources.qrc b/DataBaseLMS/resources.qrc new file mode 100644 index 0000000..88e906c --- /dev/null +++ b/DataBaseLMS/resources.qrc @@ -0,0 +1,5 @@ + + + resources/blankXML/ErrorDB.xml + + diff --git a/DataBaseLMS/resources/blankXML/ErrorDB.xml b/DataBaseLMS/resources/blankXML/ErrorDB.xml new file mode 100644 index 0000000..62afe20 --- /dev/null +++ b/DataBaseLMS/resources/blankXML/ErrorDB.xml @@ -0,0 +1,3 @@ + + + diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 71c46db..0236a8d 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -295,6 +295,16 @@ int ConnectorToServer::getIdTraineeByLogin(QString login) return 0; } +int ConnectorToServer::getIdInstructorByLogin(QString login) +{ + for(Instructor instructor : listInstructors) + { + if(instructor.getLogin() == login) + return instructor.getID(); + } + return 0; +} + void ConnectorToServer::showVersionSelect() { QByteArray answer = dataParser->xmlAnswer_notify(cmd_CheckVersionList); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index d490fb5..4ffa61a 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -60,6 +60,7 @@ public: Group getGroup(int id); int getIdTraineeByLogin(QString login); + int getIdInstructorByLogin(QString login); void showVersionSelect(); void setLoginName(QString name); diff --git a/InstructorsAndTrainees/instructors/editorinstructors.cpp b/InstructorsAndTrainees/instructors/editorinstructors.cpp index 5aceb87..dd8fb02 100644 --- a/InstructorsAndTrainees/instructors/editorinstructors.cpp +++ b/InstructorsAndTrainees/instructors/editorinstructors.cpp @@ -270,7 +270,7 @@ bool EditorInstructors::verifyInstructor(Instructor instructor) { //Проверка корректности логина, имени, пароля - if(instructor.getName() == QStringLiteral("")) + if(instructor.getName() == QStringLiteral("")) {//Имя не корректно! QMessageBox::critical(this, tr("Editing error!"), tr("Unacceptable instructor name has been entered.\nThe changes will not be accepted.")); @@ -292,23 +292,13 @@ bool EditorInstructors::verifyInstructor(Instructor instructor) } - QList listInstructors = connectorToServer->getListInstructors(); - - for(Instructor exist_instructor : listInstructors) - { - if(instructor.getName() == exist_instructor.getName() && instructor.getID() != exist_instructor.getID()) - {//Имя уже существует - QMessageBox::critical(this, tr("Editing error!"), - tr("An existing instructor name has been entered.")); - return false; - } - - if(instructor.getLogin() == exist_instructor.getLogin() && instructor.getID() != exist_instructor.getID()) - {//Логин уже существует! - QMessageBox::critical(this, tr("Editing error!"), - tr("An existing instructor login has been entered.\nThe changes will not be accepted.")); - return false; - } + int user_I = connectorToServer->getIdInstructorByLogin(instructor.getLogin()); + int user_T = connectorToServer->getIdTraineeByLogin(instructor.getLogin()); + if((user_I && (user_I != instructor.getID())) || (user_T && (user_T != instructor.getID()))) + {//Логин уже существует! + QMessageBox::critical(this, tr("Editing error!"), + tr("An existing instructor or trainee login has been entered.\nThe changes will not be accepted.")); + return 0; } return true; diff --git a/InstructorsAndTrainees/trainees/editortrainees.cpp b/InstructorsAndTrainees/trainees/editortrainees.cpp index 0f59340..ccbf4f4 100644 --- a/InstructorsAndTrainees/trainees/editortrainees.cpp +++ b/InstructorsAndTrainees/trainees/editortrainees.cpp @@ -24,6 +24,13 @@ EditorTrainees::EditorTrainees(ConnectorToServer* connectorToServer, bool adminM ui->btnArchive->click(); waitAnimationWidget->setParent(this); + + ui->btnNewGroup->setEnabled(true); + ui->btnDeleteGroup->setEnabled(false); + ui->btnNewTrainee->setEnabled(false); + ui->btnDeleteTrainee->setEnabled(false); + ui->btnToOrFromArchiveTrainee->setEnabled(false); + ui->btnEdit->setEnabled(false); } EditorTrainees::~EditorTrainees() @@ -448,7 +455,7 @@ bool EditorTrainees::verifyTrainee(Trainee trainee) { //Проверка корректности логина, имени, пароля - if(trainee.getName() == QStringLiteral("")) + if(trainee.getName() == QStringLiteral("")) {//Имя не корректно! QMessageBox::critical(this, tr("Editing error!"), tr("Unacceptable trainee name has been entered.\nThe changes will not be accepted.")); @@ -469,23 +476,14 @@ bool EditorTrainees::verifyTrainee(Trainee trainee) return false; } - QList listTrainees = connectorToServer->getListTrainees(); - for(Trainee exist_trainee : listTrainees) - { - if(trainee.getName() == exist_trainee.getName() && trainee.getID() != exist_trainee.getID()) - {//Имя уже существует - QMessageBox::critical(this, tr("Editing error!"), - tr("An existing trainee name has been entered.")); - return false; - } - - if(trainee.getLogin() == exist_trainee.getLogin() && trainee.getID() != exist_trainee.getID()) - {//Логин уже существует! - QMessageBox::critical(this, tr("Editing error!"), - tr("An existing trainee login has been entered.\nThe changes will not be accepted.")); - return false; - } + int user_I = connectorToServer->getIdInstructorByLogin(trainee.getLogin()); + int user_T = connectorToServer->getIdTraineeByLogin(trainee.getLogin()); + if((user_I && (user_I != trainee.getID())) || (user_T && (user_T != trainee.getID()))) + {//Логин уже существует! + QMessageBox::critical(this, tr("Editing error!"), + tr("An existing instructor or trainee login has been entered.\nThe changes will not be accepted.")); + return 0; } return true; diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 928428e..5858d02 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -1,4 +1,5 @@ #include "processingsystem.h" +#include "providerdblms.h" #include diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index 2576e5e..f4e82eb 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -6,7 +6,7 @@ ProviderDBLMS::ProviderDBLMS(QWidget *parentWidget, QObject *parent) : QObject(parent), dbLMS(nullptr) { - dbLMS = new InterfaceDataBaseLMS(parentWidget); + dbLMS = new InterfaceDataBaseLMS(/*parentWidget*/nullptr); //ConnectionToDB(); } @@ -17,10 +17,10 @@ ProviderDBLMS::~ProviderDBLMS() void ProviderDBLMS::ConnectionToDB() { - mtxAccess.lock(); + mtxAccess.lock(); if(! dbLMS->DBisConnected()) { - if(dbLMS->ConnectionToDB()) + if(dbLMS->connectionToDB()) { Q_EMIT signal_BlockAutorization(false); //Q_EMIT signal_NeedUpdateUI(true, true); @@ -31,12 +31,12 @@ void ProviderDBLMS::ConnectionToDB() void ProviderDBLMS::DisConnectionFromDB() { - mtxAccess.lock(); + mtxAccess.lock(); if(dbLMS->DBisConnected()) { Q_EMIT signal_BlockAutorization(true); - dbLMS->DisConnectionFromDB(); + dbLMS->disConnectionFromDB(); //Q_EMIT signal_NeedUpdateUI(true, true); } @@ -72,7 +72,7 @@ bool ProviderDBLMS::authorizationTrainee(QString login, QString password, QStrin Q_EMIT signal_BlockAutorization(true); - bool res = dbLMS->AuthorizationTrainee(login, password, classroom_name, computer_name); + bool res = dbLMS->authorizationTrainee(login, password, classroom_name, computer_name); Q_EMIT signal_BlockAutorization(false); @@ -134,7 +134,7 @@ bool ProviderDBLMS::authorizationInstructor(QString login, QString password) Q_EMIT signal_BlockAutorization(true); - bool res = dbLMS->AuthorizationInstructor(login, password); + bool res = dbLMS->authorizationInstructor(login, password); Q_EMIT signal_BlockAutorization(false); @@ -224,18 +224,32 @@ bool ProviderDBLMS::deAuthorizationAll() bool ProviderDBLMS::entryTraineeOnSimulator(int id_trainee) { + mtxAccess.lock(); if(dbLMS->entryTraineeOnSimulator(id_trainee)) + { + mtxAccess.unlock(); return true; + } else + { + mtxAccess.unlock(); return false; + } } bool ProviderDBLMS::exitTraineeFromSimulator(int id_trainee) { + mtxAccess.lock(); if(dbLMS->exitTraineeFromSimulator(id_trainee)) + { + mtxAccess.unlock(); return true; + } else + { + mtxAccess.unlock(); return false; + } } int ProviderDBLMS::getIdTraineeByLogin(QString login) @@ -348,92 +362,164 @@ QList ProviderDBLMS::GetListAllGroups() int ProviderDBLMS::newInstructor() { - return dbLMS->newInstructor(); + int res = 0; + mtxAccess.lock(); + res = dbLMS->newInstructor(); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::delInstructor(int id) { - return dbLMS->delInstructor(id); + int res = 0; + mtxAccess.lock(); + res = dbLMS->delInstructor(id); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::editInstructor(Instructor instructor) { - return dbLMS->editInstructor(instructor); + int res = 0; + mtxAccess.lock(); + res = dbLMS->editInstructor(instructor); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::newTrainee(int id_group) { - return dbLMS->newTrainee(id_group); + int res = 0; + mtxAccess.lock(); + res = dbLMS->newTrainee(id_group); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::delTrainee(int id) { - return dbLMS->delTrainee(id); + int res = 0; + mtxAccess.lock(); + res = dbLMS->delTrainee(id); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::editTrainee(Trainee trainee) { - return dbLMS->editTrainee(trainee); + int res = 0; + mtxAccess.lock(); + res = dbLMS->editTrainee(trainee); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::newGroup() { - return dbLMS->newGroup(); + int res = 0; + mtxAccess.lock(); + res = dbLMS->newGroup(); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::delGroup(int id) { - return dbLMS->delGroup(id); + int res = 0; + mtxAccess.lock(); + res = dbLMS->delGroup(id); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::editGroup(Group group) { - return dbLMS->editGroup(group); + int res = 0; + mtxAccess.lock(); + res = dbLMS->editGroup(group); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::newTaskAMM(TaskAmmFim task, int id_trainee) { - return dbLMS->newTaskAMM(task, id_trainee); + int res = 0; + mtxAccess.lock(); + res = dbLMS->newTaskAMM(task, id_trainee); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::delTaskAMM(int id) { - return dbLMS->delTaskAMM(id); + int res = 0; + mtxAccess.lock(); + res = dbLMS->delTaskAMM(id); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::editTaskAMM(TaskAmmFim task) { - return dbLMS->editTaskAMM(task); + int res = 0; + mtxAccess.lock(); + res = dbLMS->editTaskAMM(task); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::newTaskFIM(TaskAmmFim task, int id_trainee) { - return dbLMS->newTaskFIM(task, id_trainee); + int res = 0; + mtxAccess.lock(); + res = dbLMS->newTaskFIM(task, id_trainee); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::delTaskFIM(int id) { - return dbLMS->delTaskFIM(id); + int res = 0; + mtxAccess.lock(); + res = dbLMS->delTaskFIM(id); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::editTaskFIM(TaskAmmFim task) { - return dbLMS->editTaskFIM(task); + int res = 0; + mtxAccess.lock(); + res = dbLMS->editTaskFIM(task); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::replaceReportFIM(TaskAmmFim task) { - return dbLMS->replaceReportFIM(task); + int res = 0; + mtxAccess.lock(); + res = dbLMS->replaceReportFIM(task); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::changeStatusTaskFIM(int id_task, QString status) { - return dbLMS->changeStatusTaskFIM(id_task, status); + int res = 0; + mtxAccess.lock(); + res = dbLMS->changeStatusTaskFIM(id_task, status); + mtxAccess.unlock(); + return res; } int ProviderDBLMS::changeStatusTaskAMM(int id_task, QString status) { - return dbLMS->changeStatusTaskAMM(id_task, status); + int res = 0; + mtxAccess.lock(); + res = dbLMS->changeStatusTaskAMM(id_task, status); + mtxAccess.unlock(); + return res; } QList ProviderDBLMS::GetListTasksAMMofTrainee(int id_trainee) diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index 0bb0033..8277914 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -52,7 +52,7 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : updateController->moveToThread(updateThread); processingSystem = new ProcessingSystem(providerDBLMS, updateController); - processingSystem->moveToThread(updateThread); + //processingSystem->moveToThread(updateThread); dataParser = new DataParser(assetsManager,processingSystem);