setName('propel:database:create') ->setDescription('Create a given database or the default one.') ->addOption('connection', null, InputOption::VALUE_OPTIONAL, 'Set this parameter to define a connection to use') ; } /** * @see Command * * @throws \InvalidArgumentException When the target directory does not exist */ protected function execute(InputInterface $input, OutputInterface $output) { $connectionName = $input->getOption('connection') ?: $this->getDefaultConnection(); $config = $this->getConnectionData($connectionName); $dbName = $this->parseDbName($config['dsn']); if (null === $dbName) { return $output->writeln('No database name found.'); } else { $query = 'CREATE DATABASE '. $dbName .';'; } try { $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 created.', $dbName)); } catch (\Exception $e) { $this->writeSection($output, array( '[Propel] Exception caught', '', $e->getMessage() ), 'fg=white;bg=red'); } } /** * 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='.$dbName.';?#', '', $config['dsn'] ); return $config; } }