diff options
-rwxr-xr-x | sanitycheck.cgi | 115 |
1 files changed, 47 insertions, 68 deletions
diff --git a/sanitycheck.cgi b/sanitycheck.cgi index 34f93b690..caeb25138 100755 --- a/sanitycheck.cgi +++ b/sanitycheck.cgi @@ -287,80 +287,59 @@ CrossCheck("products", "id", DateCheck("groups", "last_changed"); DateCheck("profiles", "refreshed_when"); - ########################################################################### -# Perform product specific field checks +# Perform double field referential (cross) checks ########################################################################### - -Status("Checking version/products"); - -SendSQL("select distinct product_id, version from bugs"); -while (@row = FetchSQLData()) { - my @copy = @row; - push(@checklist, \@copy); -} - -foreach my $ref (@checklist) { - my ($product_id, $version) = (@$ref); - SendSQL("select count(*) from versions where product_id = $product_id and value = " . SqlQuote($version)); - if (FetchOneColumn() != 1) { - Alert("Bug(s) found with invalid product ID/version: $product_id/$version"); - } -} - -# Adding check for Target Milestones / products - matthew@zeroknowledge.com -Status("Checking milestone/products"); - -@checklist = (); -SendSQL("select distinct product_id, target_milestone from bugs"); -while (@row = FetchSQLData()) { - my @copy = @row; - push(@checklist, \@copy); -} - -foreach my $ref (@checklist) { - my ($product_id, $milestone) = (@$ref); - SendSQL("SELECT count(*) FROM milestones WHERE product_id = $product_id AND value = " . SqlQuote($milestone)); - if(FetchOneColumn() != 1) { - Alert("Bug(s) found with invalid product ID/milestone: $product_id/$milestone"); - } -} - - -Status("Checking default milestone/products"); - -@checklist = (); -SendSQL("select id, defaultmilestone from products"); -while (@row = FetchSQLData()) { - my @copy = @row; - push(@checklist, \@copy); -} - -foreach my $ref (@checklist) { - my ($product_id, $milestone) = (@$ref); - SendSQL("SELECT count(*) FROM milestones WHERE product_id = $product_id AND value = " . SqlQuote($milestone)); - if(FetchOneColumn() != 1) { - Alert("Product(s) found with invalid default milestone: $product_id/$milestone"); + +sub DoubleCrossCheck { + my $table = shift @_; + my $field1 = shift @_; + my $field2 = shift @_; + + Status("Checking references to $table.$field1 / $table.$field2"); + + while (@_) { + my $ref = shift @_; + my ($refertable, $referfield1, $referfield2, $keyname) = @$ref; + + Status("... from $refertable.$referfield1 / $refertable.$referfield2"); + + SendSQL("SELECT DISTINCT $refertable.$referfield1, $refertable.$referfield2" . ($keyname ? ", $refertable.$keyname" : '') . " " . + "FROM $refertable LEFT JOIN $table " . + " ON $refertable.$referfield1 = $table.$field1 " . + " AND $refertable.$referfield2 = $table.$field2 " . + "WHERE $table.$field1 IS NULL " . + " AND $table.$field2 IS NULL " . + " AND $refertable.$referfield1 IS NOT NULL " . + " AND $refertable.$referfield2 IS NOT NULL"); + + while (MoreSQLData()) { + my ($value1, $value2, $key) = FetchSQLData(); + + my $alert = "Bad values $value1, $value2 found in " . + "$refertable.$referfield1 / $refertable.$referfield2"; + if ($keyname) { + if ($keyname eq 'bug_id') { + $alert .= ' (bug ' . BugLink($key) . ')'; + } + else { + $alert .= " ($keyname == '$key')"; + } + } + Alert($alert); + } } } +DoubleCrossCheck("components", "product_id", "id", + ["bugs", "product_id", "component_id", "bug_id"]); -Status("Checking components/products"); - -@checklist = (); -SendSQL("select distinct product_id, component_id from bugs"); -while (@row = FetchSQLData()) { - my @copy = @row; - push(@checklist, \@copy); -} - -foreach my $ref (@checklist) { - my ($product_id, $component_id) = (@$ref); - SendSQL("select count(*) from components where product_id = $product_id and id = $component_id"); - if (FetchOneColumn() != 1) { - Alert(qq{Bug(s) found with invalid product/component ID: $product_id/$component_id}); - } -} +DoubleCrossCheck("versions", "product_id", "value", + ["bugs", "product_id", "version", "bug_id"]); + +DoubleCrossCheck("milestones", "product_id", "value", + ["bugs", "product_id", "target_milestone", "bug_id"], + ["products", "id", "defaultmilestone", "name"]); ########################################################################### # Perform login checks |