diff --git a/Command/DatabaseCreateCommand.php b/Command/DatabaseCreateCommand.php new file mode 100644 index 0000000..c088006 --- /dev/null +++ b/Command/DatabaseCreateCommand.php @@ -0,0 +1,76 @@ +setDescription('Create a given database or the default one.') + ->addOption('connection', null, InputOption::VALUE_OPTIONAL, 'Set this parameter to define a connection to use') + ->setName('propel:database:create'); + } + + /** + * @see Command + * + * @throws \InvalidArgumentException When the target directory does not exist + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + list($name, $config) = $this->getConnection($input, $output); + $dbName = $this->parseDbName($config['connection']['dsn']); + $query = 'CREATE DATABASE '. $dbName .';'; + + try { + \Propel::setConfiguration($this->getTemporaryConfiguration($name, $config)); + $connection = \Propel::getConnection(); + + $statement = $connection->prepare($query); + $statement->execute(); + $output->writeln(sprintf('%s has been created.', $dbName)); + } catch (Exception $e) { + $output->writeln(sprintf('An error has occured: %s', $e->getMessage())); + } + } + + /** + * 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 string $name A connection name. + * @param array $config A Propel connection configuration. + * @return array + */ + private function getTemporaryConfiguration($name, $config) + { + $dbName = $this->parseDbName($config['connection']['dsn']); + + $config['connection']['dsn'] = preg_replace( + '#dbname='.$dbName.'#', + 'dbname='.strtolower($config['adapter']), + $config['connection']['dsn'] + ); + + return array( + 'datasources' => array($name => $config) + ); + } +}