]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 288461: sanitycheck.cgi should permit to clean all invalid references to deleted...
authorlpsolit%gmail.com <>
Wed, 13 Apr 2005 00:24:33 +0000 (00:24 +0000)
committerlpsolit%gmail.com <>
Wed, 13 Apr 2005 00:24:33 +0000 (00:24 +0000)
sanitycheck.cgi

index 89b657e9075dcee59c035aac9125ac57ad4004a2..e8f4988fb392c4aaaf47fc38bcfe3885309f6dbf 100755 (executable)
@@ -175,6 +175,10 @@ if (defined $cgi->param('cleangroupsnow')) {
            "- reduced from $before records to $after records");
 }
 
+###########################################################################
+# Send unsent mail
+###########################################################################
+
 if (defined $cgi->param('rescanallBugMail')) {
     require Bugzilla::BugMail;
 
@@ -202,6 +206,42 @@ if (defined $cgi->param('rescanallBugMail')) {
     exit;
 }
 
+###########################################################################
+# Remove all references to deleted bugs
+###########################################################################
+
+if (defined $cgi->param('remove_invalid_references')) {
+    Status("OK, now removing all references to deleted bugs.");
+
+    $dbh->bz_lock_tables('attachments WRITE', 'bug_group_map WRITE',
+                         'bugs_activity WRITE', 'cc WRITE',
+                         'dependencies WRITE', 'duplicates WRITE',
+                         'flags WRITE', 'keywords WRITE',
+                         'longdescs WRITE', 'votes WRITE', 'bugs READ');
+
+    foreach my $pair ('attachments/', 'bug_group_map/', 'bugs_activity/', 'cc/',
+                      'dependencies/blocked', 'dependencies/dependson',
+                      'duplicates/dupe', 'duplicates/dupe_of',
+                      'flags/', 'keywords/', 'longdescs/', 'votes/') {
+
+        my ($table, $field) = split('/', $pair);
+        $field ||= "bug_id";
+
+        my $bug_ids =
+          $dbh->selectcol_arrayref("SELECT $table.$field FROM $table
+                                    LEFT JOIN bugs ON $table.$field = bugs.bug_id
+                                    WHERE bugs.bug_id IS NULL");
+
+        if (scalar(@$bug_ids)) {
+            $dbh->do("DELETE FROM $table WHERE $field IN (" . join(',', @$bug_ids) . ")");
+        }
+    }
+
+    $dbh->bz_unlock_tables();
+    Status("All references to deleted bugs have been removed.");
+}
+
+
 print "OK, now running sanity checks.<p>\n";
 
 ###########################################################################
@@ -247,6 +287,7 @@ sub CrossCheck {
                 "WHERE  $table.$field IS NULL " .
                 "  AND  $refertable.$referfield IS NOT NULL");
 
+        my $has_bad_references = 0;
         while (MoreSQLData()) {
             my ($value, $key) = FetchSQLData();
             if (!$exceptions{$value}) {
@@ -260,8 +301,13 @@ sub CrossCheck {
                     }
                 }
                 Alert($alert);
+                $has_bad_references = 1;
             }
         }
+        # References to non existent bugs can be safely removed, bug 288461
+        if ($table eq 'bugs' && $has_bad_references) {
+            print qq{<a href="sanitycheck.cgi?remove_invalid_references=1">Remove invalid references to non existent bugs.</a><p>\n};
+        }
     }
 }