loadIniFiles(); //?? shared??? // update the engine first - get's around 1000 character limit on indexes..cd // however - Innodb does not support fulltext indexes, so this may fail... $this->updateEngine(); $this->updateCharacterSet(); } function loadIniFiles() { // will create the combined ini cache file for the running user. $ff = HTML_FlexyFramework::get(); $ff->generateDataobjectsCache(true); $this->dburl = parse_url($ff->database); $dbini = 'ini_'. basename($this->dburl['path']); $iniCache = $ff->DB_DataObject[$dbini]; $this->schema = parse_ini_file($iniCache, true); $this->links = parse_ini_file(preg_replace('/\.ini$/', '.links.ini', $iniCache), true); } function updateCharacterSet() { $db = DB_DataObject::factory('core_enum')->getDatabaseConnection(); $views = $db->getListOf( 'views'); foreach (array_keys($this->schema) as $tbl){ if(strpos($tbl, '__keys') !== false ){ continue; } if(in_array($tbl , $views)) { continue; } $ce = DB_DataObject::factory('core_enum'); $ce->query(" SELECT CCSA.character_set_name csname, CCSA.collation_name collatename FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = '{$ce->database()}' -- COLLATE utf8_general_ci AND T.table_name = '{$tbl}' -- COLLATE utf8_general_ci "); $ce->fetch(); if($ce->csname == 'utf8' && $ce->collatename == 'utf8_general_ci'){ echo "utf8: SKIP $tbl\n"; continue; } // this used to be utf8_unicode_ci //as the default collation for stored procedure parameters is utf8_general_ci and you can't mix collations. $ce = DB_DataObject::factory('core_enum'); // not sure why, but convert to does not actually change the 'charset=' bit.. $ce->query("ALTER TABLE $tbl CHARSET=utf8"); $ce->query("ALTER TABLE {$tbl} CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci"); echo "utf8: FIXED {$tbl}\n"; } } function updateEngine() { $db = DB_DataObject::factory('core_enum'); $db->query("show variables like 'innodb_file_per_table'"); $db->fetch(); if ($db->Value == 'OFF') { die("Error: set innodb_file_per_table = 1 in my.cnf\n\n"); } // get a list of table views... // innodb in single files is far more efficient that MYD or one big innodb file. // first check if database is using this format. $db = DB_DataObject::factory('core_enum')->getDatabaseConnection(); $views = $db->getListOf( 'views'); foreach (array_keys($this->schema) as $tbl){ if(strpos($tbl, '__keys') !== false ){ continue; } if(in_array($tbl , $views)) { continue; } $ce = DB_DataObject::factory('core_enum'); $ce->query("select engine from information_schema.tables where table_schema='{$ce->database()}' and table_name = '{$tbl}'"); $ce->fetch(); if($ce->engine == 'InnoDB' ){ echo "InnoDB: SKIP $tbl\n"; continue; } // this used to be utf8_unicode_ci //as the default collation for stored procedure parameters is utf8_general_ci and you can't mix collations. $ce = DB_DataObject::factory('core_enum'); $ce->query("ALTER TABLE $tbl ENGINE=InnoDB"); echo "InnoDB: FIXED {$tbl}\n"; } } }