diff --git a/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php index 195f5efef..a163b6f84 100644 --- a/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php +++ b/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php @@ -28,7 +28,8 @@ use Symfony\Component\Console\Input\InputArgument, Doctrine\ORM\Tools\SchemaTool; /** - * Command to update the database schema for a set of classes based on their mappings. + * Command to generate the SQL needed to update the database schema to match + * the current mapping information. * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org @@ -38,6 +39,7 @@ use Symfony\Component\Console\Input\InputArgument, * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel + * @author Ryan Weaver */ class UpdateCommand extends AbstractCommand { @@ -49,26 +51,39 @@ class UpdateCommand extends AbstractCommand $this ->setName('orm:schema-tool:update') ->setDescription( - 'Processes the schema and either update the database schema of EntityManager Storage Connection or generate the SQL output.' + 'Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata.' ) ->setDefinition(array( + new InputArgument( + 'action', InputArgument::OPTIONAL, + 'Either "execute" (execute the SQL) or "dump-sql" (dump the SQL to the screen). If not specified, nothing is done.' + ), new InputOption( 'complete', null, InputOption::VALUE_NONE, 'If defined, all assets of the database which are not relevant to the current metadata will be dropped.' ), - new InputOption( - 'dump-sql', null, InputOption::VALUE_NONE, - 'Instead of try to apply generated SQLs into EntityManager Storage Connection, output them.' - ), - new InputOption( - 'force', null, InputOption::VALUE_NONE, - "Don't ask for the incremental update of the database, but force the operation to run." - ), - )) - ->setHelp(<<getFullName(); + $this->setHelp(<<$fullName command generates the SQL needed to +synchronize the database schema with the current mapping metadata of the +default entity manager. + +For example, if you add metadata for a new column to an entity, this command +would generate and output the SQL needed to add the new column to the database: + +$fullName dump-sql + +Alternatively, you can execute the generated queries: + +$fullName execute + +Finally, be aware that if the --complete option is passed, this +task will drop all database assets (e.g. tables, etc) that are *not* described +by the current metadata. In other words, without this option, this task leaves +untouched any "extra" tables that exist in the database, but which aren't +described by any metadata. EOT ); } @@ -78,26 +93,33 @@ EOT // Defining if update is complete or not (--complete not defined means $saveMode = true) $saveMode = ($input->getOption('complete') !== true); - if ($input->getOption('dump-sql') === true) { - $sqls = $schemaTool->getUpdateSchemaSql($metadatas, $saveMode); - $output->write(implode(';' . PHP_EOL, $sqls) . PHP_EOL); - } else if ($input->getOption('force') === true) { - $output->write('Updating database schema...' . PHP_EOL); + $sqls = $schemaTool->getUpdateSchemaSql($metadatas, $saveMode); + if (0 == count($sqls)) { + $output->writeln('Nothing to update - your database is already in sync with the current entity metadata.'); + + return; + } + + $action = $input->getArgument('action'); + if ('execute' == $action) { + $output->writeln('Updating database schema...'); $schemaTool->updateSchema($metadatas, $saveMode); - $output->write('Database schema updated successfully!' . PHP_EOL); + $output->writeln(sprintf('Database schema updated successfully! "%s" queries were executed', count($sqls))); + } else if ('dump-sql' == $action) { + $output->writeln(implode(';' . PHP_EOL, $sqls)); + } else if (null === $action) { + $output->writeln('ATTENTION: This operation should not be executed in a production environment.'); + $output->writeln(' Use the incremental update to detect changes during development and use'); + $output->writeln(' the SQL DDL provided to manually update your database in production.'); + $output->writeln(''); + + $output->writeln(sprintf('The Schema-Tool would execute "%s" queries to update the database.', count($sqls))); + $output->writeln('Please run the operation by passing an argument to this command:'); + + $output->writeln(sprintf(' %s execute to execute the command', $this->getFullName())); + $output->writeln(sprintf(' %s dump-sql to dump the SQL statements to the screen', $this->getFullName())); } else { - $output->write('ATTENTION: This operation should not be executed in a production environment.' . PHP_EOL); - $output->write('Use the incremental update to detect changes during development and use' . PHP_EOL); - $output->write('this SQL DDL to manually update your database in production.' . PHP_EOL . PHP_EOL); - - $sqls = $schemaTool->getUpdateSchemaSql($metadatas, $saveMode); - - if (count($sqls)) { - $output->write('Schema-Tool would execute ' . count($sqls) . ' queries to update the database.' . PHP_EOL); - $output->write('Please run the operation with --force to execute these queries or use --dump-sql to see them.' . PHP_EOL); - } else { - $output->write('Nothing to update. The database is in sync with the current entity metadata.' . PHP_EOL); - } + throw new \InvalidArgumentException(sprintf('The first argument - if specified - should be either "execute" or "dump-sql" ("%s" given).', $action)); } } }