setName('propel:database:drop') ->setDescription('Drop a given database or the default one.') ->setHelp(<<propel:database:drop command will drop your database. php app/console propel:database:drop The --force parameter has to be used to actually drop the database. The --connection parameter allows you to change the connection to use. The default connection is the active connection (propel.dbal.default_connection). EOT ) ->addOption('connection', null, InputOption::VALUE_OPTIONAL, 'Connection to use. Example: default, bookstore') ->addOption('force', null, InputOption::VALUE_NONE, 'Set this parameter to execute this action.') ; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if (!$input->getOption('force')) { $output->writeln('You have to use the "--force" option to drop the database.'); return; } if ('prod' === $this->getApplication()->getKernel()->getEnvironment()) { $this->writeSection($output, 'WARNING: you are about to drop a database in production !', 'bg=red;fg=white'); if (false === $this->askConfirmation($input, $output, 'Are you sure ? (y/n) ', false)) { $output->writeln('Aborted, nice decision !'); return -2; } } $connectionName = $input->getOption('connection') ?: $this->getDefaultConnection(); $config = $this->getConnectionData($connectionName); $connection = Propel::getConnection($connectionName); $dbName = $this->parseDbName($config['dsn']); if (null === $dbName) { return $output->writeln('No database name found.'); } else { $query = 'DROP DATABASE '. $dbName .';'; } $manager = new ConnectionManagerSingle(); $manager->setConfiguration($this->getTemporaryConfiguration($config)); $serviceContainer = Propel::getServiceContainer(); $serviceContainer->setAdapterClass($connectionName, $config['adapter']); $serviceContainer->setConnectionManager($connectionName, $manager); $connection = Propel::getConnection($connectionName); $statement = $connection->prepare($query); $statement->execute(); $output->writeln(sprintf('Database %s has been dropped.', $dbName)); } /** * Create a temporary configuration to connect to the database in order * to create a given database. This idea comes from Doctrine1. * * @see https://github.com/doctrine/doctrine1/blob/master/lib/Doctrine/Connection.php#L1491 * * @param array $config A Propel connection configuration. * @return array */ private function getTemporaryConfiguration($config) { $dbName = $this->parseDbName($config['dsn']); $config['dsn'] = preg_replace( '#;?(dbname|Database)='.$dbName.'#', '', $config['dsn'] ); return $config; } }