Commit 6a2d2a8a authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Synchro : possibilité de synchroniser (inserts seulement) en conservant les ids de la source

parent 30e83a18
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -484,6 +484,8 @@ return [
                    'table'              => 'ROLE',
                    'connection'         => 'orm_A',
                    'source_code_column' => 'CODE',
                    'id_strategy' => 'SEQUENCE',
                    'id_sequence' => null,
                ],
            ],
        ],
@@ -529,6 +531,8 @@ return [
                    'table'              => 'UTILISATEUR',
                    'connection'         => 'orm_A',
                    'source_code_column' => 'CODE',
                    'id_strategy' => 'SEQUENCE',
                    'id_sequence' => null,
                    
                    'intermediate_table' => 'NOM_QUE_JE_FORCE', // sinon ce sera 'TMP_UTILISATEUR'

@@ -572,6 +576,8 @@ return [
                    'table'              => 'REGION',
                    'connection'         => 'orm_A',
                    'source_code_column' => 'CODE',
                    'id_strategy' => 'SEQUENCE',
                    'id_sequence' => null,
                ],
            ],
        ],
@@ -650,6 +656,8 @@ return [
                    'table'              => 'FORMATION',
                    'connection'         => 'orm_A',
                    'source_code_column' => 'ID',
                    'id_strategy' => 'SEQUENCE',
                    'id_sequence' => null,
                ],
            ],
        ],
+35 −6
Original line number Diff line number Diff line
@@ -109,9 +109,17 @@ return [
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
                    'column_value_filter' => null,

                    // Forçage éventuel du nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire).
                    // En l'absence de forçage, aucune séquence ne sera utilisée et la colonne devra avoir un type auto-incrémenté
                    // pour que l'insertion de données fonctionne.
                    // Stratégie à utiliser pour générer les valeurs dans la colonne ID (clé primaire).
                    // Si la stratégie est `'SEQUENCE'`, la séquence spécifiée par 'id_sequence' sera utilisée.
                    // Si la stratégie est `'IDENTITY'`, la valeur de l'ID des données sources sera utilisée.
                    // Si la stratégie est `null`, la colonne de la table destination devra avoir un type auto-incrémenté
                    // pour que l'insertion fonctionne.
                    'id_strategy' => 'SEQUENCE',

                    // Nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire),
                    // dans le cas où la stratégie est 'SEQUENCE'.
                    // Si aucun nom n'est spécifié (`null`), c'est le nom de séquence par défaut qui sera généré et
                    // utilisé (exemple pour une table `region` : 'region_id_seq').
                    'id_sequence' => 'region_id_seq',

                    // Forçage éventuel du nom de la table où seront inscrits les logs (créée automatiquement si nécessaire).
@@ -161,9 +169,17 @@ return [
                    // Nom de la colonne dans la table destination contenant l'identifiant unique
                    'source_code_column' => 'COD_PAY',

                    // Forçage éventuel du nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire).
                    // En l'absence de forçage, aucune séquence ne sera utilisée et la colonne devra avoir un type auto-incrémenté
                    // pour que l'insertion de données fonctionne.
                    // Stratégie à utiliser pour générer les valeurs dans la colonne ID (clé primaire).
                    // Si la stratégie est `'SEQUENCE'`, la séquence spécifiée par 'id_sequence' sera utilisée.
                    // Si la stratégie est `'IDENTITY'`, la valeur de l'ID des données sources sera utilisée.
                    // Si la stratégie est `null`, la colonne de la table destination devra avoir un type auto-incrémenté
                    // pour que l'insertion fonctionne.
                    'id_strategy' => 'SEQUENCE',

                    // Nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire),
                    // dans le cas où la stratégie est 'SEQUENCE'.
                    // Si aucun nom n'est spécifié (`null`), c'est le nom de séquence par défaut qui sera généré et
                    // utilisé (exemple pour une table `region` : 'region_id_seq').
                    'id_sequence' => 'MES_PAYS_TEMPORAIRES_ID_SEQ',

                    // Forçage éventuel du nom de la table où seront inscrits les logs (créée automatiquement si nécessaire).
@@ -223,6 +239,19 @@ return [
                    // (les noms de colonnes doivent être préfixés par l'alias de la table destination 'd')
                    //'where' => "d.TEM_OUV_DRT_SSO_PAY = 'N'",

                    // Stratégie à utiliser pour générer les valeurs dans la colonne ID (clé primaire).
                    // Si la stratégie est `'SEQUENCE'`, la séquence spécifiée par 'id_sequence' sera utilisée.
                    // Si la stratégie est `'IDENTITY'`, la valeur de l'ID des données sources sera utilisée.
                    // Si la stratégie est `null`, la colonne de la table destination devra avoir un type auto-incrémenté
                    // pour que l'insertion fonctionne.
                    'id_strategy' => null,

                    // Nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire),
                    // dans le cas où la stratégie est 'SEQUENCE'.
                    // Si aucun nom n'est spécifié (`null`), c'est le nom de séquence par défaut qui sera généré et
                    // utilisé (exemple pour une table `region` : 'region_id_seq').
                    'id_sequence' => null,

                    // Forçage éventuel du nom de la table où seront inscrits les logs (créée automatiquement si nécessaire).
                    // En l'absence de ce forçage, le nom de la table sera 'import_log'.
                    'log_table' => 'import_log',
+45 −8
Original line number Diff line number Diff line
@@ -259,15 +259,17 @@ abstract class CodeGenerator implements CodeGeneratorInterface
     * @param string $tableName
     * @param array $row
     * @param string|null $sourceCode
     * @param string|null|false $idColumnSequence
     * @param string|null $idColumnStrategy
     * @param string|null $idColumnSequence
     * @return string
     */
    public function generateSQLForInsertOneRowIntoTable(string $tableName,
                                                  array  $row,
                                                  string $sourceCode = null,
                                                         $idColumnSequence = null): string
                                                  ?string $idColumnStrategy = null,
                                                  ?string $idColumnSequence = null): string
    {
        return $this->tableHelper->generateSQLForInsertOneRowIntoTable($tableName, $row, $sourceCode, $idColumnSequence);
        return $this->tableHelper->generateSQLForInsertOneRowIntoTable($tableName, $row, $sourceCode, $idColumnStrategy, $idColumnSequence);
    }

    /**
@@ -307,17 +309,32 @@ abstract class CodeGenerator implements CodeGeneratorInterface
     * @param DestinationInterface $destination
     * @param string|null $intermediateTable
     * @return string
     * @throws \Doctrine\DBAL\Exception
     */
    public function generateSQLForDiffViewCreation(SourceInterface $source, DestinationInterface $destination, string $intermediateTable = null): string
    {
        $destinationTable = $destination->getTable();
        $sourceCodeColumn = $source->getSourceCodeColumn();
        $columns = $source->getColumns();
        $includeIdColumn = $destination->getIdColumnStrategy() === DestinationInterface::ID_STRATEGY_IDENTITY;

        // les éventuelles colonnes d'historique dans les données sources seront écrasées :
        $columns = array_diff($columns, [
            $c = $this->config->getHistoColumnAliasForCreatedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForCreatedBy(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForUpdatedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForUpdatedBy(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForDeletedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForDeletedBy(), strtoupper($c),
        ]);

        $diffSourceTableName = $intermediateTable ?: $source->getTable();

        return $this->tableHelper->generateSQLForDiffViewCreation($diffSourceTableName, $destinationTable, $sourceCodeColumn, $columns);
        return $this->tableHelper->generateSQLForDiffViewCreationOrUpdate(
            $diffSourceTableName,
            $destinationTable,
            $sourceCodeColumn,
            $columns,
            $includeIdColumn);
    }

    /**
@@ -331,8 +348,19 @@ abstract class CodeGenerator implements CodeGeneratorInterface
        $sourceCodeColumn = $source->getSourceCodeColumn();
        $columns = $source->getColumns();
        $where = $destination->getWhere();
        $includeIdColumn = $destination->getIdColumnStrategy() === DestinationInterface::ID_STRATEGY_IDENTITY;

        // les éventuelles colonnes d'historique dans les données sources seront écrasées :
        $columns = array_diff($columns, [
            $c = $this->config->getHistoColumnAliasForCreatedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForCreatedBy(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForUpdatedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForUpdatedBy(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForDeletedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForDeletedBy(), strtoupper($c),
        ]);

        return $this->tableHelper->generateSQLForDiffViewSelect($destinationTable, $sourceCodeColumn, $columns, $where);
        return $this->tableHelper->generateSQLForDiffViewSelect($destinationTable, $sourceCodeColumn, $columns, $where, $includeIdColumn);
    }

    /**
@@ -344,13 +372,21 @@ abstract class CodeGenerator implements CodeGeneratorInterface
        DestinationInterface $destination): string
    {
        $destinationTable = $destination->getTable();
        $idColumnStrategy = $destination->getIdColumnStrategy();
        $idColumnSequence = $destination->getIdColumnSequence();
        $where = $destination->getWhere();
        $sourceCodeColumn = $source->getSourceCodeColumn();
        $columns = $source->getColumns();

        // colonne ID écartée
        $columns = array_diff($columns, ['ID', 'id']);
        // les éventuelles colonnes d'historique dans les données sources seront écrasées :
        $columns = array_diff($columns, [
            $c = $this->config->getHistoColumnAliasForCreatedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForCreatedBy(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForUpdatedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForUpdatedBy(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForDeletedOn(), strtoupper($c),
            $c = $this->config->getHistoColumnAliasForDeletedBy(), strtoupper($c),
        ]);

        switch ($operation) {
            case Operation::OPERATION_INSERT;
@@ -359,6 +395,7 @@ abstract class CodeGenerator implements CodeGeneratorInterface
                        $sourceCodeColumn,
                        $columns,
                        $where,
                        $idColumnStrategy,
                        $idColumnSequence);
                break;
            case Operation::OPERATION_UPDATE;
+4 −2
Original line number Diff line number Diff line
@@ -86,13 +86,15 @@ interface CodeGeneratorInterface
     * @param string $tableName
     * @param array $row
     * @param string|null $sourceCode
     * @param string|null|false $idColumnSequence
     * @param string|null $idColumnStrategy
     * @param string|null $idColumnSequence
     * @return string
     */
    public function generateSQLForInsertOneRowIntoTable(string $tableName,
                                                        array  $row,
                                                        string $sourceCode = null,
                                                               $idColumnSequence = null): string;
                                                        ?string $idColumnStrategy = null,
                                                        ?string $idColumnSequence = null): string;

    /**
     * @param string $logTableName
+119 −86

File changed.

Preview size limit exceeded, changes collapsed.

Loading