]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 341091: checksetup breaks if there are duplicate versions for a product
authormkanat%bugzilla.org <>
Mon, 4 Sep 2006 02:15:58 +0000 (02:15 +0000)
committermkanat%bugzilla.org <>
Mon, 4 Sep 2006 02:15:58 +0000 (02:15 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=myk

Bugzilla/Install/DB.pm

index f649686e76c902b1cb1fa9c962be664f117d5cd9..7887d9844ea177a3f120875ed44d3dcef7fe3c6f 100644 (file)
@@ -406,8 +406,7 @@ sub update_table_definitions {
     # 2005-04-28 - LpSolit@gmail.com - Bug 7233: add an index to versions
     $dbh->bz_alter_column('versions', 'value',
                           {TYPE => 'varchar(64)', NOTNULL => 1});
-    $dbh->bz_add_index('versions', 'versions_product_id_idx',
-                       {TYPE => 'UNIQUE', FIELDS => [qw(product_id value)]});
+    _add_versions_product_id_index();
 
     if (!exists $dbh->bz_column_info('milestones', 'sortkey')->{DEFAULT}) {
         $dbh->bz_alter_column('milestones', 'sortkey',
@@ -2298,6 +2297,32 @@ sub _change_all_mysql_booleans_to_tinyint {
    }
 }
 
+# A helper for the below function.
+sub _de_dup_version {
+    my ($product_id, $version) = @_;
+    my $dbh = Bugzilla->dbh;
+    print "Fixing duplicate version $version in product_id $product_id...\n";
+    $dbh->do('DELETE FROM versions WHERE product_id = ? AND value = ?',
+             undef, $product_id, $version);
+    $dbh->do('INSERT INTO versions (product_id, value) VALUES (?,?)',
+             undef, $product_id, $version);
+}
+
+sub _add_versions_product_id_index {
+    my $dbh = Bugzilla->dbh;
+    if (!$dbh->bz_index_info('versions', 'versions_product_id_idx')) {
+        my $dup_versions = $dbh->selectall_arrayref(
+            'SELECT product_id, value FROM versions
+           GROUP BY product_id, value HAVING COUNT(value) > 1', {Slice=>{}});
+        foreach my $dup_version (@$dup_versions) {
+            _de_dup_version($dup_version->{product_id}, $dup_version->{value});
+        }
+
+        $dbh->bz_add_index('versions', 'versions_product_id_idx',
+            {TYPE => 'UNIQUE', FIELDS => [qw(product_id value)]});
+    }
+}
+
 sub _fix_whine_queries_title_and_op_sys_value {
     my $dbh = Bugzilla->dbh;
     if (!exists $dbh->bz_column_info('whine_queries', 'title')->{DEFAULT}) {