From 2089ea7c87ec6a88af5e40b25219ca5c4aad551b Mon Sep 17 00:00:00 2001 From: Wessel Tip Date: Thu, 25 Sep 2025 11:58:34 +0200 Subject: [PATCH] feat(database): Add query to fetch all grades --- .../src/database/DatabaseManager.cpp | 28 +++++++++++++++++++ .../src/database/DatabaseManager.hpp | 3 ++ .../src/database/SQLQueries.hpp | 6 ++++ 3 files changed, 37 insertions(+) diff --git a/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.cpp b/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.cpp index 706e24c..fa0d313 100644 --- a/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.cpp @@ -207,4 +207,32 @@ void DatabaseManager::insert_sample_data() { } } +int DatabaseManager::get_final_course_grade(const StudentCourse& sc) { + if (!is_connected()) return -1; + + try { + pqxx::work txn(*conn_); + + auto result = txn.exec_params(SQL_SELECT_STUDENT_COURSE_RESULTS, sc.student_name, sc.course_name); + + if (result.size() == 1) { + int exam_count = result[0][0].as(); + if (exam_count == 0) { + return -1; // No exams taken + } + int avg_grade = static_cast(result[0][1].as() + 0.5); + return avg_grade; + } else { + return -1; // No results found + } + + } catch (const pqxx::sql_error &e) { + RCLCPP_ERROR(logger_, "[DBS] get final course grade failed: %s", e.what()); + return -1; + } catch (const std::exception &e) { + RCLCPP_ERROR(logger_, "[DBS] database error: %s", e.what()); + return -1; + } +} + } // namespace assignments::one::exam_result_generator diff --git a/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.hpp b/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.hpp index ba2dc40..d961337 100644 --- a/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.hpp @@ -36,6 +36,9 @@ public: bool store_exam_result(const std::string& student_name, const std::string& course_name, int grade); bool enroll_student_into_course(const StudentCourse& sc); bool store_final_course_result(const StudentCourse& sc, int exam_count, int final_grade); + + int get_final_course_grade(const StudentCourse& sc); + private: rclcpp::Logger logger_; diff --git a/src/g2_2025_grade_calculator_pkg/src/database/SQLQueries.hpp b/src/g2_2025_grade_calculator_pkg/src/database/SQLQueries.hpp index 1848728..f1549c4 100644 --- a/src/g2_2025_grade_calculator_pkg/src/database/SQLQueries.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/database/SQLQueries.hpp @@ -51,6 +51,12 @@ static const std::string SQL_SELECT_MISSING_RESULTS = R"( WHERE fcr.id IS NULL )"; +static const std::string SQL_SELECT_STUDENT_COURSE_RESULTS = R"( + SELECT COUNT(*), AVG(exam_grade) + FROM exam_results + WHERE student_name = $1 AND course_name = $2 +)"; + static const std::string SQL_INSERT_EXAM_RESULT = R"( INSERT INTO exam_results (student_name, course_name, exam_grade) VALUES ($1, $2, $3)