Skip to content
Snippets Groups Projects
Commit 1b08d852 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Vérification de la présence/validité des colonnes source_code, source_id +...

Vérification de la présence/validité des colonnes source_code, source_id + Correction de la validation des colonnes d'historique.
parent 13ec5b58
Branches develop
Tags
No related merge requests found
...@@ -123,6 +123,27 @@ abstract class CodeGenerator implements CodeGeneratorInterface ...@@ -123,6 +123,27 @@ abstract class CodeGenerator implements CodeGeneratorInterface
return $this->tableValidationHelper->convertHistoColumnsValidationBadResultToException($tableName, $result); 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 * @param SourceInterface $source
* @return string * @return string
......
...@@ -55,6 +55,21 @@ interface CodeGeneratorInterface ...@@ -55,6 +55,21 @@ interface CodeGeneratorInterface
*/ */
public function convertHistoColumnsValidationBadResultToException($tableName, array $result); 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 * @param SourceInterface $source
* @return string * @return string
......
...@@ -60,6 +60,12 @@ abstract class TableValidationHelper extends Helper ...@@ -60,6 +60,12 @@ abstract class TableValidationHelper extends Helper
*/ */
abstract public function generateSQLForHistoColumnsValidation($tableName); abstract public function generateSQLForHistoColumnsValidation($tableName);
/**
* @param string $tableName
* @return string
*/
abstract public function generateSQLForSourceColumnsValidation($tableName);
/** /**
* @param string $tableName * @param string $tableName
* @param array $result * @param array $result
...@@ -79,6 +85,29 @@ abstract class TableValidationHelper extends Helper ...@@ -79,6 +85,29 @@ abstract class TableValidationHelper extends Helper
ALTER TABLE $tableName ADD created_on $timestamp DEFAULT $now NOT NULL ; ALTER TABLE $tableName ADD created_on $timestamp DEFAULT $now NOT NULL ;
ALTER TABLE $tableName ADD updated_on $timestamp ; ALTER TABLE $tableName ADD updated_on $timestamp ;
ALTER TABLE $tableName ADD deleted_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; EOT;
return new RuntimeException($message); return new RuntimeException($message);
......
...@@ -55,10 +55,10 @@ EOT; ...@@ -55,10 +55,10 @@ EOT;
WITH required_cols(column_name, column_type) AS ( WITH required_cols(column_name, column_type) AS (
$selects $selects
) )
SELECT rc.column_name, c.udt_name SELECT rc.column_name, c.data_type
FROM required_cols rc FROM required_cols rc
JOIN information_schema.columns c ON upper(c.column_name) = upper(rc.column_name) 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; EOT;
return $sql; return $sql;
...@@ -69,12 +69,23 @@ EOT; ...@@ -69,12 +69,23 @@ EOT;
*/ */
public function generateSQLForHistoColumnsValidation($tableName) 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 = [ $columnsAndTypes = [
'created_on' => $udtName, 'source_code' => 'character varying',
'updated_on' => $udtName, 'source_id' => 'integer',
'deleted_on' => $udtName,
]; ];
return $this->generateSQLForColumnsValidation($tableName, $columnsAndTypes); return $this->generateSQLForColumnsValidation($tableName, $columnsAndTypes);
......
...@@ -160,6 +160,14 @@ class DatabaseService ...@@ -160,6 +160,14 @@ class DatabaseService
if ($exception !== null) { if ($exception !== null) {
throw new RuntimeException("La table '$table' n'est pas une table de destination valide. ", 0, $exception); 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);
}
} }
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment