/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $configOptions = array(); if ($this->hasInputOption('output-dir', $input)) { $configOptions['propel']['paths']['migrationDir'] = $input->getOption('output-dir'); } if ($this->hasInputOption('migration-table', $input)) { $configOptions['propel']['migrations']['tableName'] = $input->getOption('migration-table'); } $generatorConfig = $this->getGeneratorConfig($configOptions, $input); $this->createDirectory($generatorConfig->getSection('paths')['migrationDir']); $manager = new MigrationManager(); $manager->setGeneratorConfig($generatorConfig); $connections = array(); $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(array('dsn' => $dsn), $infos); } } $manager->setConnections($connections); $manager->setMigrationTable($generatorConfig->getSection('migrations')['tableName']); $manager->setWorkingDirectory($generatorConfig->getSection('paths')['migrationDir']); if (!($nextMigrationTimestamp = $manager->getFirstUpMigrationTimestamp())) { $output->writeln('All migrations were already executed - nothing to migrate.'); return false; } if ($input->getOption('fake')) { $output->writeln(sprintf('Faking migration %s up', $manager->getMigrationClassName($nextMigrationTimestamp))); } else { $output->writeln(sprintf('Executing migration %s up', $manager->getMigrationClassName($nextMigrationTimestamp))); } $migration = $manager->getMigrationObject($nextMigrationTimestamp); if (!$input->getOption('fake')) { if (false === $migration->preUp($manager)) { if ($input->getOption('force')) { $output->writeln('<error>preUp() returned false. Continue migration.</error>'); } else { $output->writeln('<error>preUp() returned false. Aborting migration.</error>'); return false; } } } foreach ($migration->getUpSQL() as $datasource => $sql) { $connection = $manager->getConnection($datasource); if ($input->getOption('verbose')) { $output->writeln(sprintf('Connecting to database "%s" using DSN "%s"', $datasource, $connection['dsn'])); } $conn = $manager->getAdapterConnection($datasource); $res = 0; $statements = SqlParser::parseString($sql); if (!$input->getOption('fake')) { foreach ($statements as $statement) { try { if ($input->getOption('verbose')) { $output->writeln(sprintf('Executing statement "%s"', $statement)); } $conn->exec($statement); $res++; } catch (\Exception $e) { if ($input->getOption('force')) { //continue, but print error message $output->writeln(sprintf('<error>Failed to execute SQL "%s". Continue migration.</error>', $statement)); } else { throw new RuntimeException(sprintf('<error>Failed to execute SQL "%s". Aborting migration.</error>', $statement), 0, $e); } } } //make sure foreign_keys are activated again in mysql $output->writeln(sprintf('%d of %d SQL statements executed successfully on datasource "%s"', $res, count($statements), $datasource)); } $manager->updateLatestMigrationTimestamp($datasource, $nextMigrationTimestamp); if ($input->getOption('verbose')) { $output->writeln(sprintf('Updated latest migration date to %d for datasource "%s"', $nextMigrationTimestamp, $datasource)); } } if (!$input->getOption('fake')) { $migration->postUp($manager); } if ($timestamps = $manager->getValidMigrationTimestamps()) { $output->writeln(sprintf('Migration complete. %d migrations left to execute.', count($timestamps))); } else { $output->writeln('Migration complete. No further migration to execute.'); } }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $generatorConfig = $this->getGeneratorConfig(array('propel.platform.class' => $input->getOption('platform')), $input); $this->createDirectory($input->getOption('output-dir')); $manager = new MigrationManager(); $manager->setGeneratorConfig($generatorConfig); $connections = array(); $optionConnections = $input->getOption('connection'); if (!$optionConnections) { $connections = $generatorConfig->getBuildConnections($input->getOption('input-dir')); } else { foreach ($optionConnections as $connection) { list($name, $dsn, $infos) = $this->parseConnection($connection); $connections[$name] = array_merge(array('dsn' => $dsn), $infos); } } $manager->setConnections($connections); $manager->setMigrationTable($input->getOption('migration-table')); $manager->setWorkingDirectory($input->getOption('output-dir')); if (!($nextMigrationTimestamp = $manager->getFirstUpMigrationTimestamp())) { $output->writeln('All migrations were already executed - nothing to migrate.'); return false; } $output->writeln(sprintf('Executing migration %s up', $manager->getMigrationClassName($nextMigrationTimestamp))); $migration = $manager->getMigrationObject($nextMigrationTimestamp); if (false === $migration->preUp($manager)) { $output->writeln('<error>preUp() returned false. Aborting migration.</error>'); return false; } foreach ($migration->getUpSQL() as $datasource => $sql) { $connection = $manager->getConnection($datasource); if ($input->getOption('verbose')) { $output->writeln(sprintf('Connecting to database "%s" using DSN "%s"', $datasource, $connection['dsn'])); } $conn = $manager->getAdapterConnection($datasource); $res = 0; $statements = SqlParser::parseString($sql); foreach ($statements as $statement) { try { if ($input->getOption('verbose')) { $output->writeln(sprintf('Executing statement "%s"', $statement)); } $stmt = $conn->prepare($statement); $stmt->execute(); $res++; } catch (PDOException $e) { $output->writeln(sprintf('<error>Failed to execute SQL "%s". Aborting migration.</error>', $statement)); return false; } } if (!$res) { $output->writeln('No statement was executed. The version was not updated.'); $output->writeln(sprintf('Please review the code in "%s"', $manager->getMigrationDir() . DIRECTORY_SEPARATOR . $manager->getMigrationClassName($nextMigrationTimestamp))); $output->writeln('<error>Migration aborted</error>', Project::MSG_ERR); return false; } $output->writeln(sprintf('%d of %d SQL statements executed successfully on datasource "%s"', $res, count($statements), $datasource)); $manager->updateLatestMigrationTimestamp($datasource, $nextMigrationTimestamp); if ($input->getOption('verbose')) { $output->writeln(sprintf('Updated latest migration date to %d for datasource "%s"', $nextMigrationTimestamp, $datasource)); } } $migration->postUp($manager); if ($timestamps = $manager->getValidMigrationTimestamps()) { $output->writeln(sprintf('Migration complete. %d migrations left to execute.', count($timestamps))); } else { $output->writeln('Migration complete. No further migration to execute.'); } }