Loading src/UnicaenDbImport/Service/Database/DatabaseService.php +19 −21 Changes for src/UnicaenDbImport/Service/Database/DatabaseService.php: 19 added lines, 21 removed lines. Original line number Diff line number Diff line Loading @@ -5,11 +5,9 @@ namespace UnicaenDbImport\Service\Database; use Assert\Assertion; use Assert\AssertionFailedException; use Doctrine\DBAL\Connection; use Doctrine\DBAL\ConnectionException; use Doctrine\DBAL\Exception; use UnicaenDbImport\CodeGenerator\CodeGenerator; use UnicaenDbImport\Domain\DestinationInterface; use UnicaenDbImport\Domain\Operation; use UnicaenDbImport\Domain\ResultInterface; use UnicaenDbImport\Domain\SourceInterface; use UnicaenDbImport\Entity\Db\Service\ImportObserv\ImportObservServiceAwareTrait; Loading Loading @@ -240,28 +238,26 @@ class DatabaseService } /** * Vérifie dans la table SOURCE qu'il existe bien une source ayant le 'code' spécifié. * * @throws \UnicaenDbImport\Service\Exception\DatabaseServiceException */ public function validateSourceNameExists() public function validateCodeExistsInSourceTable(string $code) { $connection = $this->destination->getConnection(); $tableName = self::SOURCE_TABLE_NAME; $column = self::SOURCE_TABLE_CODE_COLUMN; $value = $this->source->getCode(); if ($value === null) { return; } // test if value exists in table $sql = $this->codeGenerator->generateSQLForValueExistenceCheckInTable($column, $value, $tableName); $sql = $this->codeGenerator->generateSQLForValueExistenceCheckInTable($column, $code, $tableName); try { $result = $this->queryExecutor->fetchAll($sql, $connection); } catch (Exception $e) { throw DatabaseServiceException::error("Erreur lors du test d'existence de la valeur '$value' dans la table '$tableName'", $e); throw DatabaseServiceException::error("Erreur lors du test d'existence de la valeur '$code' dans la table '$tableName'", $e); } $exists = $this->codeGenerator->convertValueExistenceCheckInTableResultToBoolean($result); if (!$exists) { throw DatabaseServiceException::error("Vous devez déclarer une source dans la table '$tableName' dont le $column est '$value'."); throw DatabaseServiceException::error("Vous devez déclarer une source dans la table '$tableName' dont le $column est '$code'."); } } Loading Loading @@ -375,20 +371,20 @@ class DatabaseService $idColumnSequenceName = $this->destination->getIdColumnSequence(); $connection = $this->destination->getConnection(); $result = -1; try { $connection->beginTransaction(); $this->truncateDestinationTable(); $result = $this->populateTableFromSource($destinationTable, $idColumnSequenceName); $count = $this->populateTableFromSource($destinationTable, $idColumnSequenceName); $connection->commit(); } catch (DatabaseServiceException $e) { $this->rollBack($connection); throw $e; } catch (Exception $e) { $this->rollBack($connection); throw DatabaseServiceException::error("Erreur rencontrée en bdd : " . $e->getMessage(), $e); } return $result; return $count; } /** Loading @@ -407,7 +403,7 @@ class DatabaseService * @param string $tableName * @param string|null|false $idColumnSequence * @return int * @throws \UnicaenDbImport\Service\Exception\DatabaseServiceException * @throws \UnicaenDbImport\Service\Exception\DatabaseServiceException Aucune données dans la source ; ou anomalie ; ou erreur en bdd */ public function populateTableFromSource(string $tableName, $idColumnSequence = null): int { Loading @@ -420,22 +416,24 @@ class DatabaseService $count = 0; // insert par paquets $sliceSize = self::DATA_SLICE_SIZE_FOR_INSERT; for ($offset = 0; $offset < count($data) ; $offset += $sliceSize) { $slicedData = array_slice($data, $offset, $sliceSize); foreach ($slicedData as $row) { foreach ($data as $row) { $preparedRow = $this->prepareSourceDataRow($row); $columnsValues = $this->prepareDestinationData($preparedRow); $insertsSQL = $this->codeGenerator->generateSQLForInsertOneRowIntoTable($tableName, $columnsValues, $sourceCode, $idColumnSequence); try { $count += $this->queryExecutor->exec($insertsSQL, $this->destination->getConnection()); $n = $this->queryExecutor->exec($insertsSQL, $this->destination->getConnection()); } catch (Exception $e) { throw DatabaseServiceException::error("Erreur rencontrée lors du remplissage de la table destination '$tableName'", $e); } if ($n === 0) { throw DatabaseServiceException::error(sprintf( "Lors du remplissage de la table destination '$tableName', un insert au moins n'a eu aucun effet, ". "sans doute parce que la source dont le '%s' est '%s' n'est pas déclarée dans la table %s", self::SOURCE_TABLE_CODE_COLUMN, $preparedRow['SOURCE_ID'], self::SOURCE_TABLE_NAME )); } $count += $n; } return $count; Loading src/UnicaenDbImport/Service/Facade/AbstractFacadeService.php +3 −1 Changes for src/UnicaenDbImport/Service/Facade/AbstractFacadeService.php: 3 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -85,7 +85,9 @@ abstract class AbstractFacadeService $this->databaseService->validateSourceTable(); break; case $connection instanceof ApiConnection: $this->databaseService->validateSourceNameExists(); if ($code = $this->source->getCode()) { $this->databaseService->validateCodeExistsInSourceTable($code); } break; default: throw ConnectionException::unexpected($connection); Loading Loading
src/UnicaenDbImport/Service/Database/DatabaseService.php +19 −21 Changes for src/UnicaenDbImport/Service/Database/DatabaseService.php: 19 added lines, 21 removed lines. Original line number Diff line number Diff line Loading @@ -5,11 +5,9 @@ namespace UnicaenDbImport\Service\Database; use Assert\Assertion; use Assert\AssertionFailedException; use Doctrine\DBAL\Connection; use Doctrine\DBAL\ConnectionException; use Doctrine\DBAL\Exception; use UnicaenDbImport\CodeGenerator\CodeGenerator; use UnicaenDbImport\Domain\DestinationInterface; use UnicaenDbImport\Domain\Operation; use UnicaenDbImport\Domain\ResultInterface; use UnicaenDbImport\Domain\SourceInterface; use UnicaenDbImport\Entity\Db\Service\ImportObserv\ImportObservServiceAwareTrait; Loading Loading @@ -240,28 +238,26 @@ class DatabaseService } /** * Vérifie dans la table SOURCE qu'il existe bien une source ayant le 'code' spécifié. * * @throws \UnicaenDbImport\Service\Exception\DatabaseServiceException */ public function validateSourceNameExists() public function validateCodeExistsInSourceTable(string $code) { $connection = $this->destination->getConnection(); $tableName = self::SOURCE_TABLE_NAME; $column = self::SOURCE_TABLE_CODE_COLUMN; $value = $this->source->getCode(); if ($value === null) { return; } // test if value exists in table $sql = $this->codeGenerator->generateSQLForValueExistenceCheckInTable($column, $value, $tableName); $sql = $this->codeGenerator->generateSQLForValueExistenceCheckInTable($column, $code, $tableName); try { $result = $this->queryExecutor->fetchAll($sql, $connection); } catch (Exception $e) { throw DatabaseServiceException::error("Erreur lors du test d'existence de la valeur '$value' dans la table '$tableName'", $e); throw DatabaseServiceException::error("Erreur lors du test d'existence de la valeur '$code' dans la table '$tableName'", $e); } $exists = $this->codeGenerator->convertValueExistenceCheckInTableResultToBoolean($result); if (!$exists) { throw DatabaseServiceException::error("Vous devez déclarer une source dans la table '$tableName' dont le $column est '$value'."); throw DatabaseServiceException::error("Vous devez déclarer une source dans la table '$tableName' dont le $column est '$code'."); } } Loading Loading @@ -375,20 +371,20 @@ class DatabaseService $idColumnSequenceName = $this->destination->getIdColumnSequence(); $connection = $this->destination->getConnection(); $result = -1; try { $connection->beginTransaction(); $this->truncateDestinationTable(); $result = $this->populateTableFromSource($destinationTable, $idColumnSequenceName); $count = $this->populateTableFromSource($destinationTable, $idColumnSequenceName); $connection->commit(); } catch (DatabaseServiceException $e) { $this->rollBack($connection); throw $e; } catch (Exception $e) { $this->rollBack($connection); throw DatabaseServiceException::error("Erreur rencontrée en bdd : " . $e->getMessage(), $e); } return $result; return $count; } /** Loading @@ -407,7 +403,7 @@ class DatabaseService * @param string $tableName * @param string|null|false $idColumnSequence * @return int * @throws \UnicaenDbImport\Service\Exception\DatabaseServiceException * @throws \UnicaenDbImport\Service\Exception\DatabaseServiceException Aucune données dans la source ; ou anomalie ; ou erreur en bdd */ public function populateTableFromSource(string $tableName, $idColumnSequence = null): int { Loading @@ -420,22 +416,24 @@ class DatabaseService $count = 0; // insert par paquets $sliceSize = self::DATA_SLICE_SIZE_FOR_INSERT; for ($offset = 0; $offset < count($data) ; $offset += $sliceSize) { $slicedData = array_slice($data, $offset, $sliceSize); foreach ($slicedData as $row) { foreach ($data as $row) { $preparedRow = $this->prepareSourceDataRow($row); $columnsValues = $this->prepareDestinationData($preparedRow); $insertsSQL = $this->codeGenerator->generateSQLForInsertOneRowIntoTable($tableName, $columnsValues, $sourceCode, $idColumnSequence); try { $count += $this->queryExecutor->exec($insertsSQL, $this->destination->getConnection()); $n = $this->queryExecutor->exec($insertsSQL, $this->destination->getConnection()); } catch (Exception $e) { throw DatabaseServiceException::error("Erreur rencontrée lors du remplissage de la table destination '$tableName'", $e); } if ($n === 0) { throw DatabaseServiceException::error(sprintf( "Lors du remplissage de la table destination '$tableName', un insert au moins n'a eu aucun effet, ". "sans doute parce que la source dont le '%s' est '%s' n'est pas déclarée dans la table %s", self::SOURCE_TABLE_CODE_COLUMN, $preparedRow['SOURCE_ID'], self::SOURCE_TABLE_NAME )); } $count += $n; } return $count; Loading
src/UnicaenDbImport/Service/Facade/AbstractFacadeService.php +3 −1 Changes for src/UnicaenDbImport/Service/Facade/AbstractFacadeService.php: 3 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -85,7 +85,9 @@ abstract class AbstractFacadeService $this->databaseService->validateSourceTable(); break; case $connection instanceof ApiConnection: $this->databaseService->validateSourceNameExists(); if ($code = $this->source->getCode()) { $this->databaseService->validateCodeExistsInSourceTable($code); } break; default: throw ConnectionException::unexpected($connection); Loading