diff --git a/CMakeLists.txt b/CMakeLists.txt index d5cb5a45e71f5217ab1495916fc85c09c81b8b5a..395d0b79528c0992243d903dcc5a9370fed13bf8 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 8bd04ea915e0010ce81d3db668cbac874423d2a8..ed4b1e501016ee9a81adfac8d114a36de3b4a600 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 b252c26006dee1070a7fa4ed38598a703bef8360..a9f2ad182d4e7a751452839eb560f524796efc2d 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 7099c4787c6d4b5d1ff1b56c879eb3bb7f3f5f2c..286e432cdf3d1fdb3c2645c9db65b90f94f88363 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 81ef63ab38188141e0d65577e9f7f666431aeb8a..740e2de796c8561ede09e5975e36850fe426d646 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 0000000000000000000000000000000000000000..5671b3339b5fc52ab6da32d431a2798f11678b13 --- /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 0000000000000000000000000000000000000000..2a4c77829e75b8943b9c0a54c437f1ea6dcfd2e6 --- /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