Commit bff6eb4a authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Refacto mineure

parent c0e7282e
Loading
Loading
Loading
Loading
Loading
+19 −21
Changes for src/UnicaenDbImport/Service/Database/DatabaseService.php: 19 added lines, 21 removed lines.
Original line number Diff line number Diff line
@@ -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;
@@ -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'.");
        }
    }

@@ -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;
    }

    /**
@@ -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
    {
@@ -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;
+3 −1
Changes for src/UnicaenDbImport/Service/Facade/AbstractFacadeService.php: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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);