Commit 27b2d176 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Refactorisations et simplification (DatabaseService,...

Refactorisations et simplification (DatabaseService, CodeGeneratorPluginManager, disparition de Runner, etc.)
parent 7da2bfc4
Loading
Loading
Loading
Loading
+3 −1
Changes for config/module.config.php: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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;
@@ -69,7 +71,7 @@ return [
            ImportService::class => ImportServiceFactory::class,
            SynchroService::class => SynchroServiceFactory::class,

            PostgreSQLCodeGenerator::class => PostgreSQLCodeGeneratorFactory::class,
            CodeGeneratorPluginManager::class => CodeGeneratorPluginManagerFactory::class,
        ],
    ],
];
+0 −24
Changes for src/UnicaenDbImport/Config/Config.php: 0 added lines, 24 removed lines.
Original line number Diff line number Diff line
@@ -13,11 +13,6 @@ use UnicaenDbImport\Runner;
 */
class Config
{
    /**
     * @var Runner
     */
    protected $runner = [];

    /**
     * @var ImportInterface[]
     */
@@ -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
+35 −89
Changes for src/UnicaenDbImport/Config/ConfigFactory.php: 35 added lines, 89 removed lines.
Original line number Diff line number Diff line
@@ -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
@@ -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 = [];
@@ -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);
            }
        }
@@ -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.php

deleted100644 → 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];
    }
}
+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