#include "databaselms.h" #include #include #include #include DataBaseLMS::DataBaseLMS(): db(nullptr), transactionBegined(false) { } DataBaseLMS::~DataBaseLMS() { deleteConnection(); } bool DataBaseLMS::createConnection() { mtxAccess.lock(); dbSettings = getDataBaseSettings(); dbSettings.connectionName = "Connection_" + dbSettings.dbName; db = new QSqlDatabase(QSqlDatabase::addDatabase(dbSettings.dbType, dbSettings.connectionName)); db->setDatabaseName(dbSettings.dbName); db->setUserName(dbSettings.dbUserName); db->setPassword(dbSettings.dbPassword); db->setHostName(dbSettings.dbHostName); db->setPort(dbSettings.dbPort); bool res = db->open(); 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(); return true; } } void DataBaseLMS::deleteConnection() { mtxAccess.lock(); if(transactionBegined) QSqlDatabase::database().rollback(); if(db != nullptr) { if(db->isOpen()) db->close(); 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; } DataBaseSettings DataBaseLMS::getDataBaseSettings() { DataBaseSettings settings; QFile file("config/settings.xml"); if(!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(nullptr, "Attention!", "The file could not be opened: config/settings.xml"); return settings; } QXmlStreamReader xmlReader(&file); while (!xmlReader.atEnd()){ if(xmlReader.isStartElement()){ if(xmlReader.name() == "DataBaseSettings") { foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()){ QString name = attr.name().toString(); QString value = attr.value().toString(); if(name == "Type"){ settings.dbType = value; } if(name == "Name"){ settings.dbName = value; } if(name == "UserName"){ settings.dbUserName = value; } if(name == "Password"){ settings.dbPassword = value; } if(name == "HostName"){ settings.dbHostName = value; } if(name == "Port"){ settings.dbPort = value.toInt(); } } } } xmlReader.readNext(); } file.close(); 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 = QString("UPDATE public.tasks_amm SET status = '%1' " "WHERE task_id = %2 " "RETURNING tasks_amm.task_id").arg( status, QString::number(task_id) ); return queryExecInt(queryStr); } 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; } 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; } 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::queryExecInt(QString queryStr) { QSqlQuery query = QSqlQuery(*db); if(queryExec(queryStr, &query)) { if(query.first()) return query.value(0).toInt(); } return 0; } QString DataBaseLMS::queryExecString(QString queryStr) { QSqlQuery query = QSqlQuery(*db); if(queryExec(queryStr, &query)) { if(query.first()) return query.value(0).toString(); } return QStringLiteral(""); } bool DataBaseLMS::queryExecBool(QString queryStr) { QSqlQuery query = QSqlQuery(*db); if(queryExec(queryStr, &query)) { if(query.first()) return query.value(0).toBool(); } return false; } 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, "Error query:\n" + query->lastError().text() + "\n" + "String of query:\n" + queryStr + "\n" + "Executed query:\n" + query->executedQuery()); }