From 1b08d852478572d16bcc3ed9105f6a1e3c372cfe Mon Sep 17 00:00:00 2001 From: Bertrand Gauthier <bertrand.gauthier@unicaen.fr> Date: Tue, 15 Oct 2019 17:19:01 +0200 Subject: [PATCH] =?UTF-8?q?V=C3=A9rification=20de=20la=20pr=C3=A9sence/val?= =?UTF-8?q?idit=C3=A9=20des=20colonnes=20source=5Fcode,=20source=5Fid=20+?= =?UTF-8?q?=20Correction=20de=20la=20validation=20des=20colonnes=20d'histo?= =?UTF-8?q?rique.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CodeGenerator/CodeGenerator.php | 21 ++++++++++++++ .../CodeGenerator/CodeGeneratorInterface.php | 15 ++++++++++ .../Helper/TableValidationHelper.php | 29 +++++++++++++++++++ .../Helper/TableValidationHelper.php | 23 +++++++++++---- .../Service/DatabaseService.php | 8 +++++ 5 files changed, 90 insertions(+), 6 deletions(-) diff --git a/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php b/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php index f04fe82..f57e189 100644 --- a/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php +++ b/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php @@ -123,6 +123,27 @@ abstract class CodeGenerator implements CodeGeneratorInterface return $this->tableValidationHelper->convertHistoColumnsValidationBadResultToException($tableName, $result); } + /** + * @param string $tableName + * @return string + * @codeCoverageIgnore Car simple délégation + */ + public function generateSQLForSourceColumnsValidation($tableName) + { + return $this->tableValidationHelper->generateSQLForSourceColumnsValidation($tableName); + } + + /** + * @param string $tableName + * @param array $result + * @return null|RuntimeException + * @codeCoverageIgnore Car simple délégation + */ + public function convertSourceColumnsValidationBadResultToException($tableName, array $result) + { + return $this->tableValidationHelper->convertSourceColumnsValidationBadResultToException($tableName, $result); + } + /** * @param SourceInterface $source * @return string diff --git a/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php b/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php index f5a566b..c4320c5 100644 --- a/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php +++ b/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php @@ -55,6 +55,21 @@ interface CodeGeneratorInterface */ public function convertHistoColumnsValidationBadResultToException($tableName, array $result); + /** + * @param string $tableName + * @return string + * @codeCoverageIgnore Car simple délégation + */ + public function generateSQLForSourceColumnsValidation($tableName); + + /** + * @param string $tableName + * @param array $result + * @return null|RuntimeException + * @codeCoverageIgnore Car simple délégation + */ + public function convertSourceColumnsValidationBadResultToException($tableName, array $result); + /** * @param SourceInterface $source * @return string diff --git a/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php b/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php index 721d640..37fdfb6 100644 --- a/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php +++ b/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php @@ -60,6 +60,12 @@ abstract class TableValidationHelper extends Helper */ abstract public function generateSQLForHistoColumnsValidation($tableName); + /** + * @param string $tableName + * @return string + */ + abstract public function generateSQLForSourceColumnsValidation($tableName); + /** * @param string $tableName * @param array $result @@ -79,6 +85,29 @@ abstract class TableValidationHelper extends Helper ALTER TABLE $tableName ADD created_on $timestamp DEFAULT $now NOT NULL ; ALTER TABLE $tableName ADD updated_on $timestamp ; ALTER TABLE $tableName ADD deleted_on $timestamp ; +EOT; + + return new RuntimeException($message); + } + + /** + * @param string $tableName + * @param array $result + * @return null|RuntimeException + */ + public function convertSourceColumnsValidationBadResultToException($tableName, array $result) + { + if (count($result) === 2) { + return null; + } + + $integer = $this->platform->getIntegerTypeDeclarationSQL([]); + $varchar = $this->platform->getVarcharTypeDeclarationSQL([]); + + $message = "Assurez-vous que les colonnes suivantes sont présentes dans la table '$tableName' : " . PHP_EOL; + $message .= <<<EOT +ALTER TABLE $tableName ADD source_id $integer NOT NULL ; +ALTER TABLE $tableName ADD source_code $varchar(100) ; EOT; return new RuntimeException($message); diff --git a/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php b/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php index 3e73608..368e23a 100644 --- a/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php +++ b/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php @@ -55,10 +55,10 @@ EOT; WITH required_cols(column_name, column_type) AS ( $selects ) -SELECT rc.column_name, c.udt_name +SELECT rc.column_name, c.data_type FROM required_cols rc JOIN information_schema.columns c ON upper(c.column_name) = upper(rc.column_name) -WHERE upper(c.table_name) = upper('$tableName') AND (rc.column_type IS NULL OR rc.column_type = c.udt_name) +WHERE upper(c.table_name) = upper('$tableName') AND (rc.column_type IS NULL OR rc.column_type = c.data_type) ; EOT; return $sql; @@ -69,12 +69,23 @@ EOT; */ public function generateSQLForHistoColumnsValidation($tableName) { - $udtName = 'timestamp'; + $columnsAndTypes = [ + 'created_on' => 'timestamp without time zone', + 'updated_on' => 'timestamp without time zone', + 'deleted_on' => 'timestamp without time zone', + ]; + + return $this->generateSQLForColumnsValidation($tableName, $columnsAndTypes); + } + /** + * {@inheritDoc} + */ + public function generateSQLForSourceColumnsValidation($tableName) + { $columnsAndTypes = [ - 'created_on' => $udtName, - 'updated_on' => $udtName, - 'deleted_on' => $udtName, + 'source_code' => 'character varying', + 'source_id' => 'integer', ]; return $this->generateSQLForColumnsValidation($tableName, $columnsAndTypes); diff --git a/src/UnicaenDbImport/Service/DatabaseService.php b/src/UnicaenDbImport/Service/DatabaseService.php index 9a742b7..e8499f0 100644 --- a/src/UnicaenDbImport/Service/DatabaseService.php +++ b/src/UnicaenDbImport/Service/DatabaseService.php @@ -160,6 +160,14 @@ class DatabaseService if ($exception !== null) { throw new RuntimeException("La table '$table' n'est pas une table de destination valide. ", 0, $exception); } + + // source columns validation + $sql = $this->codeGenerator->generateSQLForSourceColumnsValidation($table); + $result = $this->queryExecutor->fetchAll($sql, $connection); + $exception = $this->codeGenerator->convertSourceColumnsValidationBadResultToException($table, $result); + if ($exception !== null) { + throw new RuntimeException("La table '$table' n'est pas une table de destination valide. ", 0, $exception); + } } /** -- GitLab