diff --git a/include/dbstructure.php b/include/dbstructure.php index 0d5c10f98d..fe44cc7649 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -7,13 +7,38 @@ require_once("include/text.php"); define('NEW_UPDATE_ROUTINE_VERSION', 1170); +/* + * Converts all tables from MyISAM to InnoDB + */ +function convert_to_innodb() { + global $db; + + $r = q("SELECT `TABLE_NAME` FROM `information_schema`.`tables` WHERE `engine` = 'MyISAM' AND `table_schema` = '%s'", + dbesc($db->database_name())); + + if (!dbm::is_result($r)) { + echo t('There are no tables on MyISAM.')."\n"; + return; + } + + foreach ($r AS $table) { + $sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", dbesc($table['TABLE_NAME'])); + echo $sql."\n"; + + $result = @$db->q($sql); + if (!dbm::is_result($result)) { + print_update_error($db, $sql); + } + } +} + /* * send the email and do what is needed to do on update fails * * @param update_id (int) number of failed update * @param error_message (str) error message */ -function update_fail($update_id, $error_message){ +function update_fail($update_id, $error_message) { //send the administrators an e-mail $admin_mail_list = "'".implode("','", array_map(dbesc, explode(",", str_replace(" ", "", $a->config['admin_email']))))."'"; $adminlist = q("SELECT uid, language, email FROM user WHERE email IN (%s)", @@ -95,10 +120,6 @@ function table_structure($table) { if (dbm::is_result($indexes)) foreach ($indexes AS $index) { - if ($index["Index_type"] == "FULLTEXT") { - continue; - } - if ($index['Key_name'] != 'PRIMARY' && $index['Non_unique'] == '0' && !isset($indexdata[$index["Key_name"]])) { $indexdata[$index["Key_name"]] = array('UNIQUE'); } @@ -460,7 +481,7 @@ function db_field_command($parameters, $create = true) { if ($parameters["not null"]) $fieldstruct .= " NOT NULL"; - if (isset($parameters["default"])){ + if (isset($parameters["default"])) { if (strpos(strtolower($parameters["type"]),"int")!==false) { $fieldstruct .= " DEFAULT ".$parameters["default"]; } else { @@ -487,7 +508,7 @@ function db_create_table($name, $fields, $verbose, $action, $indexes=null) { $primary_keys = array(); foreach ($fields AS $fieldname => $field) { $sql_rows[] = "`".dbesc($fieldname)."` ".db_field_command($field); - if (x($field,'primary') and $field['primary']!=''){ + if (x($field,'primary') and $field['primary']!='') { $primary_keys[] = $fieldname; } } @@ -1691,7 +1712,7 @@ function db_definition() { function dbstructure_run(&$argv, &$argc) { global $a, $db; - if (is_null($a)){ + if (is_null($a)) { $a = new App; } @@ -1730,6 +1751,9 @@ function dbstructure_run(&$argv, &$argc) { case "dumpsql": print_structure(db_definition()); return; + case "toinnodb": + convert_to_innodb(); + return; } } @@ -1741,11 +1765,12 @@ function dbstructure_run(&$argv, &$argc) { echo "dryrun show database update schema queries without running them\n"; echo "update update database schema\n"; echo "dumpsql dump database schema\n"; + echo "toinnodb convert all tables from MyISAM to InnoDB\n"; return; } -if (array_search(__file__,get_included_files())===0){ +if (array_search(__file__,get_included_files())===0) { dbstructure_run($_SERVER["argv"],$_SERVER["argc"]); killme(); } diff --git a/mod/admin.php b/mod/admin.php index c57e7f3545..6be08f45a7 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -447,7 +447,7 @@ function admin_page_summary(App $a) { $warningtext = array(); if (dbm::is_result($r)) { $showwarning = true; - $warningtext[] = sprintf(t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the convert_innodb.sql in the /util directory of your Friendica installation.
'), 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); + $warningtext[] = sprintf(t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php include/dbstructure.php toinnodb of your Friendica installation for an automatic conversion.
'), 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); } // MySQL >= 5.7.4 doesn't support the IGNORE keyword in ALTER TABLE statements if ((version_compare($db->server_info(), '5.7.4') >= 0) AND