Loading config/module.config.php +3 −1 Changes for config/module.config.php: 3 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -12,6 +12,8 @@ use UnicaenDbImport\CodeGenerator\PostgreSQL\CodeGeneratorFactory as PostgreSQLC use UnicaenDbImport\Config\Config; use UnicaenDbImport\Config\ConfigFactory; use UnicaenDbImport\Controller\ConsoleControllerFactory; use UnicaenDbImport\Service\CodeGeneratorPluginManager; use UnicaenDbImport\Service\CodeGeneratorPluginManagerFactory; use UnicaenDbImport\Service\ImportService; use UnicaenDbImport\Service\ImportServiceFactory; use UnicaenDbImport\Service\SynchroService; Loading Loading @@ -69,7 +71,7 @@ return [ ImportService::class => ImportServiceFactory::class, SynchroService::class => SynchroServiceFactory::class, PostgreSQLCodeGenerator::class => PostgreSQLCodeGeneratorFactory::class, CodeGeneratorPluginManager::class => CodeGeneratorPluginManagerFactory::class, ], ], ]; src/UnicaenDbImport/Config/Config.php +0 −24 Changes for src/UnicaenDbImport/Config/Config.php: 0 added lines, 24 removed lines. Original line number Diff line number Diff line Loading @@ -13,11 +13,6 @@ use UnicaenDbImport\Runner; */ class Config { /** * @var Runner */ protected $runner = []; /** * @var ImportInterface[] */ Loading Loading @@ -95,23 +90,4 @@ class Config return null; } /** * @param \UnicaenDbImport\Runner $runner * @return static */ public function setRunner($runner) { $this->runner = $runner; return $this; } /** * @return Runner */ public function getRunner() { return $this->runner; } } No newline at end of file src/UnicaenDbImport/Config/ConfigFactory.php +35 −89 Changes for src/UnicaenDbImport/Config/ConfigFactory.php: 35 added lines, 89 removed lines. Original line number Diff line number Diff line Loading @@ -2,18 +2,12 @@ namespace UnicaenDbImport\Config; use Assert\Assertion; use Assert\AssertionFailedException; use Doctrine\DBAL\Connection; use UnicaenDbImport\CodeGenerator\CodeGeneratorException; use UnicaenDbImport\CodeGenerator\CodeGenerator; use UnicaenDbImport\DatabaseFacade; use Interop\Container\ContainerInterface; use UnicaenDbImport\Domain\Destination; use UnicaenDbImport\Domain\Import; use UnicaenDbImport\Domain\Source; use UnicaenDbImport\Domain\Synchro; use UnicaenDbImport\QueryExecutor; use UnicaenDbImport\Runner; use Zend\ServiceManager\ServiceLocatorInterface; class ConfigFactory Loading @@ -23,78 +17,30 @@ class ConfigFactory /** * @var ServiceLocatorInterface */ private $sl; private $container; public function __invoke(ServiceLocatorInterface $sl) public function __invoke(ContainerInterface $container) { $this->sl = $sl; $this->container = $container; $appConfig = $sl->get('Config'); $appConfig = $container->get('Config'); if (!array_key_exists($key = self::CONFIG_KEY, $appConfig)) { throw ConfigException::missingKey($key); } $config = $appConfig[$key]; $moduleConfig = $appConfig[$key]; $generators = $this->createCodeGenerators($config); $imports = $this->createImports($config); $synchros = $this->createSynchros($config); $runner = $this->createRunner($generators); $imports = $this->createImports($moduleConfig); $synchros = $this->createSynchros($moduleConfig); $config = new Config(); $config->setRunner($runner); $config->setImports($imports); $config->setSynchros($synchros); // foreach ($generators as $platformClass => $generator) { // $config->addCodeGeneratorForPlatform($generator, $platformClass); // } return $config; } /** * @param array $config * @return \UnicaenDbImport\CodeGenerator\CodeGenerator[] */ private function createCodeGenerators(array $config) { try { Assertion::keyExists($config, $key = 'code_generators'); } catch (AssertionFailedException $e) { throw ConfigException::missingKey($key); } $codeGenerators = []; foreach ($config[$key] as $databasePlatformClass => $codeGeneratorClass) { if (!$this->sl->has($codeGeneratorClass)) { throw CodeGeneratorException::codeGeneratorServiceNotFound($codeGeneratorClass); } /** @var \UnicaenDbImport\CodeGenerator\CodeGenerator $codeGenerator */ $codeGenerator = $this->sl->get($codeGeneratorClass); $codeGenerators[$databasePlatformClass] = $codeGenerator; } return $codeGenerators; } /** * @param \UnicaenDbImport\CodeGenerator\CodeGenerator[] $generators * @return Runner */ private function createRunner(array $generators) { $runner = new Runner(); foreach ($generators as $databasePlatformClass => $codeGenerator) { $databaseFacade = new DatabaseFacade($codeGenerator, new QueryExecutor()); $runner->addDatabaseFacadeForPlatformClass($databaseFacade, $databasePlatformClass); } return $runner; } private function createImports($config) { $imports = []; Loading @@ -107,29 +53,29 @@ class ConfigFactory return $imports; } private function createImport($importConfig) private function createImport($moduleConfig) { if (!array_key_exists($key = 'source', $importConfig)) { if (!array_key_exists($key = 'source', $moduleConfig)) { throw ConfigException::missingKey($key); } if (!array_key_exists($key = 'destination', $importConfig)) { if (!array_key_exists($key = 'destination', $moduleConfig)) { throw ConfigException::missingKey($key); } $source = $this->createSource($importConfig['source']); $destination = $this->createDestination($importConfig['destination']); $source = $this->createSource($moduleConfig['source']); $destination = $this->createDestination($moduleConfig['destination']); $importConfig['source'] = $source; $importConfig['destination'] = $destination; $moduleConfig['source'] = $source; $moduleConfig['destination'] = $destination; return Import::fromConfig($importConfig); return Import::fromConfig($moduleConfig); } private function createSynchros($config) private function createSynchros($moduleConfig) { $synchros = []; if (array_key_exists($key = 'synchros', $config)) { foreach ($config[$key] as $synchroArr) { if (array_key_exists($key = 'synchros', $moduleConfig)) { foreach ($moduleConfig[$key] as $synchroArr) { $synchros[] = $this->createSynchro($synchroArr); } } Loading @@ -137,41 +83,41 @@ class ConfigFactory return $synchros; } private function createSynchro($config) private function createSynchro($moduleConfig) { if (!array_key_exists($key = 'source', $config)) { if (!array_key_exists($key = 'source', $moduleConfig)) { throw ConfigException::missingKey($key); } if (!array_key_exists($key = 'destination', $config)) { if (!array_key_exists($key = 'destination', $moduleConfig)) { throw ConfigException::missingKey($key); } $source = $this->createSource($config['source']); $destination = $this->createDestination($config['destination']); $source = $this->createSource($moduleConfig['source']); $destination = $this->createDestination($moduleConfig['destination']); $config['source'] = $source; $config['destination'] = $destination; $moduleConfig['source'] = $source; $moduleConfig['destination'] = $destination; return Synchro::fromConfig($config); return Synchro::fromConfig($moduleConfig); } private function createSource(array $config) private function createSource(array $sourceConfig) { /** @var Connection $conn */ $conn = $this->sl->get($config['connection']); $config['connection'] = $conn; $conn = $this->container->get($sourceConfig['connection']); $sourceConfig['connection'] = $conn; $source = Source::fromConfig($config); $source = Source::fromConfig($sourceConfig); return $source; } private function createDestination(array $config) private function createDestination(array $destinationConfig) { /** @var Connection $conn */ $conn = $this->sl->get($config['connection']); $config['connection'] = $conn; $conn = $this->container->get($destinationConfig['connection']); $destinationConfig['connection'] = $conn; return Destination::fromConfig($config); return Destination::fromConfig($destinationConfig); } } No newline at end of file src/UnicaenDbImport/Runner.phpdeleted 100644 → 0 +0 −143 Changes for src/UnicaenDbImport/Runner.php: 0 added lines, 143 removed lines. Original line number Diff line number Diff line <?php namespace UnicaenDbImport; use Doctrine\DBAL\DBALException; use Exception; use RuntimeException; use UnicaenDbImport\Domain\DestinationInterface; use UnicaenDbImport\Domain\ImportInterface; use UnicaenDbImport\Domain\ImportResult; use UnicaenDbImport\Domain\SynchroInterface; use UnicaenDbImport\Domain\SynchroResult; class Runner { /** * @var DatabaseFacade */ private $databaseFacade; /** * @var DatabaseFacade[] */ private $databaseFacadesByPlatform; /** * @param DatabaseFacade $databaseFacade * @param string $databasePlatformClass */ public function addDatabaseFacadeForPlatformClass(DatabaseFacade $databaseFacade, $databasePlatformClass) { $this->databaseFacadesByPlatform[$databasePlatformClass] = $databaseFacade; } /** * Réalise l'import. * * @param ImportInterface $import * @return ImportResult Résultat de l'import */ public function runImport(ImportInterface $import) { $source = $import->getSource(); $destination = $import->getDestination(); $this->loadDatabaseFacadeForDestination($destination); try { $this->databaseFacade->executeSelectSource($source); // découverte des colonnes $this->databaseFacade->validateDestinationTable($destination); $this->databaseFacade->truncateTable($destination->getTable(), $destination); $count = $this->databaseFacade->populateDestinationTableFromSource($destination, $source); $result = ImportResult::fromDestinationTablePopulateResult($count); } catch (Exception $e) { $result = new ImportResult(); $result->setImport($import); $result->setException($e); } return $result; } /** * Réalise une synchro.. * * @param SynchroInterface $synchro * @return SynchroResult Résultat de la synchro */ public function runSynchro(SynchroInterface $synchro) { $source = $synchro->getSource(); $destination = $synchro->getDestination(); $this->loadDatabaseFacadeForDestination($destination); $intermediateTable = null; try { $this->databaseFacade->executeSelectSource($source); // découverte des colonnes $this->databaseFacade->validateDestinationTable($destination); if ($synchro->requiresIntermediateTable()) { $intermediateTable = $synchro->getIntermediateTable(); if ($synchro->getIntermediateTableAutoDrop()) { $this->databaseFacade->dropIntermediateTable($intermediateTable, $destination); } else { $this->databaseFacade->checkIntermediateTableNotExists($destination, $intermediateTable); } $this->databaseFacade->createIntermediateTable($intermediateTable, $source, $destination); $this->databaseFacade->populateTableFromSource($intermediateTable, $source, $destination); } else { $this->databaseFacade->validateSourceTable($source); } $this->databaseFacade->createSynchroLogTableIfNotExists($destination); $this->databaseFacade->recreateDiffView($source, $destination, $intermediateTable); $hash = $this->databaseFacade->executeDiffViewRequest($source, $destination); if ($synchro->requiresIntermediateTable()) { $this->databaseFacade->dropIntermediateTable($intermediateTable, $destination); } $arrayResults = $this->databaseFacade->fetchSynchroLogTable($destination, $hash); $result = SynchroResult::fromSynchroLogTableFetchResult($arrayResults); $result->setSynchro($synchro); } catch (Exception $e) { $result = new SynchroResult(); $result->setSynchro($synchro); $result->setException($e); } return $result; } /** * @param DestinationInterface $destination */ private function loadDatabaseFacadeForDestination(DestinationInterface $destination) { try { $platform = $destination->getConnection()->getDatabasePlatform(); } catch (DBALException $e) { throw new RuntimeException("Impossible de déterminer la plateforme pour la destination " . $destination->getName()); } $platformClass = get_class($platform); if (! isset($this->databaseFacadesByPlatform[$platformClass])) { throw new RuntimeException("DatabaseFacade non fournie pour cette plateforme : " . $platformClass); } $this->databaseFacade = $this->databaseFacadesByPlatform[$platformClass]; } } src/UnicaenDbImport/Service/CodeGeneratorPluginManager.php 0 → 100644 +11 −0 Changes for src/UnicaenDbImport/Service/CodeGeneratorPluginManager.php: 11 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace UnicaenDbImport\Service; use UnicaenDbImport\CodeGenerator\CodeGenerator; use Zend\ServiceManager\AbstractPluginManager; class CodeGeneratorPluginManager extends AbstractPluginManager { protected $instanceOf = CodeGenerator::class; } No newline at end of file Loading
config/module.config.php +3 −1 Changes for config/module.config.php: 3 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -12,6 +12,8 @@ use UnicaenDbImport\CodeGenerator\PostgreSQL\CodeGeneratorFactory as PostgreSQLC use UnicaenDbImport\Config\Config; use UnicaenDbImport\Config\ConfigFactory; use UnicaenDbImport\Controller\ConsoleControllerFactory; use UnicaenDbImport\Service\CodeGeneratorPluginManager; use UnicaenDbImport\Service\CodeGeneratorPluginManagerFactory; use UnicaenDbImport\Service\ImportService; use UnicaenDbImport\Service\ImportServiceFactory; use UnicaenDbImport\Service\SynchroService; Loading Loading @@ -69,7 +71,7 @@ return [ ImportService::class => ImportServiceFactory::class, SynchroService::class => SynchroServiceFactory::class, PostgreSQLCodeGenerator::class => PostgreSQLCodeGeneratorFactory::class, CodeGeneratorPluginManager::class => CodeGeneratorPluginManagerFactory::class, ], ], ];
src/UnicaenDbImport/Config/Config.php +0 −24 Changes for src/UnicaenDbImport/Config/Config.php: 0 added lines, 24 removed lines. Original line number Diff line number Diff line Loading @@ -13,11 +13,6 @@ use UnicaenDbImport\Runner; */ class Config { /** * @var Runner */ protected $runner = []; /** * @var ImportInterface[] */ Loading Loading @@ -95,23 +90,4 @@ class Config return null; } /** * @param \UnicaenDbImport\Runner $runner * @return static */ public function setRunner($runner) { $this->runner = $runner; return $this; } /** * @return Runner */ public function getRunner() { return $this->runner; } } No newline at end of file
src/UnicaenDbImport/Config/ConfigFactory.php +35 −89 Changes for src/UnicaenDbImport/Config/ConfigFactory.php: 35 added lines, 89 removed lines. Original line number Diff line number Diff line Loading @@ -2,18 +2,12 @@ namespace UnicaenDbImport\Config; use Assert\Assertion; use Assert\AssertionFailedException; use Doctrine\DBAL\Connection; use UnicaenDbImport\CodeGenerator\CodeGeneratorException; use UnicaenDbImport\CodeGenerator\CodeGenerator; use UnicaenDbImport\DatabaseFacade; use Interop\Container\ContainerInterface; use UnicaenDbImport\Domain\Destination; use UnicaenDbImport\Domain\Import; use UnicaenDbImport\Domain\Source; use UnicaenDbImport\Domain\Synchro; use UnicaenDbImport\QueryExecutor; use UnicaenDbImport\Runner; use Zend\ServiceManager\ServiceLocatorInterface; class ConfigFactory Loading @@ -23,78 +17,30 @@ class ConfigFactory /** * @var ServiceLocatorInterface */ private $sl; private $container; public function __invoke(ServiceLocatorInterface $sl) public function __invoke(ContainerInterface $container) { $this->sl = $sl; $this->container = $container; $appConfig = $sl->get('Config'); $appConfig = $container->get('Config'); if (!array_key_exists($key = self::CONFIG_KEY, $appConfig)) { throw ConfigException::missingKey($key); } $config = $appConfig[$key]; $moduleConfig = $appConfig[$key]; $generators = $this->createCodeGenerators($config); $imports = $this->createImports($config); $synchros = $this->createSynchros($config); $runner = $this->createRunner($generators); $imports = $this->createImports($moduleConfig); $synchros = $this->createSynchros($moduleConfig); $config = new Config(); $config->setRunner($runner); $config->setImports($imports); $config->setSynchros($synchros); // foreach ($generators as $platformClass => $generator) { // $config->addCodeGeneratorForPlatform($generator, $platformClass); // } return $config; } /** * @param array $config * @return \UnicaenDbImport\CodeGenerator\CodeGenerator[] */ private function createCodeGenerators(array $config) { try { Assertion::keyExists($config, $key = 'code_generators'); } catch (AssertionFailedException $e) { throw ConfigException::missingKey($key); } $codeGenerators = []; foreach ($config[$key] as $databasePlatformClass => $codeGeneratorClass) { if (!$this->sl->has($codeGeneratorClass)) { throw CodeGeneratorException::codeGeneratorServiceNotFound($codeGeneratorClass); } /** @var \UnicaenDbImport\CodeGenerator\CodeGenerator $codeGenerator */ $codeGenerator = $this->sl->get($codeGeneratorClass); $codeGenerators[$databasePlatformClass] = $codeGenerator; } return $codeGenerators; } /** * @param \UnicaenDbImport\CodeGenerator\CodeGenerator[] $generators * @return Runner */ private function createRunner(array $generators) { $runner = new Runner(); foreach ($generators as $databasePlatformClass => $codeGenerator) { $databaseFacade = new DatabaseFacade($codeGenerator, new QueryExecutor()); $runner->addDatabaseFacadeForPlatformClass($databaseFacade, $databasePlatformClass); } return $runner; } private function createImports($config) { $imports = []; Loading @@ -107,29 +53,29 @@ class ConfigFactory return $imports; } private function createImport($importConfig) private function createImport($moduleConfig) { if (!array_key_exists($key = 'source', $importConfig)) { if (!array_key_exists($key = 'source', $moduleConfig)) { throw ConfigException::missingKey($key); } if (!array_key_exists($key = 'destination', $importConfig)) { if (!array_key_exists($key = 'destination', $moduleConfig)) { throw ConfigException::missingKey($key); } $source = $this->createSource($importConfig['source']); $destination = $this->createDestination($importConfig['destination']); $source = $this->createSource($moduleConfig['source']); $destination = $this->createDestination($moduleConfig['destination']); $importConfig['source'] = $source; $importConfig['destination'] = $destination; $moduleConfig['source'] = $source; $moduleConfig['destination'] = $destination; return Import::fromConfig($importConfig); return Import::fromConfig($moduleConfig); } private function createSynchros($config) private function createSynchros($moduleConfig) { $synchros = []; if (array_key_exists($key = 'synchros', $config)) { foreach ($config[$key] as $synchroArr) { if (array_key_exists($key = 'synchros', $moduleConfig)) { foreach ($moduleConfig[$key] as $synchroArr) { $synchros[] = $this->createSynchro($synchroArr); } } Loading @@ -137,41 +83,41 @@ class ConfigFactory return $synchros; } private function createSynchro($config) private function createSynchro($moduleConfig) { if (!array_key_exists($key = 'source', $config)) { if (!array_key_exists($key = 'source', $moduleConfig)) { throw ConfigException::missingKey($key); } if (!array_key_exists($key = 'destination', $config)) { if (!array_key_exists($key = 'destination', $moduleConfig)) { throw ConfigException::missingKey($key); } $source = $this->createSource($config['source']); $destination = $this->createDestination($config['destination']); $source = $this->createSource($moduleConfig['source']); $destination = $this->createDestination($moduleConfig['destination']); $config['source'] = $source; $config['destination'] = $destination; $moduleConfig['source'] = $source; $moduleConfig['destination'] = $destination; return Synchro::fromConfig($config); return Synchro::fromConfig($moduleConfig); } private function createSource(array $config) private function createSource(array $sourceConfig) { /** @var Connection $conn */ $conn = $this->sl->get($config['connection']); $config['connection'] = $conn; $conn = $this->container->get($sourceConfig['connection']); $sourceConfig['connection'] = $conn; $source = Source::fromConfig($config); $source = Source::fromConfig($sourceConfig); return $source; } private function createDestination(array $config) private function createDestination(array $destinationConfig) { /** @var Connection $conn */ $conn = $this->sl->get($config['connection']); $config['connection'] = $conn; $conn = $this->container->get($destinationConfig['connection']); $destinationConfig['connection'] = $conn; return Destination::fromConfig($config); return Destination::fromConfig($destinationConfig); } } No newline at end of file
src/UnicaenDbImport/Runner.phpdeleted 100644 → 0 +0 −143 Changes for src/UnicaenDbImport/Runner.php: 0 added lines, 143 removed lines. Original line number Diff line number Diff line <?php namespace UnicaenDbImport; use Doctrine\DBAL\DBALException; use Exception; use RuntimeException; use UnicaenDbImport\Domain\DestinationInterface; use UnicaenDbImport\Domain\ImportInterface; use UnicaenDbImport\Domain\ImportResult; use UnicaenDbImport\Domain\SynchroInterface; use UnicaenDbImport\Domain\SynchroResult; class Runner { /** * @var DatabaseFacade */ private $databaseFacade; /** * @var DatabaseFacade[] */ private $databaseFacadesByPlatform; /** * @param DatabaseFacade $databaseFacade * @param string $databasePlatformClass */ public function addDatabaseFacadeForPlatformClass(DatabaseFacade $databaseFacade, $databasePlatformClass) { $this->databaseFacadesByPlatform[$databasePlatformClass] = $databaseFacade; } /** * Réalise l'import. * * @param ImportInterface $import * @return ImportResult Résultat de l'import */ public function runImport(ImportInterface $import) { $source = $import->getSource(); $destination = $import->getDestination(); $this->loadDatabaseFacadeForDestination($destination); try { $this->databaseFacade->executeSelectSource($source); // découverte des colonnes $this->databaseFacade->validateDestinationTable($destination); $this->databaseFacade->truncateTable($destination->getTable(), $destination); $count = $this->databaseFacade->populateDestinationTableFromSource($destination, $source); $result = ImportResult::fromDestinationTablePopulateResult($count); } catch (Exception $e) { $result = new ImportResult(); $result->setImport($import); $result->setException($e); } return $result; } /** * Réalise une synchro.. * * @param SynchroInterface $synchro * @return SynchroResult Résultat de la synchro */ public function runSynchro(SynchroInterface $synchro) { $source = $synchro->getSource(); $destination = $synchro->getDestination(); $this->loadDatabaseFacadeForDestination($destination); $intermediateTable = null; try { $this->databaseFacade->executeSelectSource($source); // découverte des colonnes $this->databaseFacade->validateDestinationTable($destination); if ($synchro->requiresIntermediateTable()) { $intermediateTable = $synchro->getIntermediateTable(); if ($synchro->getIntermediateTableAutoDrop()) { $this->databaseFacade->dropIntermediateTable($intermediateTable, $destination); } else { $this->databaseFacade->checkIntermediateTableNotExists($destination, $intermediateTable); } $this->databaseFacade->createIntermediateTable($intermediateTable, $source, $destination); $this->databaseFacade->populateTableFromSource($intermediateTable, $source, $destination); } else { $this->databaseFacade->validateSourceTable($source); } $this->databaseFacade->createSynchroLogTableIfNotExists($destination); $this->databaseFacade->recreateDiffView($source, $destination, $intermediateTable); $hash = $this->databaseFacade->executeDiffViewRequest($source, $destination); if ($synchro->requiresIntermediateTable()) { $this->databaseFacade->dropIntermediateTable($intermediateTable, $destination); } $arrayResults = $this->databaseFacade->fetchSynchroLogTable($destination, $hash); $result = SynchroResult::fromSynchroLogTableFetchResult($arrayResults); $result->setSynchro($synchro); } catch (Exception $e) { $result = new SynchroResult(); $result->setSynchro($synchro); $result->setException($e); } return $result; } /** * @param DestinationInterface $destination */ private function loadDatabaseFacadeForDestination(DestinationInterface $destination) { try { $platform = $destination->getConnection()->getDatabasePlatform(); } catch (DBALException $e) { throw new RuntimeException("Impossible de déterminer la plateforme pour la destination " . $destination->getName()); } $platformClass = get_class($platform); if (! isset($this->databaseFacadesByPlatform[$platformClass])) { throw new RuntimeException("DatabaseFacade non fournie pour cette plateforme : " . $platformClass); } $this->databaseFacade = $this->databaseFacadesByPlatform[$platformClass]; } }
src/UnicaenDbImport/Service/CodeGeneratorPluginManager.php 0 → 100644 +11 −0 Changes for src/UnicaenDbImport/Service/CodeGeneratorPluginManager.php: 11 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace UnicaenDbImport\Service; use UnicaenDbImport\CodeGenerator\CodeGenerator; use Zend\ServiceManager\AbstractPluginManager; class CodeGeneratorPluginManager extends AbstractPluginManager { protected $instanceOf = CodeGenerator::class; } No newline at end of file