diff --git a/CHANGELOG.md b/CHANGELOG.md index 765899a9c..f46926a96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix an issue in getting the reports from GMP scanners [#659](https://github.com/greenbone/gvmd/pull/659) [#665](https://github.com/greenbone/gvmd/pull/665) - Fix GET_SYSTEM_REPORTS using slave_id [#668](https://github.com/greenbone/gvmd/pull/668) - Fix RAW_DATA when calling GET_INFO with type NVT without attributes name or info_id [#682](https://github.com/greenbone/gvmd/pull/682) -- Fix ORPHAN calculation in GET_TICKETS [#684](https://github.com/greenbone/gvmd/pull/684) +- Fix ORPHAN calculations in GET_TICKETS [#684](https://github.com/greenbone/gvmd/pull/684) [#692](https://github.com/greenbone/gvmd/pull/692) - Fix assignment of orphaned tickets to the current user [#685](https://github.com/greenbone/gvmd/pull/685) ### Removed diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c810c609..74edf966f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,7 +113,7 @@ include (CPack) ## Variables -set (GVMD_DATABASE_VERSION 216) +set (GVMD_DATABASE_VERSION 217) set (GVMD_SCAP_DATABASE_VERSION 15) diff --git a/src/manage_migrators.c b/src/manage_migrators.c index c2421e059..1ee595fe0 100644 --- a/src/manage_migrators.c +++ b/src/manage_migrators.c @@ -1244,6 +1244,46 @@ migrate_215_to_216 () return 0; } +/** + * @brief Migrate the database from version 216 to version 217. + * + * @return 0 success, -1 error. + */ +int +migrate_216_to_217 () +{ + sql_begin_immediate (); + + /* Ensure that the database is currently version 216. */ + + if (manage_db_version () != 216) + { + sql_rollback (); + return -1; + } + + /* Update the database. */ + + /* Ticket references to reports and results are now cleared when the + * report is deleted. */ + + sql ("UPDATE tickets" + " SET report = -1" + " WHERE report NOT IN (SELECT id FROM reports);"); + + sql ("UPDATE ticket_results" + " SET report = -1, result = -1" + " WHERE report NOT IN (SELECT id FROM reports);"); + + /* Set the database version to 217. */ + + set_db_version (217); + + sql_commit (); + + return 0; +} + #undef UPDATE_DASHBOARD_SETTINGS /** @@ -1266,6 +1306,7 @@ static migrator_t database_migrators[] = { {214, migrate_213_to_214}, {215, migrate_214_to_215}, {216, migrate_215_to_216}, + {217, migrate_216_to_217}, /* End marker. */ {-1, NULL}}; diff --git a/src/manage_sql.c b/src/manage_sql.c index 6c50dc43a..778567a21 100644 --- a/src/manage_sql.c +++ b/src/manage_sql.c @@ -26242,6 +26242,7 @@ delete_report_internal (report_t report) permissions_set_orphans ("report", report, LOCATION_TABLE); tags_remove_resource ("report", report, LOCATION_TABLE); + tickets_remove_report (report); /* Update the task state. */ diff --git a/src/manage_sql_tickets.c b/src/manage_sql_tickets.c index 3b2667f1c..d66f11a42 100644 --- a/src/manage_sql_tickets.c +++ b/src/manage_sql_tickets.c @@ -167,7 +167,7 @@ ticket_status_name (ticket_status_t status) { "iso_time (fix_verified_time)", NULL, KEYWORD_TYPE_STRING }, \ { "fix_verified_time", "fix_verified", KEYWORD_TYPE_INTEGER }, \ { \ - "(task = -1)", \ + "(task = -1 OR report = -1)", \ "orphan", \ KEYWORD_TYPE_INTEGER \ }, \ @@ -236,7 +236,7 @@ ticket_status_name (ticket_status_t status) { "iso_time (fix_verified_time)", NULL, KEYWORD_TYPE_STRING }, \ { "fix_verified_time", "fix_verified", KEYWORD_TYPE_INTEGER }, \ { \ - "(task = -1)", \ + "(task = -1 OR report = -1)", \ "orphan", \ KEYWORD_TYPE_INTEGER \ }, \ @@ -543,6 +543,7 @@ init_ticket_result_iterator (iterator_t *iterator, const gchar *ticket_id, " result_uuid" " FROM ticket_results%s" " WHERE ticket = %llu" + " AND report > 0" " ORDER BY id;", trash ? "_trash" : "", ticket); @@ -1624,6 +1625,27 @@ tickets_remove_task (task_t task) sql ("UPDATE tickets_trash SET task = -1 WHERE task = %llu;", task); } +/** + * @brief Remove a report from all tickets. + * + * @param[in] report Report. + */ +void +tickets_remove_report (report_t report) +{ + sql ("UPDATE tickets SET report = -1 WHERE report = %llu;", report); + sql ("UPDATE tickets_trash SET report = -1 WHERE report = %llu;", report); + + sql ("UPDATE ticket_results" + " SET report = -1, result = -1" + " WHERE report = %llu;", + report); + sql ("UPDATE ticket_results_trash" + " SET report = -1, result = -1" + " WHERE report = %llu;", + report); +} + /** * @brief Remove all of a user's tasks from all tickets. * diff --git a/src/manage_sql_tickets.h b/src/manage_sql_tickets.h index 8b189984a..f7cbf1fc4 100644 --- a/src/manage_sql_tickets.h +++ b/src/manage_sql_tickets.h @@ -68,6 +68,9 @@ inherit_tickets (user_t, user_t); void tickets_remove_task (task_t); +void +tickets_remove_report (report_t); + void tickets_remove_tasks_user (user_t);