summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkanat%bugzilla.org <>2007-03-09 12:34:05 +0100
committermkanat%bugzilla.org <>2007-03-09 12:34:05 +0100
commitf26ceb85a7ee96d66523fe75c9ed94e48660beed (patch)
treea15a6965010f7be192c29f802c9a93b0d42c1666
parenta3add1d45f66b3e9805dac8ba0d22bf71ffae4cf (diff)
downloadbugzilla-f26ceb85a7ee96d66523fe75c9ed94e48660beed.tar.gz
bugzilla-f26ceb85a7ee96d66523fe75c9ed94e48660beed.tar.xz
Bug 347475: [MySQL] Use InnoDB for most tables
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=mkanat
-rw-r--r--Bugzilla/DB/Mysql.pm30
-rw-r--r--Bugzilla/DB/Schema/Mysql.pm5
2 files changed, 30 insertions, 5 deletions
diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm
index 9b4102eb6..dc8ad2ef2 100644
--- a/Bugzilla/DB/Mysql.pm
+++ b/Bugzilla/DB/Mysql.pm
@@ -46,6 +46,7 @@ use strict;
use Bugzilla::Constants;
use Bugzilla::Util;
use Bugzilla::Error;
+use Bugzilla::DB::Schema::Mysql;
# This module extends the DB interface via inheritance
use base qw(Bugzilla::DB);
@@ -260,10 +261,10 @@ sub bz_setup_database {
# to type MyISAM if so. ISAM tables are deprecated in MySQL 3.23,
# which Bugzilla now requires, and they don't support more than 16
# indexes per table, which Bugzilla needs.
- my $sth = $self->prepare("SHOW TABLE STATUS");
- $sth->execute;
- my @isam_tables = ();
- while (my ($name, $type) = $sth->fetchrow_array) {
+ my $table_status = $self->selectall_arrayref("SHOW TABLE STATUS");
+ my @isam_tables;
+ foreach my $row (@$table_status) {
+ my ($name, $type) = @$row;
push(@isam_tables, $name) if $type eq "ISAM";
}
@@ -281,6 +282,27 @@ sub bz_setup_database {
print "\nISAM->MyISAM table conversion done.\n\n";
}
+ # Upgrade tables from MyISAM to InnoDB
+ my @myisam_tables;
+ foreach my $row (@$table_status) {
+ my ($name, $type) = @$row;
+ if ($type =~ /^MYISAM$/i
+ && !grep($_ eq $name, Bugzilla::DB::Schema::Mysql::MYISAM_TABLES))
+ {
+ push(@myisam_tables, $name) ;
+ }
+ }
+ if (scalar @myisam_tables) {
+ print "Bugzilla now uses the InnoDB storage engine in MySQL for",
+ " most tables.\nConverting tables to InnoDB:\n";
+ foreach my $table (@myisam_tables) {
+ print "Converting table $table... ";
+ $self->do("ALTER TABLE $table TYPE = InnoDB");
+ print "done.\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
diff --git a/Bugzilla/DB/Schema/Mysql.pm b/Bugzilla/DB/Schema/Mysql.pm
index d7cd708a2..358137ea5 100644
--- a/Bugzilla/DB/Schema/Mysql.pm
+++ b/Bugzilla/DB/Schema/Mysql.pm
@@ -85,6 +85,8 @@ use constant REVERSE_MAPPING => {
# as in their db-specific version, so no reverse mapping is needed.
};
+use constant MYISAM_TABLES => qw(longdescs);
+
#------------------------------------------------------------------------------
sub _initialize {
@@ -130,8 +132,9 @@ sub _get_create_table_ddl {
my($self, $table) = @_;
my $charset = Bugzilla->dbh->bz_db_is_utf8 ? "CHARACTER SET utf8" : '';
+ my $type = grep($_ eq $table, MYISAM_TABLES) ? 'MYISAM' : 'InnoDB';
return($self->SUPER::_get_create_table_ddl($table)
- . " ENGINE = MYISAM $charset");
+ . " ENGINE = $type $charset");
} #eosub--_get_create_table_ddl
#------------------------------------------------------------------------------