]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 347475: [MySQL] Use InnoDB for most tables
authormkanat%bugzilla.org <>
Fri, 9 Mar 2007 11:34:05 +0000 (11:34 +0000)
committermkanat%bugzilla.org <>
Fri, 9 Mar 2007 11:34:05 +0000 (11:34 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=mkanat

Bugzilla/DB/Mysql.pm
Bugzilla/DB/Schema/Mysql.pm

index 9b4102eb6411da7c0b4f3c4af7a5659af70a7b9e..dc8ad2ef256da874458bb61e271437e7c049d704 100644 (file)
@@ -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
index d7cd708a2a2c99d0fb0a05bf62ee332980f31b21..358137ea57516c2dc9cf8acacdfe8a3f8ad281e5 100644 (file)
@@ -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
 #------------------------------------------------------------------------------