/** * Generate migrations * * @param array $options * * @throws \Exception * @todo Refactor */ public static function generate(array $options) { $tableName = $options['tableName']; $exportData = $options['exportData']; $migrationsDir = $options['migrationsDir']; $originalVersion = $options['originalVersion']; $force = $options['force']; $config = $options['config']; if ($migrationsDir && !file_exists($migrationsDir)) { mkdir($migrationsDir, 0777, true); } if ($originalVersion) { if (!preg_match('/[a-z0-9](\\.[a-z0-9]+)*/', $originalVersion, $matches)) { throw new \Exception("Version {$originalVersion} is invalid"); } $originalVersion = $matches[0]; $version = new VersionItem($originalVersion, 3); if (file_exists($migrationsDir . DIRECTORY_SEPARATOR . $version) && !$force) { throw new \Exception("Version {$version} is already generated"); } } else { $versions = ModelMigration::scanForVersions($migrationsDir); if (!count($versions)) { $version = new VersionItem('1.0.0'); } else { $version = VersionItem::maximum($versions); $version = $version->addMinor(1); } } if (!file_exists($migrationsDir . DIRECTORY_SEPARATOR . $version)) { mkdir($migrationsDir . DIRECTORY_SEPARATOR . $version); } if (!isset($config->database)) { throw new \Exception("Cannot load database configuration"); } ModelMigration::setup($config->database); ModelMigration::setSkipAutoIncrement($options['no-ai']); ModelMigration::setMigrationPath($migrationsDir); if ($tableName == 'all') { $migrations = ModelMigration::generateAll($version, $exportData); foreach ($migrations as $tableName => $migration) { file_put_contents($migrationsDir . '/' . $version . '/' . $tableName . '.php', '<?php ' . PHP_EOL . PHP_EOL . $migration); } } else { $migration = ModelMigration::generate($version, $tableName, $exportData); file_put_contents($migrationsDir . '/' . $version . '/' . $tableName . '.php', '<?php ' . PHP_EOL . PHP_EOL . $migration); } if (self::isConsole()) { print Color::success('Version ' . $version . ' was successfully generated') . PHP_EOL; } }
/** * Generate migrations * * @param array $options * * @throws \Exception */ public static function generate(array $options) { $tableName = $options['tableName']; $exportData = $options['exportData']; $migrationsDir = $options['migrationsDir']; $version = $options['version']; $force = $options['force']; $config = $options['config']; // Migrations directory if ($migrationsDir && !file_exists($migrationsDir)) { mkdir($migrationsDir, 0755, true); } // Use timestamped version if description is provided if ($descr = $options['descr']) { $version = (string) (int) (microtime(true) * pow(10, 6)); VersionCollection::setType(VersionCollection::TYPE_TIMESTAMPED); $versionItem = VersionCollection::createItem($version . '_' . $descr); // Elsewhere use old-style incremental versioning // The version is specified } elseif ($version) { VersionCollection::setType(VersionCollection::TYPE_INCREMENTAL); $versionItem = VersionCollection::createItem($version); // The version is guessed automatically } else { VersionCollection::setType(VersionCollection::TYPE_INCREMENTAL); $versionItems = ModelMigration::scanForVersions($migrationsDir); if (!isset($versionItems[0])) { $versionItem = VersionCollection::createItem('1.0.0'); } else { /** @var IncrementalVersion $versionItem */ $versionItem = VersionCollection::maximum($versionItems); $versionItem = $versionItem->addMinor(1); } } // Path to migration dir $migrationPath = $migrationsDir . DIRECTORY_SEPARATOR . $versionItem->getVersion(); if (!file_exists($migrationPath)) { mkdir($migrationPath); } elseif (!$force) { throw new \LogicException('Version ' . $versionItem->getVersion() . ' already exists'); } // Try to connect to the DB if (!isset($config->database)) { throw new \RuntimeException('Cannot load database configuration'); } ModelMigration::setup($config->database); ModelMigration::setSkipAutoIncrement($options['noAutoIncrement']); ModelMigration::setMigrationPath($migrationsDir); $wasMigrated = false; if ($tableName === 'all') { $migrations = ModelMigration::generateAll($versionItem->getStamp(), $exportData); foreach ($migrations as $tableName => $migration) { if ($tableName === self::MIGRATION_LOG_TABLE) { continue; } $tableFile = $migrationPath . DIRECTORY_SEPARATOR . $tableName . '.php'; $wasMigrated = file_put_contents($tableFile, '<?php ' . PHP_EOL . PHP_EOL . $migration) || $wasMigrated; } } else { $migration = ModelMigration::generate($versionItem->getStamp(), $tableName, $exportData); $tableFile = $migrationPath . DIRECTORY_SEPARATOR . $tableName . '.php'; $wasMigrated = !!file_put_contents($tableFile, '<?php ' . PHP_EOL . PHP_EOL . $migration); } if (self::isConsole() && $wasMigrated) { print Color::success('Version ' . $versionItem->getVersion() . ' was successfully generated') . PHP_EOL; } elseif (self::isConsole()) { print Color::info('Nothing to generate. You should create tables at first.') . PHP_EOL; } exit(0); }