%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/commands/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/commands/MigrateController.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\commands;
use humhub\components\Module;
use Yii;
use yii\console\Exception;
use yii\web\Application;
/**
* Manages application migrations.
*
* A migration means a set of persistent changes to the application environment
* that is shared among different developers. For example, in an application
* backed by a database, a migration may refer to a set of changes to
* the database, such as creating a new table, adding a new table column.
*
* This command provides support for tracking the migration history, upgrading
* or downloading with migrations, and creating new migration skeletons.
*
* The migration history is stored in a database table named
* as [[migrationTable]]. The table will be automatically created the first time
* this command is executed, if it does not exist. You may also manually
* create it as follows:
*
* ~~~
* CREATE TABLE migration (
* version varchar(180) PRIMARY KEY,
* apply_time integer
* )
* ~~~
*
* Below are some common usages of this command:
*
* ~~~
* # creates a new migration named 'create_user_table'
* yii migrate/create create_user_table
*
* # applies ALL new migrations
* yii migrate
*
* # reverts the last applied migration
* yii migrate/down
* ~~~
*
*/
class MigrateController extends \yii\console\controllers\MigrateController
{
/**
* @var string the directory storing the migration classes. This can be either
* a path alias or a directory.
*/
public $migrationPath = '@humhub/migrations';
/**
* @var boolean also include migration paths of all enabled modules
*/
public $includeModuleMigrations = false;
/**
* When includeModuleMigrations is enabled, this maps migrations to the
* corresponding module.
*
* @var array
*/
protected $migrationPathMap = [];
/**
* @inerhitdoc
*/
public function beforeAction($action)
{
// Make sure to define default table storage engine
if (in_array(Yii::$app->db->getDriverName(), ['mysql', 'mysqli'], true)) {
Yii::$app->db->pdo->exec('SET default_storage_engine=' . Yii::$app->params['databaseDefaultStorageEngine']);
}
return parent::beforeAction($action);
}
/**
* @inheritdoc
*/
public function options($actionID)
{
if ($actionID == 'up') {
return array_merge(parent::options($actionID), ['includeModuleMigrations']);
}
return parent::options($actionID);
}
/**
* Returns the migrations that are not applied.
* @return array list of new migrations
*/
protected function getNewMigrations()
{
if (!$this->includeModuleMigrations) {
return parent::getNewMigrations();
}
$this->migrationPathMap = [];
$migrations = [];
foreach ($this->getMigrationPaths() as $migrationPath) {
$this->migrationPath = $migrationPath;
$migrations = array_merge($migrations, parent::getNewMigrations());
$this->migrationPathMap[$migrationPath] = $migrations;
}
sort($migrations);
return $migrations;
}
/**
* Creates a new migration instance.
* @param string $class the migration class name
* @return \yii\db\MigrationInterface the migration instance
*/
protected function createMigration($class)
{
if ($this->includeModuleMigrations) {
$this->migrationPath = $this->getMigrationPath($class);
}
return parent::createMigration($class);
}
/**
* Returns the migration path of a given migration.
* A map containing the path=>migration will be created by getNewMigrations method.
*
* @param type $migration
* @return type
* @throws \yii\console\Exception
*/
public function getMigrationPath($migration)
{
foreach ($this->migrationPathMap as $path => $migrations) {
if (in_array($migration, $migrations)) {
return $path;
}
}
throw new Exception("Could not find path for: " . $migration);
}
/**
* Returns the migration paths of all enabled modules
*
* @return array
*/
protected function getMigrationPaths()
{
$migrationPaths = ['base' => $this->migrationPath];
foreach (Yii::$app->getModules() as $id => $config) {
$class = null;
if (is_array($config) && isset($config['class'])) {
$class = $config['class'];
} elseif ($config instanceof Module) {
$class = get_class($config);
}
if ($class !== null) {
$reflector = new \ReflectionClass($class);
$path = dirname($reflector->getFileName()) . '/migrations';
if (is_dir($path)) {
$migrationPaths[$id] = $path;
}
}
}
return $migrationPaths;
}
/**
* Executes all pending migrations
*
* @return string output
*/
public static function webMigrateAll()
{
ob_start();
$controller = new self('migrate', Yii::$app);
$controller->db = Yii::$app->db;
$controller->interactive = false;
$controller->includeModuleMigrations = true;
$controller->color = false;
$controller->runAction('up');
return ob_get_clean();
}
/**
* Executes migrations in a specific folder
*
* @param string $migrationPath
* @return string output
*/
public static function webMigrateUp($migrationPath)
{
ob_start();
$controller = new self('migrate', Yii::$app);
$controller->db = Yii::$app->db;
$controller->interactive = false;
$controller->migrationPath = $migrationPath;
$controller->color = false;
$controller->runAction('up');
return ob_get_clean();
}
/**
* @inheritdoc
*/
public function stdout($string)
{
if (Yii::$app instanceof Application) {
print $string;
} else {
return parent::stdout($string);
}
}
/**
* @inheritdoc
*/
public function stderr($string)
{
if (Yii::$app instanceof Application) {
print $string;
} else {
return parent::stderr($string);
}
}
}