diff -r cd389bf882f1 -r 11fd79666374 Command/CreateSchemaDoctrineCommand.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Command/CreateSchemaDoctrineCommand.php Fri Nov 04 15:59:49 2011 +0100 @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace IRI\Bundle\WikiTagBundle\Command; + +use Symfony\Component\DependencyInjection\ContainerAwareInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Output\Output; +use Doctrine\ORM\Tools\SchemaTool; +use Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand; +use Symfony\Bundle\DoctrineBundle\Command\Proxy\DoctrineCommandHelper; + +/** + * Command to execute the SQL needed to generate the database schema for + * a given entity manager. + * + * This file is a direct adaptation of the Symfony\Bundle\DoctrineBundle\Command\Proxy\CreateSchemaDoctrineCommand + * + */ +class CreateSchemaDoctrineCommand extends CreateCommand implements ContainerAwareInterface +{ + protected function configure() + { + parent::configure(); + + $this + ->setName('wikitag:schema:create') + ->setDescription('Executes (or dumps) the SQL needed to generate the database schema') + ->addOption('em', null, InputOption::VALUE_OPTIONAL, 'The entity manager to use for this command') + ->setHelp(<<doctrine:schema:create command executes the SQL needed to +generate the database schema for the default entity manager: + +php app/console doctrine:schema:create + +You can also generate the database schema for a specific entity manager: + +php app/console doctrine:schema:create --em=default + +Finally, instead of executing the SQL, you can output the SQL: + +php app/console doctrine:schema:create --dump-sql +EOT + ); + } + + /** + * @var ContainerInterface + */ + private $container; + + protected function getContainer() + { + if (null === $this->container) { + $this->container = $this->getApplication()->getKernel()->getContainer(); + } + + return $this->container; + } + + /** + * @see ContainerAwareInterface::setContainer() + */ + public function setContainer(ContainerInterface $container = null) + { + $this->container = $container; + } + + + protected function filterCreateSchema($sqls) + { + + // get service + $schema_utils = $this->getContainer()->get("wikitag.shema_utils"); + + $res_sqls = $schema_utils->filter_foreign_key($sqls); + $res_sqls = $schema_utils->filter_index_creation($res_sqls); + + + return $res_sqls; + } + + protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas) + { + $output->write('ATTENTION: This operation should not be executed in a production environment.' . PHP_EOL . PHP_EOL); + $sqls = $schemaTool->getCreateSchemaSql($metadatas); + + $createSchemaSql = $this->filterCreateSchema($sqls); + + if ($input->getOption('dump-sql') === true) { + + $output->write(implode(';' . PHP_EOL, $createSchemaSql) . PHP_EOL); + } else { + $output->write('Creating database schema...' . PHP_EOL); + $emHelper = $this->getHelper('em'); + + $conn = $emHelper->getEntityManager()->getConnection(); + + foreach ($createSchemaSql as $sql) { + $conn->executeQuery($sql); + } + $output->write('Database schema created successfully!' . PHP_EOL); + } + + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + DoctrineCommandHelper::setApplicationEntityManager($this->getApplication(), $input->getOption('em')); + + parent::execute($input, $output); + } +}