diff --git a/lib/Doctrine/Migrations/Metadata/ExecutedMigration.php b/lib/Doctrine/Migrations/Metadata/ExecutedMigration.php index 1c72d48ee..dba6bc7b0 100644 --- a/lib/Doctrine/Migrations/Metadata/ExecutedMigration.php +++ b/lib/Doctrine/Migrations/Metadata/ExecutedMigration.php @@ -26,11 +26,22 @@ final class ExecutedMigration */ public $executionTime; - public function __construct(Version $version, ?DateTimeImmutable $executedAt = null, ?float $executionTime = null) - { + /** @var string|null */ + private $reason; + + /** @var string|null */ + private $reasonDescription; + + public function __construct( + Version $version, + ?DateTimeImmutable $executedAt = null, + ?float $executionTime = null, + ?string $reason + ) { $this->version = $version; $this->executedAt = $executedAt; $this->executionTime = $executionTime; + $this->reason = $reason; } public function getExecutionTime(): ?float @@ -43,6 +54,16 @@ public function getExecutedAt(): ?DateTimeImmutable return $this->executedAt; } + public function getReason(): ?string + { + return $this->reason; + } + + public function getReasonDescription(): ?string + { + return $this->reasonDescription; + } + public function getVersion(): Version { return $this->version; diff --git a/lib/Doctrine/Migrations/Metadata/Storage/MetadataStorage.php b/lib/Doctrine/Migrations/Metadata/Storage/MetadataStorage.php index 3a10ebc81..9865fed52 100644 --- a/lib/Doctrine/Migrations/Metadata/Storage/MetadataStorage.php +++ b/lib/Doctrine/Migrations/Metadata/Storage/MetadataStorage.php @@ -11,8 +11,17 @@ interface MetadataStorage { public function ensureInitialized(): void; + /** + * Returns only the migrations that have been successfully executed (reason=executed) + */ public function getExecutedMigrations(): ExecutedMigrationsList; + /** + * Returns all the for which there was an execution attempt + * Includes skipped, errored executed migrations. + */ + public function getAllExecutedMigrations(): ExecutedMigrationsList; + public function complete(ExecutionResult $migration): void; public function reset(): void; diff --git a/lib/Doctrine/Migrations/Metadata/Storage/TableMetadataStorage.php b/lib/Doctrine/Migrations/Metadata/Storage/TableMetadataStorage.php index 42ea39f6f..0d769d11a 100644 --- a/lib/Doctrine/Migrations/Metadata/Storage/TableMetadataStorage.php +++ b/lib/Doctrine/Migrations/Metadata/Storage/TableMetadataStorage.php @@ -101,12 +101,41 @@ public function getExecutedMigrations(): ExecutedMigrationsList ['reason' => Types::STRING] ); + return $this->hydrateExecutedMigrationsList($rows); + } + + public function getAllExecutedMigrations(): ExecutedMigrationsList + { + if (! $this->isInitialized()) { + return new ExecutedMigrationsList([]); + } + + $this->checkInitialization(); + $rows = $this->connection->fetchAllAssociative( + sprintf( + 'SELECT * FROM %s', + $this->configuration->getTableName(), + ), + ['reason' => self::RUN_EXECUTED], + ['reason' => Types::STRING] + ); + + return $this->hydrateExecutedMigrationsList($rows); + } + + /** + * @param array> $rows + */ + private function hydrateExecutedMigrationsList(array $rows): ExecutedMigrationsList + { $migrations = []; foreach ($rows as $row) { $row = array_change_key_case($row, CASE_LOWER); $version = new Version($row[strtolower($this->configuration->getVersionColumnName())]); + $reason = $row[strtolower($this->configuration->getExecutionReasonColumnName())]; + $executedAt = $row[strtolower($this->configuration->getExecutedAtColumnName())] ?? ''; $executedAt = $executedAt !== '' ? DateTimeImmutable::createFromFormat($this->platform->getDateTimeFormatString(), $executedAt) @@ -119,7 +148,8 @@ public function getExecutedMigrations(): ExecutedMigrationsList $migration = new ExecutedMigration( $version, $executedAt instanceof DateTimeImmutable ? $executedAt : null, - $executionTime + $executionTime, + $reason ); $migrations[(string) $version] = $migration;