# - longdescs
# - votes
+ # Also, the attach_data table uses attachments.attach_id as a foreign
+ # key, and so indirectly depends on a bug deletion too.
+
$dbh->bz_lock_tables('attachments WRITE', 'bug_group_map WRITE',
'bugs WRITE', 'bugs_activity WRITE', 'cc WRITE',
'dependencies WRITE', 'duplicates WRITE',
'flags WRITE', 'keywords WRITE',
- 'longdescs WRITE', 'votes WRITE');
+ 'longdescs WRITE', 'votes WRITE',
+ 'attach_data WRITE');
$dbh->do("DELETE FROM bug_group_map WHERE bug_id = ?", undef, $bug_id);
$dbh->do("DELETE FROM bugs_activity WHERE bug_id = ?", undef, $bug_id);
$dbh->do("DELETE FROM keywords WHERE bug_id = ?", undef, $bug_id);
$dbh->do("DELETE FROM longdescs WHERE bug_id = ?", undef, $bug_id);
$dbh->do("DELETE FROM votes WHERE bug_id = ?", undef, $bug_id);
+
+ # The attach_data table doesn't depend on bugs.bug_id directly.
+ my $attach_ids =
+ $dbh->selectcol_arrayref("SELECT attach_id FROM attachments
+ WHERE bug_id = ?", undef, $bug_id);
+
+ if (scalar(@$attach_ids)) {
+ $dbh->do("DELETE FROM attach_data WHERE id IN (" .
+ join(",", @$attach_ids) . ")");
+ }
+
# Several of the previous tables also depend on attach_id.
$dbh->do("DELETE FROM attachments WHERE bug_id = ?", undef, $bug_id);
$dbh->do("DELETE FROM bugs WHERE bug_id = ?", undef, $bug_id);
# Remove all references to deleted bugs
###########################################################################
-if (defined $cgi->param('remove_invalid_references')) {
+if (defined $cgi->param('remove_invalid_bug_references')) {
Status("OK, now removing all references to deleted bugs.");
$dbh->bz_lock_tables('attachments WRITE', 'bug_group_map WRITE',
Status("All references to deleted bugs have been removed.");
}
+###########################################################################
+# Remove all references to deleted attachments
+###########################################################################
+
+if (defined $cgi->param('remove_invalid_attach_references')) {
+ Status("OK, now removing all references to deleted attachments.");
+
+ $dbh->bz_lock_tables('attachments WRITE', 'attach_data WRITE');
+
+ my $attach_ids =
+ $dbh->selectcol_arrayref('SELECT attach_data.id
+ FROM attach_data
+ LEFT JOIN attachments
+ ON attachments.attach_id = attach_data.id
+ WHERE attachments.attach_id IS NULL');
+
+ if (scalar(@$attach_ids)) {
+ $dbh->do('DELETE FROM attach_data WHERE id IN (' .
+ join(',', @$attach_ids) . ')');
+ }
+
+ $dbh->bz_unlock_tables();
+ Status("All references to deleted attachments have been removed.");
+}
print "OK, now running sanity checks.<p>\n";
}
# 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};
+ print qq{<a href="sanitycheck.cgi?remove_invalid_bug_references=1">
+ Remove invalid references to non existent bugs.</a><p>\n};
+ }
+ # References to non existent attachments can be safely removed.
+ if ($table eq 'attachments' && $has_bad_references) {
+ print qq{<a href="sanitycheck.cgi?remove_invalid_attach_references=1">
+ Remove invalid references to non existent attachments.</a><p>\n};
}
}
}
['whine_queries', 'eventid'],
['whine_schedules', 'eventid']);
+CrossCheck('attachments', 'attach_id',
+ ['attach_data', 'id']);
+
###########################################################################
# Perform double field referential (cross) checks
###########################################################################