From 9d6453c91835c45b50877d7b3c5cbbabe6996f66 Mon Sep 17 00:00:00 2001 From: Sarah_deep <91503476+Sarahdeep@users.noreply.github.com> Date: Sun, 30 Apr 2023 01:55:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20=D1=81=D1=83=D1=89=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=B9,=20=D0=BD=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B7=D0=B0=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=20=D0=B1=D0=B4,=20=D0=B8=20=D0=BE=D0=B4=D0=BD=D1=83=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 +- include/entity/Solution.hpp | 5 + include/entity/Task.hpp | 3 + include/repository/ISolutionRepository.hpp | 2 +- include/repository/ITaskRepository.hpp | 6 +- include/repository/SolutionRepository.hpp | 173 +++++++++++++++++++++ include/repository/TaskRepository.hpp | 113 ++++++++++++++ 7 files changed, 298 insertions(+), 6 deletions(-) create mode 100644 include/repository/SolutionRepository.hpp create mode 100644 include/repository/TaskRepository.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d5cb5a4..395d0b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,6 @@ find_package(libpqxx REQUIRED) find_package(GTest REQUIRED) find_package(nlohmann_json REQUIRED) message(STATUS ${nlohmann_json_LIBRARIES}) -add_executable(${PROJECT_NAME} src/main.cpp include/entity/User.hpp include/repository/UserRepository.hpp include/dataBase/conn.hpp include/repository/IUserRepository.hpp include/entity/Solution.hpp include/entity/Task.hpp include/repository/ISolutionRepository.hpp include/repository/ISolutionRepository.hpp include/repository/ITaskRepository.hpp include/repository/ITaskRepository.hpp) +add_executable(${PROJECT_NAME} src/main.cpp include/entity/User.hpp include/repository/UserRepository.hpp include/dataBase/conn.hpp include/repository/IUserRepository.hpp include/entity/Solution.hpp include/entity/Task.hpp include/repository/ISolutionRepository.hpp include/repository/ISolutionRepository.hpp include/repository/ITaskRepository.hpp include/repository/ITaskRepository.hpp include/repository/TaskRepository.hpp include/repository/TaskRepository.hpp include/repository/SolutionRepository.hpp include/repository/SolutionRepository.hpp) #add_executable(${PROJECT_NAME} text-basic-metrics/tbm_main.cpp text-basic-metrics/tbm_main.cpp) строка для запуска моей части в text-basic-metrics target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES} ${antlr4-runtime_LIBRARIES} ${libpqxx_LIBRARIES} ${GTest_LIBRARIES} nlohmann_json::nlohmann_json) \ No newline at end of file diff --git a/include/entity/Solution.hpp b/include/entity/Solution.hpp index 8bd04ea..ed4b1e5 100644 --- a/include/entity/Solution.hpp +++ b/include/entity/Solution.hpp @@ -2,6 +2,7 @@ #define SOURCEDOUT_SOLUTION_HPP #include #include +#include class Solution{ private: @@ -12,6 +13,10 @@ private: size_t task_id; std::string result; public: + Solution(size_t id, std::string sendDate, size_t senderId, std::string source, size_t taskId, + std::string result) : id(id), send_date(std::move(sendDate)), sender_id(senderId), source(std::move(source)), + task_id(taskId), result(std::move(result)) {} + [[nodiscard]] size_t getId() const { return id; } diff --git a/include/entity/Task.hpp b/include/entity/Task.hpp index b252c26..a9f2ad1 100644 --- a/include/entity/Task.hpp +++ b/include/entity/Task.hpp @@ -1,11 +1,14 @@ #ifndef SOURCEDOUT_TASK_HPP #define SOURCEDOUT_TASK_HPP #include +#include class Task{ private: size_t id; std::string description; + public: + Task(size_t id, std::string description) : id(id), description(std::move(description)) {} [[nodiscard]] size_t getId() const { return id; } diff --git a/include/repository/ISolutionRepository.hpp b/include/repository/ISolutionRepository.hpp index 7099c47..286e432 100644 --- a/include/repository/ISolutionRepository.hpp +++ b/include/repository/ISolutionRepository.hpp @@ -12,7 +12,7 @@ class ISolutionRepository { virtual std::vector getSolutionsByTaskId(size_t task_id) = 0; - virtual void makeSolution(Solution solution) = 0; + virtual void storeSolution(Solution solution) = 0; virtual void updateSolution(Solution solution) = 0; diff --git a/include/repository/ITaskRepository.hpp b/include/repository/ITaskRepository.hpp index 81ef63a..740e2de 100644 --- a/include/repository/ITaskRepository.hpp +++ b/include/repository/ITaskRepository.hpp @@ -7,11 +7,9 @@ class ITaskRepository { virtual Task getTaskById(size_t id) = 0; - virtual Task updateTask(size_t id) = 0; + virtual void updateTask(Task task) = 0; - virtual Task updateTask(Task task) = 0; - - virtual void makeTask(Task task) = 0; + virtual void storeTask(Task task) = 0; virtual void deleteTask(Task task) = 0; diff --git a/include/repository/SolutionRepository.hpp b/include/repository/SolutionRepository.hpp new file mode 100644 index 0000000..5671b33 --- /dev/null +++ b/include/repository/SolutionRepository.hpp @@ -0,0 +1,173 @@ +#ifndef SOURCEDOUT_SOLUTIONREPOSITORY_HPP +#define SOURCEDOUT_SOLUTIONREPOSITORY_HPP + +#include +#include +#include +#include "ISolutionRepository.hpp" +#include "../entity/Solution.hpp" +#include "../dataBase/conn.hpp" +using namespace pqxx; + +class SolutionRepository : ISolutionRepository { + Solution getSolutionById(size_t id) override { + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = "SELECT * FROM Users WHERE id=" + std::to_string(id); + nontransaction n(c); + result r(n.exec(sql)); + log << "OK" << std::endl; + log.close(); + c.close(); + return makeSolution(r.begin()); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + std::vector getSolutionsBySenderId(size_t sender_id) override { + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = "SELECT * FROM solutions WHERE sender_id=" + std::to_string(sender_id); + nontransaction n(c); + result r(n.exec(sql)); + log << "OK" << std::endl; + log.close(); + c.close(); + std::vector solutions; + for(result::const_iterator k = r.begin(); k != r.end(); ++k) + solutions.push_back(makeSolution(k)); + return solutions; + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + std::vector getSolutionsByTaskId(size_t task_id) override { + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = "SELECT * FROM solutions WHERE task_id=" + std::to_string(task_id); + nontransaction n(c); + result r(n.exec(sql)); + log << "OK" << std::endl; + log.close(); + c.close(); + std::vector solutions; + for(result::const_iterator k = r.begin(); k != r.end(); ++k) + solutions.push_back(makeSolution(k)); + return solutions; + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + void storeSolution(Solution solution) override { + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = (boost::format("INSERT INTO solutions (send_date,sender_id, source, task_id, result) " \ + "VALUES (%s, %s, %s, %s, %s); ") % solution.getSendDate() % solution.getSenderId() % solution.getSource() % solution.getTaskId() % solution.getResult()).str(); + work w(c); + w.exec(sql); + w.commit(); + log << "OK" << std::endl; + log.close(); + c.close(); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + void updateSolution(Solution solution) override { + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = (boost::format("UPDATE solutions SET send_date = %s, sender_id = %s, source = %s, task_id = %s, resulr = %s ;") + % solution.getSendDate() % solution.getSenderId() % solution.getSource() % solution.getTaskId() % solution.getResult()).str(); + work w(c); + w.exec(sql); + log << "OK" << std::endl; + log.close(); + c.close(); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + void deleteSolutionById(size_t id) override { + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = "DELETE FROM solutions WHERE id=" + std::to_string(id); + work w(c); + w.commit(); + log << "OK" << std::endl; + log.close(); + c.close(); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + void deleteSolution(Solution solution) override { + deleteSolutionById(solution.getId()); + } + +private: + conn conn; + static Solution makeSolution(const result::const_iterator& c){ + return {c.at(c.column_number("id")).as(), + c.at(c.column_number("send_date")).as(), + c.at(c.column_number("sender_id")).as(), + c.at(c.column_number("source")).as(), + c.at(c.column_number("task_id")).as(), + c.at(c.column_number("result")).as()}; + } +}; + +#endif //SOURCEDOUT_SOLUTIONREPOSITORY_HPP diff --git a/include/repository/TaskRepository.hpp b/include/repository/TaskRepository.hpp new file mode 100644 index 0000000..2a4c778 --- /dev/null +++ b/include/repository/TaskRepository.hpp @@ -0,0 +1,113 @@ +#ifndef SOURCEDOUT_TASKREPOSITORY_HPP +#define SOURCEDOUT_TASKREPOSITORY_HPP + +#include +#include "ITaskRepository.hpp" +#include "pqxx/pqxx" +#include "../dataBase/conn.hpp" +using namespace pqxx; +class TaskRepository:ITaskRepository{ +public: + Task getTaskById(size_t id) override{ + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = "SELECT * FROM tasks WHERE id=" + std::to_string(id); + nontransaction n(c); + result r(n.exec(sql)); + log << "OK" << std::endl; + log.close(); + c.close(); + return makeTask(r.begin()); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + void updateTask(Task task) override{ + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = (boost::format("UPDATE tasks SET description = %s ;") % task.getDescription()).str(); + work w(c); + w.exec(sql); + log << "OK" << std::endl; + log.close(); + c.close(); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + void storeTask(Task task) override{ + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = (boost::format("INSERT INTO tasks (description) " \ + "VALUES (%s); ") % task.getDescription()).str(); + work w(c); + w.exec(sql); + w.commit(); + log << "OK" << std::endl; + log.close(); + c.close(); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } + + void deleteTask(Task task) override{ + deleteTaskById(task.getId()); + } + + void deleteTaskById(size_t task_id) override{ + try { + connection c(conn.getData()); + std::ofstream log("log.txt", std::ios_base::out | std::ios_base::app); + if (c.is_open()) { + log << "Opened database successfully: " << c.dbname() << std::endl; + } else { + log << "Can't open database" << std::endl; + std::cerr << "Can't open database" << std::endl; + } + std::string sql = "DELETE FROM tasks WHERE id=" + std::to_string(task_id); + work w(c); + w.commit(); + log << "OK" << std::endl; + log.close(); + c.close(); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + throw e; + } + } +private: + static Task makeTask(const result::const_iterator& c){ + return{c.at(c.column_number("id")).as(), + c.at(c.column_number("description")).as()}; + } + static conn conn; +}; + +#endif //SOURCEDOUT_TASKREPOSITORY_HPP -- GitLab