Your IP : 216.73.216.79


Current Path : /var/www/html/skm/vendor/c006/yii2-migration-utility/controllers/
Upload File :
Current File : /var/www/html/skm/vendor/c006/yii2-migration-utility/controllers/DefaultController.php

<?php
namespace c006\utility\migration\controllers;

use c006\utility\migration\assets\AppAssets;
use c006\utility\migration\assets\AppUtility;
use c006\utility\migration\models\MigrationUtility;
use Yii;
use yii\base\BaseObject;
use yii\web\Controller;

/**
 * Class DefaultController
 *
 * @author  Jon Chambers <c006@users.noreply.github.com>
 *
 * @package c006\utility\migration\controllers
 */
class DefaultController extends Controller
{

    /**
     *
     */
    function init()
    {
        $view = $this->getView();
        AppAssets::register($view);
	parent::init();
    }

    /**
     * @return string
     */
    public function actionIndex()
    {
        $initialTabLevel = 0;
        $output = new OutputString(['tabLevel' => $initialTabLevel]);
        $output_drop = new OutputString();
        $tables_value = '';
        if (isset($_POST['MigrationUtility'])) {
            $array = [];
            $array['inserts'] = [];
            $array['fk'] = [];
            $array['indexes'] = [];

            $foreignKeyOnUpdate = $_POST['MigrationUtility']['ForeignKeyOnUpdate'];
            $foreignKeyOnDelete = $_POST['MigrationUtility']['ForeignKeyOnDelete'];
            $tables_value = $_POST['MigrationUtility']['tables'];
            $ifThen = 1; //$_POST['MigrationUtility']['addIfThenStatements'];
            $addTableInserts = $_POST['MigrationUtility']['addTableInserts'];
            $tableOptions = [];
            $tableOptions['mysql'] = [$_POST['MigrationUtility']['mysql'], $_POST['MigrationUtility']['mysql_options']];
            $tableOptions['mssql'] = [$_POST['MigrationUtility']['mssql'], $_POST['MigrationUtility']['mssql_options']];
            $tableOptions['pgsql'] = [$_POST['MigrationUtility']['pgsql'], $_POST['MigrationUtility']['pgsql_options']];
            $tableOptions['sqlite'] = [$_POST['MigrationUtility']['sqlite'], $_POST['MigrationUtility']['sqlite_options']];

            $tables = trim($tables_value);
            $tables = preg_replace('/\s+/', ',', $tables);
            $tables = explode(',', $tables);

            $output->addStr('$tables = Yii::$app->db->schema->getTableNames();');
            $output->addStr('$dbType = $this->db->driverName;');

            foreach ($tableOptions as $k => $item) {
                $output->addStr('$tableOptions_' . $k . ' = "' . (($item[0]) ? $item[1] : '') . '";');
            }

            foreach ($tables as $table) {
                if (empty($table)) {
                    continue;
                }
                $columns = \Yii::$app->db->getTableSchema($table);
                $prefix = \Yii::$app->db->tablePrefix;
                $table_prepared = str_replace($prefix, '', $table);
                $output->tabLevel = $initialTabLevel;
                foreach ($tableOptions as $dbType => $item) {
                    if (!$item[0]) {
                        continue;
                    }

                    $output->addStr('/* ' . strtoupper($dbType) . ' */');
                    $output->addStr('if (!in_array(\'' . $table . '\', $tables))  { ');
                    if ($ifThen) {
                        $output->addStr('if ($dbType == "' . $dbType . '") {');
                        $output->tabLevel++;
                    }
                    $output->addStr('$this->createTable(\'{{%' . $table_prepared . '}}\', [');
                    $output->tabLevel++;
                    // Ordinary columns
                    $k = 0;
                    foreach ($columns->columns as $column) {
                        $appUtility = new AppUtility($column, $dbType);
                        $output->addStr($appUtility->string . "',");
                        if ($column->isPrimaryKey) {
                            $output->addStr($k . " => 'PRIMARY KEY (`" . $column->name . "`)',");
                        }
                        $k++;

                    }

                    $output->tabLevel--;
                    $output->addStr('], $tableOptions_' . strtolower($dbType) . ');');
                    if (in_array($dbType, ['mysql', 'mssql', 'pgsql']) && !empty($columns->foreignKeys)) {
                        foreach ($columns->foreignKeys as $fk) {
                            $link_table = '';
                            foreach ($fk as $k => $v) {
                                if ($k == '0') {
                                    $link_table = $v;
                                } else {
                                    $link_to_column = $k;
                                    $link_column = $v;
                                    $str = '$this->addForeignKey(';
                                    $str .= '\'fk_' . $link_table . '_' . explode('.', microtime('usec'))[1] . '_' . substr("000" . sizeof($array['fk']), 2) . "',";
                                    $str .= '\'{{%' . $table . '}}\', ';
                                    $str .= '\'' . $link_to_column . '\', ';
                                    $str .= '\'{{%' . $link_table . '}}\', ';
                                    $str .= '\'' . $link_column . '\', ';
                                    $str .= '\'' . $foreignKeyOnDelete . '\', ';
                                    $str .= '\'' . $foreignKeyOnUpdate . '\' ';
                                    $str .= ');';
                                    $array['fk'][] = $str;

                                }
                            }
                        }


                    }

                    $table_indexes = Yii::$app->db->createCommand('SHOW INDEX FROM `' . $table . '`')->queryAll();

                    $table_indexes_new = [];
                    foreach ($table_indexes as $item) {
                        if ($item['Key_name'] != 'PRIMARY' ) {
                            $table_indexes_new[$item['Key_name']]['cols'][] = $item['Column_name'];
							$table_indexes_new[$item['Key_name']]['Column_name'][] = $item['Column_name'];
                            $table_indexes_new[$item['Key_name']]['Non_unique'] = $item['Non_unique'];
                            $table_indexes_new[$item['Key_name']]['Table'] = $item['Table'];
                        }

                    }

                    foreach ($table_indexes_new as $item) {
                        $unique = ($item['Non_unique']) ? '' : '_UNIQUE';
                        $array['indexes'][] = [
                            'name' => 'idx' . $unique . '_' . implode("_" ,array_values($item['Column_name'])) . '_' . explode('.', microtime('usec'))[1] . '_' . substr("000" . sizeof($array['indexes']), -2),
                            'unique' => (($item['Non_unique']) ? 0 : 1),
                            'column' => implode(",", array_values($item['cols'])),//$item['Column_name'],
                            'table' => $item['Table'],
                        ];
                    }
					
                    if ($ifThen) {
                        $output->tabLevel--;
                        $output->addStr('}');
                    }
                    $output->addStr('}');
                    $output->addStr(' ');

                }

                if ($addTableInserts) {
                    $data = Yii::$app->db->createCommand('SELECT * FROM `' . $table . '`')->queryAll();
                    foreach ($data as $row) {
                        $out = '$this->insert(\'{{%' . $table . '}}\',[';
                        foreach ($columns->columns as $column) {
                            $out .= "'" . $column->name . "'=>'" . addslashes($row[ $column->name ]) . "',";
                        }
                        $out = rtrim($out, ',') . ']);';
//                        $output->addStr($out);
                        $array['inserts'][] = $out;
                    }
                }

            }

            /* INDEXES */
            if (sizeof($array['indexes'])) {
                $output->addStr(' ');
                foreach ($array['indexes'] as $item) {
                    $str = '$this->createIndex(\'' . $item['name'] . '\',\'' . $item['table'] . '\',\'' . $item['column'] . '\',' . $item['unique'] . ');';
                    $output->addStr($str);
                }
            }

            /* FK */
            if (sizeof($array['fk'])) {
                $output->addStr(' ');
                $output->addStr('$this->execute(\'SET foreign_key_checks = 0\');');
                foreach ($array['fk'] as $item) {
                    $output->addStr($item);
                }
                $output->addStr('$this->execute(\'SET foreign_key_checks = 1;\');');
            }

            /* INSERTS */
            if (sizeof($array['inserts'])) {
                $output->addStr(' ');
                $output->addStr('$this->execute(\'SET foreign_key_checks = 0\');');
                foreach ($array['inserts'] as $item) {
                    $output->addStr($item);
                }
                $output->addStr('$this->execute(\'SET foreign_key_checks = 1;\');');
            }

            /* DROP TABLE */
            foreach ($tables as $table) {
                if (!empty($table)) {
//                    $output_drop->addStr('$this->dropTable(\'' . $table . '\');');
                    $output_drop->addStr('$this->execute(\'SET foreign_key_checks = 0\');');
                    $output_drop->addStr('$this->execute(\'DROP TABLE IF EXISTS `' . $table . '`\');');
                    $output_drop->addStr('$this->execute(\'SET foreign_key_checks = 1;\');');
                }
            }
        }
        $model = new MigrationUtility();
        $model->tables = $tables_value;

        /* Save Post state */
        if (isset($_POST['MigrationUtility'])) {
            foreach ($_POST['MigrationUtility'] as $k => $v) {
                $model[ $k ] = $v;
            }

//            print_r($model->attributes); exit;
        }

        return $this->render(
            'index',
            [
                'model'       => $model,
                'output'      => $output->output(),
                'output_drop' => $output_drop->output(),
                'tables'      => self::getTables()
            ]
        );
    }


    protected function mysql_direct($table)
    {
        print_r(Yii::$app->db);
        exit;

        $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
        or die('Could not connect: ' . mysql_error());
        echo 'Connected successfully';
        mysql_select_db('my_database') or die('Could not select database');

// Performing SQL query
        $query = 'SELECT * FROM my_table';
        $result = mysql_query($query) or die('Query failed: ' . mysql_error());

// Printing results in HTML
        echo "<table>\n";
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
            echo "\t<tr>\n";
            foreach ($line as $col_value) {
                echo "\t\t<td>$col_value</td>\n";
            }
            echo "\t</tr>\n";
        }
        echo "</table>\n";

// Free resultset
        mysql_free_result($result);

// Closing connection
        mysql_close($link);

    }

    /**
     * @return \string[]
     */
    public function getTables()
    {
        return \Yii::$app->db->getSchema()->getTableNames('', TRUE);
    }

}

/**
 * Class OutputString
 *
 * @author  Nils Lindentals <nils@dfworks.lv>
 *
 * @package c006\utility\migration\controllers
 */
class OutputString extends BaseObject
{

    /**
     * @var string
     */
    public $nw = "\n";

    /**
     * @var string
     */
    public $tab = "\t";

    /**
     * @var string
     */
    public $outputStringArray = array();

    /**
     * @var int
     */
    public $tabLevel = 0;

    /**
     * Adds string to output string array with "tab" prefix
     *
     * @var string $str
     */
    public function addStr($str)
    {
        $str = str_replace($this->tab, '', $str);
        $this->outputStringArray[] = str_repeat($this->tab, $this->tabLevel) . $str;
    }

    /**
     * Returns string output
     */
    public function output()
    {
        return implode($this->nw, $this->outputStringArray);
    }
}