/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $configManager = new ConfigurationManager($input->getOption('config-dir')); if (!$input->getOption('output-dir')) { $input->setOption('output-dir', $configManager->getSection('paths')['phpConfDir']); } $this->createDirectory($input->getOption('output-dir')); $outputFilePath = $input->getOption('output-dir') . DIRECTORY_SEPARATOR . $input->getOption('output-file'); if (!is_writable(dirname($outputFilePath))) { throw new \RuntimeException(sprintf('Unable to write the "%s" output file', $outputFilePath)); } //Create the options array to pass to ArrayToPhpConverter $options['connections'] = $configManager->getConnectionParametersArray(); $options['defaultConnection'] = $configManager->getSection('runtime')['defaultConnection']; $options['log'] = $configManager->getSection('runtime')['log']; $options['profiler'] = $configManager->getConfigProperty('runtime.profiler'); $phpConf = ArrayToPhpConverter::convert($options); $phpConf = "<?php\n" . $phpConf; if (file_exists($outputFilePath)) { $currentContent = file_get_contents($outputFilePath); if ($currentContent == $phpConf) { $output->writeln(sprintf('No change required in the current configuration file <info>"%s"</info>.', $outputFilePath)); } else { file_put_contents($outputFilePath, $phpConf); $output->writeln(sprintf('Successfully updated PHP configuration in file <info>"%s"</info>.', $outputFilePath)); } } else { file_put_contents($outputFilePath, $phpConf); $output->writeln(sprintf('Successfully wrote PHP configuration in file <info>"%s"</info>.', $outputFilePath)); } }
public function testSetConnectionsIfNotDefined() { $yamlConf = <<<EOF propel: database: connections: mysource: adapter: mysql classname: Propel\\Runtime\\Connection\\DebugPDO dsn: mysql:host=localhost;dbname=mydb user: root password: yoursource: adapter: mysql classname: Propel\\Runtime\\Connection\\DebugPDO dsn: mysql:host=localhost;dbname=yourdb user: root password: EOF; $this->getFilesystem()->dumpFile('propel.yaml', $yamlConf); $manager = new ConfigurationManager(); $this->assertEquals('mysource', $manager->getSection('generator')['defaultConnection']); $this->assertEquals('mysource', $manager->getSection('runtime')['defaultConnection']); $this->assertEquals(array('mysource', 'yoursource'), $manager->getSection('generator')['connections']); $this->assertEquals(array('mysource', 'yoursource'), $manager->getSection('runtime')['connections']); }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $configOptions = []; if ($this->hasInputOption('connection', $input)) { foreach ($input->getOption('connection') as $conn) { $configOptions += $this->connectionToProperties($conn); } } if ($this->hasInputOption('migration-table', $input)) { $configOptions['propel']['migrations']['tableName'] = $input->getOption('migration-table'); } if ($this->hasInputOption('schema-dir', $input)) { $configOptions['propel']['paths']['schemaDir'] = $input->getOption('schema-dir'); } if ($this->hasInputOption('output-dir', $input)) { $configOptions['propel']['paths']['migrationDir'] = $input->getOption('output-dir'); } $generatorConfig = $this->getGeneratorConfig($configOptions, $input); $this->createDirectory($generatorConfig->getSection('paths')['migrationDir']); $manager = new MigrationManager(); $manager->setGeneratorConfig($generatorConfig); $manager->setSchemas($this->getSchemas($generatorConfig->getSection('paths')['schemaDir'], $input->getOption('recursive'))); $connections = []; $optionConnections = $input->getOption('connection'); if (!$optionConnections) { $connections = $generatorConfig->getBuildConnections(); } else { foreach ($optionConnections as $connection) { list($name, $dsn, $infos) = $this->parseConnection($connection); $connections[$name] = array_merge(['dsn' => $dsn], $infos); } } $manager->setConnections($connections); $manager->setMigrationTable($generatorConfig->getConfigProperty('migrations.tableName')); $manager->setWorkingDirectory($generatorConfig->getSection('paths')['migrationDir']); if ($manager->hasPendingMigrations()) { throw new RuntimeException('Uncommitted migrations have been found ; you should either execute or delete them before rerunning the \'diff\' task'); } $totalNbTables = 0; $reversedSchema = new Schema(); foreach ($manager->getDatabases() as $appDatabase) { $name = $appDatabase->getName(); if (!($params = @$connections[$name])) { $output->writeln(sprintf('<info>No connection configured for database "%s"</info>', $name)); } if ($input->getOption('verbose')) { $output->writeln(sprintf('Connecting to database "%s" using DSN "%s"', $name, $params['dsn'])); } $conn = $manager->getAdapterConnection($name); $platform = $generatorConfig->getConfiguredPlatform($conn, $name); if (!$platform->supportsMigrations()) { $output->writeln(sprintf('Skipping database "%s" since vendor "%s" does not support migrations', $name, $platform->getDatabaseType())); continue; } $additionalTables = []; foreach ($appDatabase->getTables() as $table) { if ($table->getSchema() && $table->getSchema() != $appDatabase->getSchema()) { $additionalTables[] = $table; } } if ($input->getOption('disable-identifier-quoting')) { $platform->setIdentifierQuoting(false); } $database = new Database($name); $database->setPlatform($platform); $database->setSchema($appDatabase->getSchema()); $database->setDefaultIdMethod(IdMethod::NATIVE); $parser = $generatorConfig->getConfiguredSchemaParser($conn, $name); $nbTables = $parser->parse($database, $additionalTables); $reversedSchema->addDatabase($database); $totalNbTables += $nbTables; if ($input->getOption('verbose')) { $output->writeln(sprintf('%d tables found in database "%s"', $nbTables, $name), Output::VERBOSITY_VERBOSE); } } if ($totalNbTables) { $output->writeln(sprintf('%d tables found in all databases.', $totalNbTables)); } else { $output->writeln('No table found in all databases'); } // comparing models $output->writeln('Comparing models...'); $tableRenaming = $input->getOption('table-renaming'); $migrationsUp = []; $migrationsDown = []; $removeTable = !$input->getOption('skip-removed-table'); $excludedTables = $input->getOption('skip-tables'); foreach ($reversedSchema->getDatabases() as $database) { $name = $database->getName(); if ($input->getOption('verbose')) { $output->writeln(sprintf('Comparing database "%s"', $name)); } if (!($appDataDatabase = $manager->getDatabase($name))) { $output->writeln(sprintf('<error>Database "%s" does not exist in schema.xml. Skipped.</error>', $name)); continue; } $configManager = new ConfigurationManager(); $excludedTables = array_merge((array) $excludedTables, (array) $configManager->getSection('exclude_tables')); $databaseDiff = DatabaseComparator::computeDiff($database, $appDataDatabase, false, $tableRenaming, $removeTable, $excludedTables); if (!$databaseDiff) { if ($input->getOption('verbose')) { $output->writeln(sprintf('Same XML and database structures for datasource "%s" - no diff to generate', $name)); } continue; } $output->writeln(sprintf('Structure of database was modified in datasource "%s": %s', $name, $databaseDiff->getDescription())); foreach ($databaseDiff->getPossibleRenamedTables() as $fromTableName => $toTableName) { $output->writeln(sprintf('<info>Possible table renaming detected: "%s" to "%s". It will be deleted and recreated. Use --table-renaming to only rename it.</info>', $fromTableName, $toTableName)); } $conn = $manager->getAdapterConnection($name); $platform = $generatorConfig->getConfiguredPlatform($conn, $name); if ($input->getOption('disable-identifier-quoting')) { $platform->setIdentifierQuoting(false); } $migrationsUp[$name] = $platform->getModifyDatabaseDDL($databaseDiff); $migrationsDown[$name] = $platform->getModifyDatabaseDDL($databaseDiff->getReverseDiff()); } if (!$migrationsUp) { $output->writeln('Same XML and database structures for all datasource - no diff to generate'); return; } $timestamp = time(); $migrationFileName = $manager->getMigrationFileName($timestamp); $migrationClassBody = $manager->getMigrationClassBody($migrationsUp, $migrationsDown, $timestamp, $input->getOption('comment')); $file = $generatorConfig->getSection('paths')['migrationDir'] . DIRECTORY_SEPARATOR . $migrationFileName; file_put_contents($file, $migrationClassBody); $output->writeln(sprintf('"%s" file successfully created.', $file)); if (null !== ($editorCmd = $input->getOption('editor'))) { $output->writeln(sprintf('Using "%s" as text editor', $editorCmd)); shell_exec($editorCmd . ' ' . escapeshellarg($file)); } else { $output->writeln('Please review the generated SQL statements, and add data migration code if necessary.'); $output->writeln('Once the migration class is valid, call the "migrate" task to execute it.'); } }
public function testGetConfigurationParametersArrayTest() { $yamlConf = <<<EOF propel: database: connections: mysource: adapter: mysql classname: Propel\\Runtime\\Connection\\DebugPDO dsn: mysql:host=localhost;dbname=mydb user: root password: yoursource: adapter: mysql classname: Propel\\Runtime\\Connection\\DebugPDO dsn: mysql:host=localhost;dbname=yourdb user: root password: runtime: defaultConnection: mysource connections: - mysource - yoursource generator: defaultConnection: mysource connections: - mysource EOF; $this->getFilesystem()->dumpFile('propel.yaml', $yamlConf); $expectedRuntime = array('mysource' => array('adapter' => 'mysql', 'classname' => 'Propel\\Runtime\\Connection\\DebugPDO', 'dsn' => 'mysql:host=localhost;dbname=mydb', 'user' => 'root', 'password' => ''), 'yoursource' => array('adapter' => 'mysql', 'classname' => 'Propel\\Runtime\\Connection\\DebugPDO', 'dsn' => 'mysql:host=localhost;dbname=yourdb', 'user' => 'root', 'password' => '')); $expectedGenerator = array('mysource' => array('adapter' => 'mysql', 'classname' => 'Propel\\Runtime\\Connection\\DebugPDO', 'dsn' => 'mysql:host=localhost;dbname=mydb', 'user' => 'root', 'password' => '')); $manager = new ConfigurationManager(); $this->assertEquals($expectedRuntime, $manager->getConnectionParametersArray('runtime')); $this->assertEquals($expectedRuntime, $manager->getConnectionParametersArray()); //default `runtime` $this->assertEquals($expectedGenerator, $manager->getConnectionParametersArray('generator')); $this->assertNull($manager->getConnectionParametersArray('bad_section')); }