]> git.mxchange.org Git - friendica.git/commitdiff
New command in dbstructure.php to convert all tables from MyISAM to InnoDB
authorMichael <heluecht@pirati.ca>
Sat, 22 Apr 2017 21:36:01 +0000 (21:36 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 22 Apr 2017 21:36:01 +0000 (21:36 +0000)
include/dbstructure.php
mod/admin.php

index 0d5c10f98dcf7ac110080b520850c9828e4de311..e5d29fa085f3acc9c61623bd4c4e633ba9c59ba9 100644 (file)
@@ -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 "innodb":
+                               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 "innodb            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();
 }
index c57e7f3545d510bf0b6eccf73207491a7df51a1c..c86c0db91e9671dca156c75db2973ca711494f36 100644 (file)
@@ -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 <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the <tt>convert_innodb.sql</tt> in the <tt>/util</tt> directory of your Friendica installation.<br />'), '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 <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php include/dbstructure.php innodb</tt> of your Friendica installation for an automatic conversion.<br />'), '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