diff --git a/src/g2_2025_grade_calculator_pkg/launch/grade_calculator.launch.xml b/src/g2_2025_grade_calculator_pkg/launch/grade_calculator.launch.xml
index ab2ff34..416837e 100644
--- a/src/g2_2025_grade_calculator_pkg/launch/grade_calculator.launch.xml
+++ b/src/g2_2025_grade_calculator_pkg/launch/grade_calculator.launch.xml
@@ -7,5 +7,8 @@
-
+
+
+
+
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 f895e37..e7b347a 100644
--- a/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.cpp
+++ b/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.cpp
@@ -295,4 +295,23 @@ std::vector DatabaseManager::get_failed_course_results() {
return failed_courses;
}
+bool DatabaseManager::update_retake_status(const StudentCourse& sc) {
+ if (!is_connected()) {
+ return false;
+ }
+
+ try {
+ pqxx::work txn(*conn_);
+ txn.exec_params(SQL_UPDATE_RETAKE_STATUS, sc.student_name, sc.course_name);
+ txn.commit();
+ return true;
+ } catch (const pqxx::sql_error &e) {
+ RCLCPP_ERROR(logger_, "[DBS] 'update retake status' failed: %s", e.what());
+ return false;
+ } catch (const std::exception &e) {
+ RCLCPP_ERROR(logger_, "[DBS] database error: %s", e.what());
+ return false;
+ }
+}
+
} // namespace assignments::one
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 09c41cd..66f6d3c 100644
--- a/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.hpp
+++ b/src/g2_2025_grade_calculator_pkg/src/database/DatabaseManager.hpp
@@ -45,6 +45,7 @@ public:
int get_final_course_grade(const StudentCourse& sc);
std::vector get_failed_course_results();
+ bool update_retake_status(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 0b9f5a8..cc0047d 100644
--- a/src/g2_2025_grade_calculator_pkg/src/database/SQLQueries.hpp
+++ b/src/g2_2025_grade_calculator_pkg/src/database/SQLQueries.hpp
@@ -36,6 +36,7 @@ static const std::string SQL_CREATE_COURSE_RESULTS = R"(
exam_count INTEGER NOT NULL,
final_grade INTEGER NOT NULL,
is_retake BOOLEAN DEFAULT FALSE,
+ retake_done BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
)";
@@ -64,7 +65,7 @@ static const std::string SQL_SELECT_STUDENT_EXAM_RESULTS = R"(
static const std::string SQL_SELECT_FAILED_COURSE_RESULTS = R"(
SELECT fcr.student_name, fcr.course_name, fcr.final_grade, fcr.exam_count
FROM final_course_results fcr
- WHERE fcr.final_grade < 55 AND fcr.is_retake = FALSE
+ WHERE fcr.final_grade < 55 AND fcr.retake_done = FALSE
)";
static const std::string SQL_INSERT_EXAM_RESULT = R"(
@@ -89,6 +90,12 @@ static const std::string SQL_SELECT_STUDENT_LIST = R"(
SELECT COUNT(*) FROM student_enrollments
)";
+static const std::string SQL_UPDATE_RETAKE_STATUS = R"(
+ UPDATE final_course_results
+ SET retake_done = TRUE
+ WHERE student_name = $1 AND course_name = $2 AND retake_done = FALSE
+)";
+
static const std::string SQL_INSERT_FINAL_COURSE_RESULT = R"(
INSERT INTO final_course_results (student_name, course_name, exam_count, final_grade, is_retake)
VALUES ($1, $2, $3, $4, $5)
diff --git a/src/g2_2025_grade_calculator_pkg/src/retake_grade_determinator/nodes/RetakeGradeDeterminator.cpp b/src/g2_2025_grade_calculator_pkg/src/retake_grade_determinator/nodes/RetakeGradeDeterminator.cpp
index 2f26ad6..ed25319 100644
--- a/src/g2_2025_grade_calculator_pkg/src/retake_grade_determinator/nodes/RetakeGradeDeterminator.cpp
+++ b/src/g2_2025_grade_calculator_pkg/src/retake_grade_determinator/nodes/RetakeGradeDeterminator.cpp
@@ -90,6 +90,8 @@ void RetakeGradeDeterminator::grade_calculator_response(
RCLCPP_WARN(this->get_logger(), "no database connection");
return;
}
+ data_map_[studentCourseCombo].clear();
+ db_manager_->update_retake_status(studentCourseCombo);
auto response = future.get();