From 926513ca49b0c425eb1e28903c83505ed251cad9 Mon Sep 17 00:00:00 2001 From: Moulino Date: Thu, 6 Nov 2014 12:10:53 +0000 Subject: [PATCH] Add management of multiple databases --- Command/FixturesLoadCommand.php | 12 ++++++- Loader/YamlLoader.php | 42 ++++++++++++++---------- tests/Khepin/Tests/YamlFixtureTest.php | 2 +- tests/Khepin/Utils/BaseTestCaseMongo.php | 6 +++- tests/Khepin/Utils/BaseTestCaseOrm.php | 8 +++-- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/Command/FixturesLoadCommand.php b/Command/FixturesLoadCommand.php index 28bfc1a..1e47265 100755 --- a/Command/FixturesLoadCommand.php +++ b/Command/FixturesLoadCommand.php @@ -25,6 +25,12 @@ protected function configure() InputOption::VALUE_NONE, 'If set, will purge the database before importing new fixtures' ) + ->addOption( + 'database-name', + null, + InputArgument::OPTIONAL, + 'If set, will purge the database specified. If not set, will purge all databases. (require purge option)' + ) ->addOption( 'purge-mongodb', null, @@ -46,11 +52,15 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($input->getOption('purge-orm')) { $this->getContainer()->get('khepin.yaml_loader')->purgeDatabase( 'orm', + $input->getOption('database-name'), $input->getOption('purge-with-truncate') ); } if ($input->getOption('purge-mongodb')) { - $this->getContainer()->get('khepin.yaml_loader')->purgeDatabase('mongodb'); + $this->getContainer()->get('khepin.yaml_loader')->purgeDatabase( + 'mongodb', + $input->getOption('database-name') + ); } $this->getContainer()->get('khepin.yaml_loader')->loadFixtures($context); diff --git a/Loader/YamlLoader.php b/Loader/YamlLoader.php index d73f4f5..c8278c8 100644 --- a/Loader/YamlLoader.php +++ b/Loader/YamlLoader.php @@ -107,9 +107,13 @@ public function loadFixtures() $fixture_data = Yaml::parse($file); // if nothing is specified, we use doctrine orm for persistence $persistence = isset($fixture_data['persistence']) ? $fixture_data['persistence'] : 'orm'; + + $persister = $this->getPersister($persistence); + $manager = $persister->getManagerForClass($fixture_data['model']); + $fixture = $this->getFixtureClass($persistence); $fixture = new $fixture($fixture_data, $this, $file); - $fixture->load($this->getManager($persistence), func_get_args()); + $fixture->load($manager, func_get_args()); } if (!is_null($this->acl_manager)) { @@ -123,7 +127,7 @@ public function loadFixtures() /** * Remove all fixtures from the database */ - public function purgeDatabase($persistence, $withTruncate = false) + public function purgeDatabase($persistence, $databaseName = null, $withTruncate = false) { $purgetools = array( 'orm' => array( @@ -138,32 +142,36 @@ public function purgeDatabase($persistence, $withTruncate = false) // Retrieve the correct purger and executor $purge_class = $purgetools[$persistence]['purger']; $executor_class = $purgetools[$persistence]['executor']; - // Instanciate purger and executor - $purger = new $purge_class($this->getManager($persistence)); - // Check if the purger supports setting the purge mode - if ($withTruncate && $purger instanceof ORMPurger) { - $purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE); + // Instanciate purger and executor + $persister = $this->getPersister($persistence); + $entityManagers = ($databaseName) + ? array($persister->getManager($databaseName)) + : $persister->getManagers(); + + foreach($entityManagers as $entityManager) { + $purger = new $purge_class($entityManager); + if ($withTruncate && $purger instanceof ORMPurger) { + $purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE); + } + $executor = new $executor_class($entityManager, $purger); + // purge + $executor->purge(); } - - $executor = new $executor_class($this->getManager($persistence), $purger); - // purge - $executor->purge(); } - /** - * Returns a doctrine object manager for the given persistence layer - * @return ObjectManager + /* + * Returns the doctrine persister for the given persistence layer + * @return ManagerRegistry */ - public function getManager($persistence) + public function getPersister($persistence) { $managers = array( 'orm' => 'doctrine', 'mongodb' => 'doctrine_mongodb', ); - return $this->kernel->getContainer() - ->get($managers[$persistence])->getManager(); + return $this->kernel->getContainer()->get($managers[$persistence]); } /** diff --git a/tests/Khepin/Tests/YamlFixtureTest.php b/tests/Khepin/Tests/YamlFixtureTest.php index 7c797bf..cd7ad68 100755 --- a/tests/Khepin/Tests/YamlFixtureTest.php +++ b/tests/Khepin/Tests/YamlFixtureTest.php @@ -124,7 +124,7 @@ public function testPurgeWithTruncate() $firstCar = $cars[0]; $firstCarIdBefore = $firstCar->getId(); - $loader->purgeDatabase('orm', true); + $loader->purgeDatabase('orm', null, true); $cars = $this->doctrine->getEntityManager()->getRepository('Khepin\Fixture\Entity\Car')->findAll(); $this->assertEmpty($cars); diff --git a/tests/Khepin/Utils/BaseTestCaseMongo.php b/tests/Khepin/Utils/BaseTestCaseMongo.php index 7502983..bb41666 100755 --- a/tests/Khepin/Utils/BaseTestCaseMongo.php +++ b/tests/Khepin/Utils/BaseTestCaseMongo.php @@ -62,7 +62,11 @@ protected function getDoctrine() $config = $this->getMockAnnotatedConfig(); $dm = \Doctrine\ODM\MongoDB\DocumentManager::create(null, $config); - return $this->doctrine = m::mock(array('getManager' => $dm)); + return $this->doctrine = m::mock(array( + 'getManager' => $dm, + 'getManagers' => array($dm), + 'getManagerForClass' => $dm + )); // $conn = array( // 'driver' => 'pdo_sqlite', diff --git a/tests/Khepin/Utils/BaseTestCaseOrm.php b/tests/Khepin/Utils/BaseTestCaseOrm.php index f3217c5..a4af9ca 100755 --- a/tests/Khepin/Utils/BaseTestCaseOrm.php +++ b/tests/Khepin/Utils/BaseTestCaseOrm.php @@ -99,7 +99,7 @@ protected function getDoctrine() $conn = array( 'driver' => 'pdo_sqlite', 'memory' => true, - // 'path' => __DIR__.'/../db.sqlite', + //'path' => __DIR__.'/../db.sqlite', ); $config = $this->getMockAnnotatedConfig(); @@ -120,8 +120,10 @@ protected function getDoctrine() $schemaTool->createSchema($schema); return $this->doctrine = m::mock(array( - 'getEntityManager' => $em, - 'getManager' => $em, + 'getEntityManager' => $em, + 'getManager' => $em, + 'getManagers' => array($em), + 'getManagerForClass' => $em ) ); }