Commit e7ba6d75 authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 374951: Handle different strange situations in installations and upgrades…

Bug 374951: Handle different strange situations in installations and upgrades that can leave you with a half-latin half-utf8 DB. Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat
parent 73a63de1
...@@ -290,17 +290,8 @@ EOT ...@@ -290,17 +290,8 @@ EOT
} }
} }
$self->_after_table_status(\@tables);
# 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.
if (grep($_ eq 'bugs', @tables)
&& $self->bz_column_info_real("bugs", "bug_id"))
{
$self->do('SELECT 1 FROM bugs WHERE bug_id IS NULL');
}
# Versions of Bugzilla before the existence of Bugzilla::DB::Schema did # Versions of Bugzilla before the existence of Bugzilla::DB::Schema did
# not provide explicit names for the table indexes. This means # not provide explicit names for the table indexes. This means
# that our upgrades will not be reliable, because we look for the name # that our upgrades will not be reliable, because we look for the name
...@@ -470,6 +461,17 @@ EOT ...@@ -470,6 +461,17 @@ EOT
} # foreach table } # foreach table
} # if old-name indexes } # 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. # And now we create the tables and the Schema object.
$self->SUPER::bz_setup_database(); $self->SUPER::bz_setup_database();
...@@ -564,7 +566,16 @@ EOT ...@@ -564,7 +566,16 @@ EOT
} }
# Convert the database to UTF-8 if the utf8 parameter is on. # 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; print <<EOT;
WARNING: We are about to convert your table storage format to UTF8. This WARNING: We are about to convert your table storage format to UTF8. This
...@@ -654,12 +665,37 @@ EOT ...@@ -654,12 +665,37 @@ EOT
$self->do("ALTER TABLE $table DEFAULT CHARACTER SET utf8"); $self->do("ALTER TABLE $table DEFAULT CHARACTER SET utf8");
} # foreach my $table (@tables) } # foreach my $table (@tables)
}
my $db_name = Bugzilla->localconfig->{db_name}; # Sometimes you can have a situation where all the tables are utf8,
$self->do("ALTER DATABASE $db_name CHARACTER SET 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 { sub bz_db_is_utf8 {
my $self = shift; my $self = shift;
my $db_collation = $self->selectrow_arrayref( my $db_collation = $self->selectrow_arrayref(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment