ImpressCMS/impresscms

View on GitHub
upgrade/upd-icms-1.0-to-1.1/index.php

Summary

Maintainability
F
6 days
Test Coverage
<?php
/**
 * Upgrade script of ImpressCMS 1.0 to 1.1
 *
 * @copyright    http://www.impresscms.org/ The ImpressCMS Project
 * @license        http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU General Public License (GPL)
 * @package        upgrader
 * @since        1.1
 * @author        Sina Asghari <pesian_stranger@users.sourceforge.net>
 * @version        $Id: index.php 6931 2008-11-15 13:49:11Z pesian_stranger $
 */

class upgrade_impcms06 {

    public $usedFiles = array ();
    private $tasks = array(
        'table1', 'table2', 'table3', 'table4', 'conf',
        'customblocks', 'dbversion', 'db', 'salt', 'trust_path'
    );
    public $updater;

    public function __construct() {
        $this->updater = XoopsDatabaseFactory::getDatabaseUpdater();
    }

    public function isApplied() {
        if (!isset($_SESSION[__CLASS__]) || !is_array($_SESSION[__CLASS__])) {
            $_SESSION[__CLASS__] = array();
        }
        foreach ($this->tasks as $task) {
            if (!in_array($task, $_SESSION[__CLASS__])) {
                if (!$res = $this->{"check_{$task}"}()) {
                    $_SESSION[__CLASS__][] = $task;
                }
            }
        }
        return empty($_SESSION[__CLASS__]) ? true : false;
    }
    
    private function apply() {
        $tasks = $_SESSION[__CLASS__];
        foreach ($tasks as $task) {
            $res = $this->{"apply_{$task}"}();
            if (!$res) return false;
            array_shift($_SESSION[__CLASS__]);
        }
        return ($this->cleaning_write_folders());
    }

    private function cleaning_write_folders() {
        $dir = array();
        $dir['templates_c'] = XOOPS_ROOT_PATH . "/templates_c/";
        $dir['cache'] = XOOPS_ROOT_PATH . "/cache/";

        foreach ($dir as $d)
        {
            $dd = opendir($d);
            while($file = readdir($dd))
            {
                if(is_file($d.$file) && ($file != 'index.html' && $file != 'php.ini' && $file != '.htaccess'))
                {
                    unlink($d.$file);
                }
            }
            closedir($dd);
        }
        return true;
    }

    private function check_table1() {
        $table = new IcmsDatabasetable('icmspage');
        return $table->exists();
    }

    private function apply_table1() {
        // Create table icmspage
        $table = new IcmsDatabasetable('icmspage');
        if (!$table->exists()) {
            $table->setStructure("page_id mediumint(8) unsigned NOT NULL auto_increment,
                        page_moduleid mediumint(8) unsigned NOT NULL default '1',
                        page_title varchar(255) NOT NULL default '',
                        page_url varchar(255) NOT NULL default '',
                        page_status tinyint(1) unsigned NOT NULL default '1',
                        PRIMARY KEY (page_id)");
            return $this->updater->updateTable($table, true);
        }
        unset ($table);
    }
    
    private function check_table2() {
        $table = new IcmsDatabasetable('icmscontent');
        return $table->exists();
    }

    private function apply_table2() {
        // Create table icmscontent
        $table = new IcmsDatabasetable('icmscontent');
        if (!$table->exists()) {
            $table->setStructure("`content_id` mediumint(8) unsigned NOT NULL auto_increment,
                    `content_catid` mediumint(8) unsigned NOT NULL default '1',
                    `content_supid` mediumint(8) unsigned NOT NULL default '0',
                    `content_uid` mediumint(5) NOT NULL default '1',
                    `content_title` varchar(255) NOT NULL default '',
                    `content_menu` varchar(100) default NULL,
                    `content_body` text,
                    `content_css` text,
                    `content_visibility` int(10) NOT NULL default '3',
                    `content_created` int(10) NOT NULL default '0',
                    `content_updated` int(10) NOT NULL default '0',
                    `content_weight` smallint(5) unsigned NOT NULL default '0',
                    `content_reads` int(11) NOT NULL default '0',
                    `content_status` tinyint(1) unsigned NOT NULL default '0',
                    PRIMARY KEY (`content_id`)
                ");
            return $this->updater->updateTable($table, true);
        }
        unset ($table);
    }
    
    private function check_table3() {
        $table = new IcmsDatabasetable('invites');
        return $table->exists();
    }

    private function apply_table3() {
        // Create table invites
        $table = new IcmsDatabasetable('invites');
        if (!$table->exists()) {
            $table->setStructure("`invite_id` mediumint(8) unsigned NOT NULL auto_increment,
                            `from_id` mediumint(8) unsigned NOT NULL default '0',
                            `invite_to` varchar(255) NOT NULL default '',
                            `invite_code` varchar(8) NOT NULL default '',
                            `invite_date` int(10) unsigned NOT NULL default '0',
                            `view_date` int(10) unsigned NOT NULL default '0',
                            `register_id` mediumint(8) unsigned NOT NULL default '0',
                            `extra_info` text NOT NULL,
                            PRIMARY KEY (`invite_id`),
                            KEY `invite_code` (`invite_code`),
                            KEY `register_id` (`register_id`)
                ");
            return $this->updater->updateTable($table, true);
        }
        unset ($table);
    }
    
    private function check_table4() {
        $table = new IcmsDatabasetable('system_customtag');
        return $table->exists();
    }

    private function apply_table4() {
        // Create table system_customtag
        $table = new IcmsDatabasetable('system_customtag');
        if (!$table->exists()) {
            $table->setStructure("`customtagid` int(11) unsigned NOT NULL auto_increment,
                        `name` varchar(255) NOT NULL default '',
                        `description` text NOT NULL,
                        `content` text NOT NULL,
                        `language` varchar(100) NOT NULL default '',
                        `customtag_type` tinyint(1) NOT NULL default 0,
                        PRIMARY KEY (`customtagid`)");
            return $this->updater->updateTable($table, true);
        }
        unset ($table);
    }

    private function check_customblocks() {
        $result = $GLOBALS['xoopsDB']->queryF('SELECT `bid` FROM ' . $GLOBALS['xoopsDB']->prefix('newblocks') . ' WHERE `mid` = 0 AND `func_num` = 0');
        return count($GLOBALS['xoopsDB']->fetchArray($result)) > 0;
    }

    private function apply_customblocks() {
        $db = $GLOBALS['xoopsDB'];
        $result = $db->queryF("UPDATE ". $db->prefix('newblocks') . " SET mid=0 WHERE mid=1 AND func_num=0");
        return $result;
    }

    private function check_conf() {
        $table = new IcmsDatabasetable('modules');
        return $table->fieldExists('dbversion');
    }

    private function apply_conf() {
        $db = $GLOBALS['xoopsDB'];
        if (getDbValue($db, 'configcategory', 'confcat_id', ' confcat_name="_MD_AM_CONTMANAGER"') != 0){return true;}
        $db->queryF(" INSERT INTO " . $db->prefix("configcategory") . " (confcat_id, confcat_name) VALUES ('9', '_MD_AM_CONTMANAGER')");
        if (getDbValue($db, 'configcategory', 'confcat_id', ' confcat_name="_MD_AM_PERSON"') != 0){return true;}
        $db->queryF(" INSERT INTO " . $db->prefix("configcategory") . " (confcat_id, confcat_name) VALUES ('10', '_MD_AM_PERSON')");

        $db->queryF("UPDATE ". $db->prefix('config') . " SET conf_formtype = 'textsarea' WHERE conf_name IN ('meta_keywords', 'meta_description')");

        $passwordmeter_installed = false;
        $sql = "SELECT COUNT(*) FROM `" . $GLOBALS['xoopsDB']->prefix('config') . "` WHERE `conf_name` = 'pass_level'";
        if ($result = $GLOBALS['xoopsDB']->queryF($sql)) {
            list($count) = $GLOBALS['xoopsDB']->fetchRow($result);
            if ($count == 1) {
                $passwordmeter_installed = true;
            }
        }
        if (!$passwordmeter_installed) {
            $sql = "INSERT INTO " . $GLOBALS['xoopsDB']->prefix('config') .
                    " (conf_id, conf_modid, conf_catid, conf_name, conf_title, conf_value, conf_desc, conf_formtype, conf_valuetype, conf_order) " .
                    " VALUES " .
                    " (NULL, 0, 2, 'pass_level', '_MD_AM_PASSLEVEL', '1', '_MD_AM_PASSLEVEL_DESC', 'yesno', 'int', 2)";

            if (!$GLOBALS['xoopsDB']->queryF($sql)) {
                return false;
            }
        }

        $db = $GLOBALS['xoopsDB'];
        $db->queryF("DELETE FROM `" . $db->prefix('configoption') . "` WHERE confop_name='_MD_AM_USERACTV'");
        $db->queryF("DELETE FROM `" . $db->prefix('configoption') . "` WHERE confop_name='_MD_AM_AUTOACTV'");
        $db->queryF("DELETE FROM `" . $db->prefix('configoption') . "` WHERE confop_name='_MD_AM_ADMINACTV'");
        $db->queryF("DELETE FROM `" . $db->prefix('config') . "` WHERE conf_name = 'activation_type'");
        // Now let's re-insert data
        $registration_type = false;
        $sql = "SELECT COUNT(*) FROM `" . $GLOBALS['xoopsDB']->prefix('config') . "` WHERE `conf_name` = 'activation_type'";
        if ($result = $GLOBALS['xoopsDB']->queryF($sql)) {
            list($count) = $GLOBALS['xoopsDB']->fetchRow($result);
            if ($count == 1) {
                $registration_type = true;
            }
        }
        if (!$registration_type) {
            $sql = "INSERT INTO " . $GLOBALS['xoopsDB']->prefix('config') .
                    " (conf_id, conf_modid, conf_catid, conf_name, conf_title, conf_value, conf_desc, conf_formtype, conf_valuetype, conf_order) " .
                    " VALUES " .
                    " (NULL, 0, 2, 'activation_type', '_MD_AM_ACTVTYPE', '0', '_MD_AM_ACTVTYPEDSC', 'select', 'int', 9)";

            if (!$GLOBALS['xoopsDB']->queryF($sql)) {
                return false;
            }
            $config_id = $GLOBALS['xoopsDB']->getInsertId();

            $sql = "INSERT INTO " . $GLOBALS['xoopsDB']->prefix('configoption') .
                    " (confop_id, confop_name, confop_value, conf_id)" .
                    " VALUES" .
                    " (NULL, '_MD_AM_USERACTV', '0', {$config_id}), " .
                    " (NULL, '_MD_AM_AUTOACTV', '1', {$config_id}), " .
                    " (NULL, '_MD_AM_ADMINACTV', '2', {$config_id}), " .
                    " (NULL, '_MD_AM_REGINVITE', '3', {$config_id})";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                return false;
            }
        }

        $table = new IcmsDatabasetable('users');

        $sql = "ALTER TABLE " . $GLOBALS['xoopsDB']->prefix('users') . " MODIFY pass VARCHAR(255) NOT NULL";
        if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
            icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
            return false;
        }

        $sql = "ALTER TABLE " . $GLOBALS['xoopsDB']->prefix('users') . " MODIFY user_sig text NOT NULL";
        if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
            icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
            return false;
        }

        $sql = "ALTER TABLE `" . $GLOBALS['xoopsDB']->prefix('users') . "` ADD language varchar(100) NOT NULL default ''";
        if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
            icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
            return false;
        }

        if (!$table->fieldExists('openid')) {
            $sql = "ALTER TABLE `" . $GLOBALS['xoopsDB']->prefix('users') . "` ADD openid varchar(255) NOT NULL default ''";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
                return false;
            }
        }
        if (!$table->fieldExists('salt')) {
            $sql = "ALTER TABLE `" . $GLOBALS['xoopsDB']->prefix('users') . "` ADD salt varchar(255) NOT NULL default ''";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
                return false;
            }
        }
        if (!$table->fieldExists('user_viewoid')) {
            $sql = "ALTER TABLE `" . $GLOBALS['xoopsDB']->prefix('users') . "` ADD user_viewoid tinyint(1) unsigned NOT NULL default '0'";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
                return false;
            }
        }

        if (!$table->fieldExists('pass_expired')) {
            $sql = "ALTER TABLE `" . $GLOBALS['xoopsDB']->prefix('users') . "` ADD pass_expired tinyint(1) NOT NULL default '0'";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
                return false;
            }
        }
        if (!$table->fieldExists('enc_type')) {
            $sql = "ALTER TABLE `" . $GLOBALS['xoopsDB']->prefix('users') . "` ADD enc_type tinyint(2) unsigned NOT NULL default '0'";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
                return false;
            }
        }

        $sql = 'SHOW INDEX FROM `' . $GLOBALS['xoopsDB']->prefix('users') . '`';
        $result = $GLOBALS['xoopsDB']->queryF($sql);
        $indexes = $GLOBALS ['xoopsDB']->fetchArray($result);
        if (in_array('unamepass', $indexes)) {
            $sql = "ALTER TABLE `" . $GLOBALS['xoopsDB']->prefix('users') . "` DROP INDEX unamepass, ADD INDEX unamepass (uname (10), pass (10))";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                icms_debug('An error occurred while executing "' . $sql . '" - ' . $GLOBALS['xoopsDB']->error());
                return false;
            }
        }

        $pw_salt_installed = false;
        $sql = "SELECT COUNT(*) FROM `" . $GLOBALS ['xoopsDB']->prefix('config') . "` WHERE `conf_name` = 'enc_type'";
        if ($result = $GLOBALS ['xoopsDB']->queryF($sql)) {
            list($count) = $GLOBALS ['xoopsDB']->fetchRow($result);
            if ($count == 1) {
                $pw_salt_installed = true;
            }
        }

        if (!$pw_salt_installed) {
            $sql = "INSERT INTO " . $GLOBALS['xoopsDB']->prefix('config') .
                        " (conf_id, conf_modid, conf_catid, conf_name, conf_title, conf_value, conf_desc, conf_formtype, conf_valuetype, conf_order) " .
                        " VALUES " .
                        " (NULL, 0, 2, 'enc_type', '_MD_AM_ENC_TYPE', '0', '_MD_AM_ENC_TYPEDSC', 'select', 'int', 50)";

            if (!$GLOBALS['xoopsDB']->queryF($sql)) {
                return false;
            }
            $config_id = $GLOBALS['xoopsDB']->getInsertId();

            $sql = "INSERT INTO " . $GLOBALS['xoopsDB']->prefix('configoption') .
                        " (confop_id, confop_name, confop_value, conf_id)" .
                        " VALUES" .
                        " (NULL, '_MD_AM_ENC_MD5', '0', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_SHA256', '1', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_SHA384', '2', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_SHA512', '3', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_RIPEMD128', '4', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_RIPEMD160', '5', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_WHIRLPOOL', '6', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL1284', '7', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL1604', '8', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL1924', '9', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL2244', '10', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL2564', '11', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL1285', '12', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL1605', '13', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL1925', '14', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL2245', '15', {$config_id}), " .
                        " (NULL, '_MD_AM_ENC_HAVAL2565', '16', {$config_id})";
            if (!$result = $GLOBALS['xoopsDB']->queryF($sql)) {
                return false;
            }
        }

        return $result;

    }

    private function check_dbversion() {
        $table = new IcmsDatabasetable('modules');
        return $table->fieldExists('dbversion');
    }

    private function apply_dbversion() {
        // First let's create the dbversion field in the modules table
        $table = new IcmsDatabasetable('modules');
        $table->addNewField('dbversion', 'INT(11) unsigned NOT NULL DEFAULT 1');
        return $this->updater->updateTable($table, true);
    }
    
    private function check_trust_path() {
        $lines = file(XOOPS_ROOT_PATH . '/mainfile.php');
        foreach ($lines as $line) {
            $trustcheck = defined("XOOPS_TRUST_PATH") && XOOPS_TRUST_PATH != '';
            if (preg_match("/(define\(\s*)([\"'])(XOOPS_TRUST_PATH)\\2,\s*([\"'])([^\"']*?)\\4\s*\);/", $line) && $trustcheck) {
                return true;
            }
        }
        return false;
    }

    private function apply_trust_path() {
        return $this->update_configs('trust_path');
    }
    
    private function check_db() {
        $lines = file(XOOPS_ROOT_PATH . '/mainfile.php');
        foreach ($lines as $line) {
            if (preg_match("/(define\(\s*)([\"'])(XOOPS_DB_CHARSET)\\2,\s*([\"'])([^\"']*?)\\4\s*\);/", $line)) {
                return true;
            }
        }
        return false;
    }

    private function check_salt() {
        $lines = file(XOOPS_ROOT_PATH . '/mainfile.php');
        foreach ($lines as $line) {
            if (preg_match("/(define\(\s*)([\"'])(XOOPS_DB_SALT)\\2,\s*([\"'])([^\"']*?)\\4\s*\);/", $line)) {
                return true;
            }
        }
        return false;
    }

    private function apply_salt() {
        return $this->update_configs('salt');
    }

    private function apply_db() {
        return $this->update_configs('db');
    }

    private function update_configs($task) {
        if (!$vars = $this->set_configs($task)) {
            return false;
        }
        if ($task == "db" && !empty($vars["XOOPS_DB_COLLATION"])) {
            if ($pos = strpos($vars["XOOPS_DB_COLLATION"], "_")) {
                $vars["XOOPS_DB_CHARSET"] = substr($vars["XOOPS_DB_COLLATION"], 0, $pos);
                $this->convert_db($vars["XOOPS_DB_CHARSET"], $vars["XOOPS_DB_COLLATION"]);
            }
        }

        return $this->write_mainfile($vars);
    }

    private function convert_db($charset, $collation) {
        $sql = "ALTER DATABASE `" . XOOPS_DB_NAME . "` DEFAULT CHARACTER SET " . $GLOBALS["xoopsDB"]->quote($charset) . " COLLATE " . $GLOBALS["xoopsDB"]->quote($collation);
        if (!$GLOBALS["xoopsDB"]->queryF($sql)) {
            return false;
        }
        if (!$result = $GLOBALS["xoopsDB"]->queryF("SHOW TABLES LIKE '" . XOOPS_DB_PREFIX . "\_%'")) {
            return false;
        }
        $tables = array();
        while (list($table) = $GLOBALS["xoopsDB"]->fetchRow($result)) {
            $tables[] = $table;
            //$GLOBALS["xoopsDB"]->queryF("ALTER TABLE `{$table}` DEFAULT CHARACTER SET " . $GLOBALS["xoopsDB"]->quote($charset) . " COLLATE " . $GLOBALS["xoopsDB"]->quote($collation));
            //$GLOBALS["xoopsDB"]->queryF("ALTER TABLE `{$table}` CONVERT TO CHARACTER SET " . $GLOBALS["xoopsDB"]->quote($charset) . " COLLATE " . $GLOBALS["xoopsDB"]->quote($collation));
        }
        $this->convert_table($tables, $charset, $collation);
    }

    // Some code not ready to use
    private function convert_table($tables, $charset, $collation) {
        // Initialize vars.
        $string_querys = array();
        $binary_querys = array();
        $gen_index_querys = array();
        $drop_index_querys = array();
        $tables_querys = array();
        $optimize_querys = array();
        $final_querys = array();

        // Begin Converter Core
        if (!empty($tables)) {
            foreach ((array) $tables as $table) {
                // Analyze tables for string types columns and generate his binary and string correctness sql sentences.
                $resource = $GLOBALS["xoopsDB"]->queryF("DESCRIBE $table");
                $col_query = array();
                while ($result = $GLOBALS["xoopsDB"]->fetchArray($resource)) {
                    if (preg_match('/(char)|(text)|(enum)|(set)/', $result['Type'])) {
                        // String Type SQL Sentence.
                        $col_query[] .= ' MODIFY `' . $result['Field'] . '` ' . $result['Type'] . " CHARACTER SET $charset COLLATE $collation " . (((!empty($result['Default'])) || ($result['Default'] === '0') || ($result['Default'] === 0) || ($result['Default'] ==='')) ? "DEFAULT '". $result['Default'] ."' " : '') . ('YES' == $result['Null'] ? '' : 'NOT ') . 'NULL';

                        /* This has been removed because of conversion problems encountered with data in other languages
                         // Binary String Type SQL Sentence.
                         if (preg_match('/(enum)|(set)/', $result['Type'])) {
                            $binary_querys[] = "ALTER TABLE `$table` MODIFY `" . $result['Field'] . '` ' . $result['Type'] . ' CHARACTER SET binary ' . (((!empty($result['Default'])) || ($result['Default'] === '0') || ($result['Default'] === 0)) ? "DEFAULT '". $result['Default'] ."' " : '') . ('YES' == $result['Null'] ? '' : 'NOT ') . 'NULL';
                            } else {
                            $result['Type'] = preg_replace('/char/', 'binary', $result['Type']);
                            $result['Type'] = preg_replace('/text/', 'blob', $result['Type']);
                            $binary_querys[] = "ALTER TABLE `$table` MODIFY `" . $result['Field'] . '` ' . $result['Type'] . ' ' . (((!empty($result['Default'])) || ($result['Default'] === '0') || ($result['Default'] === 0)) ? "DEFAULT '". $result['Default'] ."' " : '') . ('YES' == $result['Null'] ? '' : 'NOT ') . 'NULL';
                            }*/
                    }
                }
                $string_querys[] = "ALTER TABLE `$table`" . implode(', ', $col_query);

                // Analyze table indexs for any FULLTEXT-Type of index in the table.
                $fulltext_indexes = array();
                $resource = $GLOBALS["xoopsDB"]->queryF("SHOW INDEX FROM `$table`");
                while ($result = $GLOBALS["xoopsDB"]->fetchArray($resource)) {
                    if (preg_match('/FULLTEXT/', $result['Index_type']))
                    $fulltext_indexes[$result['Key_name']][$result['Column_name']] = 1;
                }

                // Generate the SQL Sentence for drop and add every FULLTEXT index we found previously.
                if (!empty($fulltext_indexes)) {
                    foreach ((array) $fulltext_indexes as $key_name => $column) {
                        $drop_index_querys[] = "ALTER TABLE `$table` DROP INDEX `$key_name`";
                        $tmp_gen_index_query = "ALTER TABLE `$table` ADD FULLTEXT `$key_name`(";
                        $fields_names = array_keys($column);
                        for ($i = 1; $i <= count($column); $i++)
                        $tmp_gen_index_query .= $fields_names[$i - 1] . (($i == count($column)) ? '' : ', ');
                        $gen_index_querys[] = $tmp_gen_index_query . ')';
                    }
                }

                // Generate the SQL Sentence for change default table character set.
                $tables_querys[] = "ALTER TABLE `$table` DEFAULT CHARACTER SET $charset COLLATE $collation";

                // Generate the SQL Sentence for Optimize Table.
                $optimize_querys[] = "OPTIMIZE TABLE `$table`";
            }

        }
        // End Converter Core

        // Merge all SQL Sentences that we temporary store in arrays.
        $final_querys = array_merge((array) $drop_index_querys, (array) $binary_querys, (array) $tables_querys, (array) $string_querys, (array) $gen_index_querys, (array) $optimize_querys);

        foreach ($final_querys as $sql) {
            $GLOBALS["xoopsDB"]->queryF($sql);
        }

        // Time to return.
        return $final_querys;
    }
    
    private function write_mainfile($vars) {
        if (empty($vars)) {
            return false;
        }

        $file = dirname(__FILE__) . '/mainfile.dist.php';

        $lines = file($file);
        foreach (array_keys($lines) as $ln) {
            if (preg_match("/(define\()([\"'])(XOOPS_[^\"']+)\\2,\s*([0-9]+)\s*\)/", $lines[$ln], $matches)) {
                $val = isset($vars[$matches[3]])
                    ? strval(constant($matches[3]))
                    : (defined($matches[3])
                        ? strval(constant($matches[3]))
                        : "0"
                );
                $lines[$ln] = preg_replace("/(define\()([\"'])(XOOPS_[^\"']+)\\2,\s*([0-9]+)\s*\)/",
                    "define('" . $matches[3] . "', " . $val . ")",
                $lines[$ln]);
            } elseif (preg_match("/(define\()([\"'])(XOOPS_[^\"']+)\\2,\s*([\"'])([^\"']*?)\\4\s*\)/", $lines[$ln], $matches)) {
                $val = isset($vars[$matches[3]])
                ? strval($vars[$matches[3]])
                : (defined($matches[3])
                ? strval(constant($matches[3]))
                : ""
                );
                $lines[$ln] = preg_replace("/(define\()([\"'])(XOOPS_[^\"']+)\\2,\s*([\"'])(.*?)\\4\s*\)/",
                    "define('" . $matches[3] . "', '" . $val . "')",
                $lines[$ln]);
            }
        }

        $fp = fopen(XOOPS_ROOT_PATH . '/mainfile.php', 'wt');
        if (!$fp) {
            echo ERR_COULD_NOT_WRITE_MAINFILE;
            echo "<pre style='border: 1px solid black; width: 80%; overflow: auto;'><div style='color: #ff0000; font-weight: bold;'><div>" . implode("</div><div>", array_map("htmlspecialchars", $lines)) . "</div></div></pre>";
            return false;
        } else {
            $newline = defined(PHP_EOL) ? PHP_EOL : (strpos(php_uname(), 'Windows') ? "\r\n" : "\n");
            $content = str_replace(array("\r\n", "\n"), $newline, implode('', $lines));

            fwrite($fp, $content);
            fclose($fp);
            return true;
        }
    }
    
    private function set_configs($task) {
        $ret = array();
        $configs = include dirname(__FILE__) . "/settings_{$task}.php";
        if (!$configs || !is_array($configs)) {
            return $ret;
        }
        if (empty($_POST['action']) || $_POST['task'] != $task) {
            return false;
        }

        foreach ($configs as $key => $val) {
            $ret['XOOPS_' . $key] = $val;
        }
        return $ret;

    }
}

$upg = new upgrade_impcms06();
return $upg;