]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 374951: Handle different strange situations in installations and upgrades th
authormkanat%bugzilla.org <>
Thu, 14 Feb 2008 12:16:29 +0000 (12:16 +0000)
committermkanat%bugzilla.org <>
Thu, 14 Feb 2008 12:16:29 +0000 (12:16 +0000)
at can leave you with a half-latin half-utf8 DB.
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat

Bugzilla/DB/Mysql.pm

index 9b4102eb6411da7c0b4f3c4af7a5659af70a7b9e..f9c80a59d5ee9902a068c51f6efb171b90b0f6c6 100644 (file)
@@ -281,16 +281,8 @@ sub bz_setup_database {
         print "\nISAM->MyISAM table conversion done.\n\n";
     }
 
-    # There is a bug in MySQL 4.1.0 - 4.1.15 that makes certain SELECT
-    # statements fail after a SHOW TABLE STATUS: 
-    # http://bugs.mysql.com/bug.php?id=13535
-    # This is a workaround, a dummy SELECT to reset the LAST_INSERT_ID.
     my @tables = $self->bz_table_list_real();
-    if (grep($_ eq 'bugs', @tables)
-        && $self->bz_column_info_real("bugs", "bug_id"))
-    {
-        $self->do('SELECT 1 FROM bugs WHERE bug_id IS NULL');
-    }
+    $self->_after_table_status(\@tables);
 
     # Versions of Bugzilla before the existence of Bugzilla::DB::Schema did 
     # not provide explicit names for the table indexes. This means
@@ -461,6 +453,17 @@ sub bz_setup_database {
         } # foreach table
     } # if old-name indexes
 
+    # If there are no tables, but the DB isn't utf8 and it should be,
+    # then we should alter the database to be utf8. We know it should be
+    # if the utf8 parameter is true or there are no params at all.
+    # This kind of situation happens when people create the database
+    # themselves, and if we don't do this they will get the big
+    # scary WARNING statement about conversion to UTF8.
+    if ( !$self->bz_db_is_utf8 && !@tables 
+         && (Bugzilla->params->{'utf8'} || !scalar keys %{Bugzilla->params}) )
+    {
+        $self->_alter_db_charset_to_utf8();
+    }
 
     # And now we create the tables and the Schema object.
     $self->SUPER::bz_setup_database();
@@ -551,7 +554,16 @@ sub bz_setup_database {
     }
 
     # Convert the database to UTF-8 if the utf8 parameter is on.
-    if (Bugzilla->params->{'utf8'} && !$self->bz_db_is_utf8) {
+    # We check if any table isn't utf8, because lots of crazy
+    # partial-conversion situations can happen, and this handles anything
+    # that could come up (including having the DB charset be utf8 but not
+    # the table charsets.
+    my $utf_table_status =
+        $self->selectall_arrayref("SHOW TABLE STATUS", {Slice=>{}});
+    $self->_after_table_status([map($_->{Name}, @$utf_table_status)]);
+    my @non_utf8_tables = grep($_->{Collation} !~ /^utf8/, @$utf_table_status);
+    
+    if (Bugzilla->params->{'utf8'} && scalar @non_utf8_tables) {
         print <<EOT;
 
 WARNING: We are about to convert your table storage format to UTF8. This
@@ -641,12 +653,37 @@ EOT
 
             $self->do("ALTER TABLE $table DEFAULT CHARACTER SET utf8");
         } # foreach my $table (@tables)
+    }
 
-        my $db_name = Bugzilla->localconfig->{db_name};
-        $self->do("ALTER DATABASE $db_name CHARACTER SET utf8");
+    # Sometimes you can have a situation where all the tables are utf8,
+    # but the database isn't. (This tends to happen when you've done
+    # a mysqldump.) So we have this change outside of the above block,
+    # so that it just happens silently if no actual *table* conversion
+    # needs to happen.
+    if (Bugzilla->params->{'utf8'} && !$self->bz_db_is_utf8) {
+        $self->_alter_db_charset_to_utf8();
+    }
+}
+
+# There is a bug in MySQL 4.1.0 - 4.1.15 that makes certain SELECT
+# statements fail after a SHOW TABLE STATUS: 
+# http://bugs.mysql.com/bug.php?id=13535
+# This is a workaround, a dummy SELECT to reset the LAST_INSERT_ID.
+sub _after_table_status {
+    my ($self, $tables) = @_;
+    if (grep($_ eq 'bugs', @$tables)
+        && $self->bz_column_info_real("bugs", "bug_id"))
+    {
+        $self->do('SELECT 1 FROM bugs WHERE bug_id IS NULL');
     }
 }
 
+sub _alter_db_charset_to_utf8 {
+    my $self = shift;
+    my $db_name = Bugzilla->localconfig->{db_name};
+    $self->do("ALTER DATABASE $db_name CHARACTER SET utf8"); 
+}
+
 sub bz_db_is_utf8 {
     my $self = shift;
     my $db_collation = $self->selectrow_arrayref(