From 7d9d375d9acb0b73e98cc2deb1fad551366730ea Mon Sep 17 00:00:00 2001
From: Bertrand Gauthier <bertrand.gauthier@unicaen.fr>
Date: Fri, 5 Apr 2019 17:04:45 +0200
Subject: [PATCH] =?UTF-8?q?G=C3=A9n=C3=A9ration=20des=20scripts=20d'insert?=
 =?UTF-8?q?ion=20en=20base=20:=20ajout=20d'une=20marque=20'/*HISTO::*/=20?=
 =?UTF-8?q?=C3=A0=20c=C3=B4t=C3=A9=20des=20valeurs=20des=20colonnes=20d'hi?=
 =?UTF-8?q?storique,=20permettant=20de=20les=20rep=C3=A9rer=20pour=20?=
 =?UTF-8?q?=C3=A9ventuellement=20les=20substituer=20par=201=20par=20exempl?=
 =?UTF-8?q?e,=20=C3=A9vitant=20ainsi=20les=20erreurs=20de=20contrainte=20d?=
 =?UTF-8?q?e=20r=C3=A9f=C3=A9rence.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/UnicaenOracle/Service/DataService.php | 39 ++++++++++++++++++-----
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/UnicaenOracle/Service/DataService.php b/src/UnicaenOracle/Service/DataService.php
index e039554..69e449c 100644
--- a/src/UnicaenOracle/Service/DataService.php
+++ b/src/UnicaenOracle/Service/DataService.php
@@ -26,7 +26,7 @@ class DataService
         }
         $results = $stmt->fetchAll();
         $preparedTablesMetadata = $this->prepareTablesMetadata($results);
-        //var_dump(prepareTablesMetadata($results));
+
         $outputFilePaths = [];
 
         foreach ($preparedTablesMetadata as $tableName => $columnsConfig) {
@@ -51,8 +51,11 @@ class DataService
                     if ($columnValue === null) {
                         $formattedColumnValue = 'NULL';
                     } else {
-                        $formatter = $columnMetadata['formatter'];
-                        $formattedColumnValue = $formatter($columnValue);
+                        $formatters = $columnMetadata['formatters'];
+                        $formattedColumnValue = $columnValue;
+                        foreach ($formatters as $formatter) {
+                            $formattedColumnValue = $formatter($formattedColumnValue);
+                        }
                     }
                     $formattedColumnValues[$columnName] = $formattedColumnValue;
                 }
@@ -99,16 +102,21 @@ EOS;
             $colName = $row['COLUMN_NAME'];
             $dataType = $row['DATA_TYPE'];
 
+            $formatters = [];
+
+            //
+            // formatteur selon le type de la colonne
+            //
             switch (true) {
 
                 case $dataType === 'NUMBER':
-                    $formatter = function ($value) {
+                    $formatters[] = function ($value) {
                         return $value;
                     };
                     break;
 
                 case $dataType === 'VARCHAR2':
-                    $formatter = function ($value) {
+                    $formatters[] = function ($value) {
                         $value = str_replace("'", "''", $value);
 
                         return "'$value'";
@@ -116,7 +124,7 @@ EOS;
                     break;
 
                 case $dataType === 'CLOB':
-                    $formatter = function ($value) {
+                    $formatters[] = function ($value) {
                         $value = str_replace("'", "''", $value);
                         // découpage en morceaux de 4000 caractères pour éviter l'erreur ORA-01704: string literal too long.
                         $lineEnding = '######';
@@ -131,7 +139,7 @@ EOS;
 
                 case $dataType === 'DATE':
                 case substr($dataType, 0, 9) === 'TIMESTAMP':
-                    $formatter = function ($value) {
+                    $formatters[] = function ($value) {
                         return "TO_DATE('$value', 'YYYY-MM-DD HH24:MI:SS')";
                     };
                     break;
@@ -139,9 +147,24 @@ EOS;
                 default:
                     throw new RuntimeException("Type imprévu rencontré dans la table '$tableName' : $dataType.");
             }
+
+            //
+            // formatteur selon le nom de la colonne
+            //
+            switch (true) {
+                // repérage des valeurs de colonnes d'historique, permettant si besoin une substitution de valeur ultérieure
+                case $colName === 'HISTO_CREATEUR_ID':
+                case $colName === 'HISTO_MODIFICATEUR_ID':
+                case $colName === 'HISTO_DESTRUCTEUR_ID':
+                    $formatters[] = function ($value) {
+                        return '/*HISTO::*/' . $value;
+                    };
+                    break;
+            }
+
             $cfg = [
                 'DATA_TYPE' => $dataType,
-                'formatter' => $formatter,
+                'formatters' => $formatters,
             ];
 
             if (!isset($formatted[$tableName])) {
-- 
GitLab