From 3f49f58e8c81bf7737b5bc8f8cc2cc9b80ce19d1 Mon Sep 17 00:00:00 2001 From: William DURAND Date: Wed, 22 Jun 2011 15:30:57 +0200 Subject: [PATCH] Added a new command: propel:database:create which allow to create a database for a given connection by using the Symfony2 console --- Command/DatabaseCreateCommand.php | 76 +++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Command/DatabaseCreateCommand.php 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) + ); + } +}