#include "databaselms.h" #include #include #include DataBaseLMS::DataBaseLMS(): db(nullptr) { createConnection(); } DataBaseLMS::~DataBaseLMS() { deleteConnection(); } bool DataBaseLMS::createConnection() { db = new QSqlDatabase(QSqlDatabase::addDatabase(dbType)); db->setDatabaseName(dbName); db->setUserName(dbUserName); db->setPassword(dbPassword); if(!db->open()) { QMessageBox::critical(nullptr, dbName, "Connection error: " + db->lastError().text()); return false; } else { QMessageBox::information(nullptr, dbName, "Connection is successful!"); return true; } } void DataBaseLMS::deleteConnection() { if(db != nullptr) { if(db->isOpen()) db->close(); delete db; } } 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(*db); if(!query.exec(queryStr)) { messageWarningErrorQuery(queryStr); } else { 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(*db); if(!query.exec(queryStr)) { messageWarningErrorQuery(queryStr); } else { 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); trainee.setTasks(selectTasksOfTrainee(trainee.getID())); 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(*db); if(!query.exec(queryStr)) { messageWarningErrorQuery(queryStr); } else { while (query.next()) {//Группа Group group; group.setID(query.value(0).toInt()); group.setName(query.value(1).toString()); listGroups.append(group); } } return listGroups; } 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 queryExec(queryStr); } int DataBaseLMS::deleteInstructor(int instructor_id) { QString queryStr = QString("DELETE FROM public.instructors WHERE instructor_id = %1 RETURNING instructors.instructor_id").arg(QString::number(instructor_id)); return queryExec(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 queryExec(queryStr); } int DataBaseLMS::insertGroup(Group group) { QString queryStr = QString("INSERT INTO public.groups (name) " "VALUES ('%1') RETURNING groups.group_id").arg( group.getName()); return queryExec(queryStr); } int DataBaseLMS::deleteGroup(int group_id) { QString queryStr = QString("DELETE FROM public.groups WHERE group_id = %1 RETURNING groups.group_id").arg(QString::number(group_id)); return queryExec(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 queryExec(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 queryExec(queryStr); } int DataBaseLMS::deleteTrainee(int trainee_id) { QString queryStr = QString("DELETE FROM public.trainees WHERE trainee_id = %1 RETURNING trainees.trainee_id").arg(QString::number(trainee_id)); return queryExec(queryStr); } 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 queryExec(queryStr); } QList DataBaseLMS::selectTasksOfTrainee(int trainee_id) { QList tasks; QString queryStr = QString("SELECT tasks.task_id, tasks.name " "FROM public.trainees " "JOIN public.trainees_tasks ON trainees_tasks.trainee_id = trainees.trainee_id " "JOIN public.tasks ON tasks.task_id = trainees_tasks.task_id " "WHERE trainees.trainee_id = %1 " "ORDER BY tasks.name ASC").arg( trainee_id); QSqlQuery query(*db); if(!query.exec(queryStr)) { messageWarningErrorQuery(queryStr); } else { while (query.next()) {//Задача Task task; task.setID(query.value(0).toInt()); task.setName(query.value(1).toString()); tasks.append(task); } } return tasks; } int DataBaseLMS::queryExec(QString queryStr) { QSqlQuery query(*db); if(!query.exec(queryStr)) { messageWarningErrorQuery(queryStr); return 0; } else { if(query.next()) return query.value(0).toInt(); else return 0; } } void DataBaseLMS::messageWarningErrorQuery(QString queryStr) { QMessageBox::warning(nullptr, dbName, "Error query: " + queryStr + "\n" + db->lastError().text()); }