Commit 09ce0433 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Ajout du support de la plateforme Oracle

parent a7a28236
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport;

use Doctrine\DBAL\Platforms\OraclePlatform;
use UnicaenDbImport\CodeGenerator\Oracle\CodeGenerator;
use UnicaenDbImport\CodeGenerator\Oracle\CodeGeneratorFactory;

return [
    'import' => [
        /**
         * @see Config::getCodeGeneratorsMappingConfig()
         */
        'code_generators_mapping' => [
            OraclePlatform::class => CodeGenerator::class,
        ],
        /**
         * @see Config::getCodeGeneratorsFactoriesConfig()
         */
        'code_generators_factories' => [
            CodeGenerator::class => CodeGeneratorFactory::class,
        ],
    ],
];
+68 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport\CodeGenerator\Oracle;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Platforms\OraclePlatform;
use UnicaenDbImport\CodeGenerator\Oracle\Helper\DiffViewHelper as OracleDiffViewHelper;
use UnicaenDbImport\CodeGenerator\Oracle\Helper\LogTableHelper as OracleLogTableHelper;
use UnicaenDbImport\CodeGenerator\Oracle\Helper\TableValidationHelper as OracleTableValidationHelper;
use UnicaenDbImport\CodeGenerator\Oracle\Helper\TableHelper as OracleTableHelper;

/**
 * Version Oracle.
 *
 * @author Unicaen
 */
class CodeGenerator extends \UnicaenDbImport\CodeGenerator\CodeGenerator
{
    /**
     * @var OraclePlatform
     */
    protected $platform;

    /**
     * @var OracleTableHelper
     */
    protected $tableHelper;

    /**
     * @var OracleTableValidationHelper
     */
    protected $tableValidationHelper;

    /**
     * @var OracleDiffViewHelper
     */
    protected $diffViewHelper;

    /**
     * @var OracleLogTableHelper
     */
    protected $logTableHelper;

    /**
     * CodeGenerator constructor.
     *
     * @param AbstractPlatform $platform
     */
    public function __construct(AbstractPlatform $platform)
    {
        parent::__construct($platform);

        $this->tableHelper = new OracleTableHelper($this->platform);
        $this->tableValidationHelper = new OracleTableValidationHelper($this->platform);
        $this->diffViewHelper = new OracleDiffViewHelper($this->platform);
        $this->logTableHelper = new OracleLogTableHelper($this->platform);
    }

    /**
     * @param string $tableName
     * @return string
     * @codeCoverageIgnore
     */
    public function generateSQLForIntermmediateTableDrop($tableName)
    {
        return "DROP TABLE $tableName CASCADE CONSTRAINTS ;";
    }
}
 No newline at end of file
+19 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport\CodeGenerator\Oracle;

use Doctrine\DBAL\Platforms\OraclePlatform;
use Interop\Container\ContainerInterface;
use UnicaenDbImport\CodeGenerator\Oracle\CodeGenerator as OracleCodeGenerator;

class CodeGeneratorFactory
{
    /**
     * @param ContainerInterface $container
     * @return CodeGenerator
     */
    public function __invoke(ContainerInterface $container)
    {
        return new OracleCodeGenerator(new OraclePlatform());
    }
}
 No newline at end of file
+88 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport\CodeGenerator\Oracle\Helper;

use Doctrine\DBAL\Platforms\OraclePlatform;
use UnicaenApp\Exception\LogicException;
use UnicaenDbImport\Domain\Operation;

class DiffViewHelper extends \UnicaenDbImport\CodeGenerator\Helper\DiffViewHelper
{
    /**
     * @var OraclePlatform
     */
    protected $platform;

    /**
     * {@inheritDoc}
     */
    protected function generateViewDeletionSQLSnippet($destinationTable)
    {
        $name = $this->generateViewName($destinationTable);

        return "DROP VIEW $name";
    }

    /**
     * {@inheritDoc}
     */
    protected function generateSQLForUpdateOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
    {
        return $this->generateSQLUpdate(Operation::OPERATION_UPDATE, $destinationTable, $sourceCodeColumn, $columns);
    }

    /**
     * {@inheritDoc}
     */
    protected function generateSQLForUndeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
    {
        return $this->generateSQLUpdate(Operation::OPERATION_UNDELETE, $destinationTable, $sourceCodeColumn, $columns);
    }

    /**
     * {@inheritDoc}
     */
    protected function generateSQLForDeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
    {
        return $this->generateSQLUpdate(Operation::OPERATION_DELETE, $destinationTable, $sourceCodeColumn, $columns);
    }

    /**
     * @param string $operation
     * @param string $destinationTable
     * @param string $sourceCodeColumn
     * @param array $columns
     * @return string
     */
    protected function generateSQLUpdate($operation, $destinationTable, $sourceCodeColumn, array $columns)
    {
        $diffViewName = $this->generateViewName($destinationTable);
        $now = $this->platform->getNowExpression();

        // instruction de mise à jour de la table destination
        $markup = '';
        $markup .= "MERGE INTO $destinationTable d USING (SELECT * FROM $diffViewName) AS diff " . PHP_EOL;
        $markup .= "ON diff.operation = '$operation' AND d.$sourceCodeColumn = diff.$sourceCodeColumn " . PHP_EOL;
        $markup .= "WHEN MATCHED THEN UPDATE SET " . PHP_EOL;

        switch ($operation) {

            case Operation::OPERATION_UPDATE:
            case Operation::OPERATION_UNDELETE:
                $colUpdates = array_map(function ($col) {
                    return "$col = diff.S_$col";
                }, $columns);
                $markup .= implode(', ', $colUpdates) . ", updated_on = $now, deleted_on = null";
                break;

            case Operation::OPERATION_DELETE:
                $markup .=  "deleted_on = $now";
                break;

            default:
                throw new LogicException("Opération spécifiées inattendue: " . $operation);
        }

        return $markup;
    }
}
 No newline at end of file
+21 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport\CodeGenerator\Oracle\Helper;

use Doctrine\DBAL\Platforms\OraclePlatform;

/**
 * Génération de code SQL concernant la table de log de synchro.
 *
 * Version Oracle.
 *
 * @author Unicaen
 */
class LogTableHelper extends \UnicaenDbImport\CodeGenerator\Helper\LogTableHelper
{
    /**
     * @var OraclePlatform
     */
    protected $platform;

}
 No newline at end of file
Loading