295 lines
7.5 KiB
PHP
295 lines
7.5 KiB
PHP
<?php
|
|
|
|
namespace Doctrine\DBAL\Schema;
|
|
|
|
use Doctrine\DBAL\Platforms\AbstractPlatform;
|
|
use Doctrine\Deprecations\Deprecation;
|
|
|
|
use function array_filter;
|
|
use function array_merge;
|
|
use function count;
|
|
|
|
/**
|
|
* Differences between two schemas.
|
|
*
|
|
* The object contains the operations to change the schema stored in $fromSchema
|
|
* to a target schema.
|
|
*/
|
|
class SchemaDiff
|
|
{
|
|
/**
|
|
* @deprecated
|
|
*
|
|
* @var Schema|null
|
|
*/
|
|
public $fromSchema;
|
|
|
|
/**
|
|
* All added namespaces.
|
|
*
|
|
* @internal Use {@link getCreatedSchemas()} instead.
|
|
*
|
|
* @var string[]
|
|
*/
|
|
public $newNamespaces = [];
|
|
|
|
/**
|
|
* All removed namespaces.
|
|
*
|
|
* @internal Use {@link getDroppedSchemas()} instead.
|
|
*
|
|
* @var string[]
|
|
*/
|
|
public $removedNamespaces = [];
|
|
|
|
/**
|
|
* All added tables.
|
|
*
|
|
* @internal Use {@link getCreatedTables()} instead.
|
|
*
|
|
* @var Table[]
|
|
*/
|
|
public $newTables = [];
|
|
|
|
/**
|
|
* All changed tables.
|
|
*
|
|
* @internal Use {@link getAlteredTables()} instead.
|
|
*
|
|
* @var TableDiff[]
|
|
*/
|
|
public $changedTables = [];
|
|
|
|
/**
|
|
* All removed tables.
|
|
*
|
|
* @internal Use {@link getDroppedTables()} instead.
|
|
*
|
|
* @var Table[]
|
|
*/
|
|
public $removedTables = [];
|
|
|
|
/**
|
|
* @internal Use {@link getCreatedSequences()} instead.
|
|
*
|
|
* @var Sequence[]
|
|
*/
|
|
public $newSequences = [];
|
|
|
|
/**
|
|
* @internal Use {@link getAlteredSequences()} instead.
|
|
*
|
|
* @var Sequence[]
|
|
*/
|
|
public $changedSequences = [];
|
|
|
|
/**
|
|
* @internal Use {@link getDroppedSequences()} instead.
|
|
*
|
|
* @var Sequence[]
|
|
*/
|
|
public $removedSequences = [];
|
|
|
|
/**
|
|
* @deprecated
|
|
*
|
|
* @var ForeignKeyConstraint[]
|
|
*/
|
|
public $orphanedForeignKeys = [];
|
|
|
|
/**
|
|
* Constructs an SchemaDiff object.
|
|
*
|
|
* @internal The diff can be only instantiated by a {@see Comparator}.
|
|
*
|
|
* @param Table[] $newTables
|
|
* @param TableDiff[] $changedTables
|
|
* @param Table[] $removedTables
|
|
* @param array<string> $createdSchemas
|
|
* @param array<string> $droppedSchemas
|
|
* @param array<Sequence> $createdSequences
|
|
* @param array<Sequence> $alteredSequences
|
|
* @param array<Sequence> $droppedSequences
|
|
*/
|
|
public function __construct(
|
|
$newTables = [],
|
|
$changedTables = [],
|
|
$removedTables = [],
|
|
?Schema $fromSchema = null,
|
|
$createdSchemas = [],
|
|
$droppedSchemas = [],
|
|
$createdSequences = [],
|
|
$alteredSequences = [],
|
|
$droppedSequences = []
|
|
) {
|
|
$this->newTables = $newTables;
|
|
|
|
$this->changedTables = array_filter($changedTables, static function (TableDiff $diff): bool {
|
|
return ! $diff->isEmpty();
|
|
});
|
|
|
|
$this->removedTables = $removedTables;
|
|
$this->fromSchema = $fromSchema;
|
|
$this->newNamespaces = $createdSchemas;
|
|
$this->removedNamespaces = $droppedSchemas;
|
|
$this->newSequences = $createdSequences;
|
|
$this->changedSequences = $alteredSequences;
|
|
$this->removedSequences = $droppedSequences;
|
|
}
|
|
|
|
/** @return array<string> */
|
|
public function getCreatedSchemas(): array
|
|
{
|
|
return $this->newNamespaces;
|
|
}
|
|
|
|
/** @return array<string> */
|
|
public function getDroppedSchemas(): array
|
|
{
|
|
return $this->removedNamespaces;
|
|
}
|
|
|
|
/** @return array<Table> */
|
|
public function getCreatedTables(): array
|
|
{
|
|
return $this->newTables;
|
|
}
|
|
|
|
/** @return array<TableDiff> */
|
|
public function getAlteredTables(): array
|
|
{
|
|
return $this->changedTables;
|
|
}
|
|
|
|
/** @return array<Table> */
|
|
public function getDroppedTables(): array
|
|
{
|
|
return $this->removedTables;
|
|
}
|
|
|
|
/** @return array<Sequence> */
|
|
public function getCreatedSequences(): array
|
|
{
|
|
return $this->newSequences;
|
|
}
|
|
|
|
/** @return array<Sequence> */
|
|
public function getAlteredSequences(): array
|
|
{
|
|
return $this->changedSequences;
|
|
}
|
|
|
|
/** @return array<Sequence> */
|
|
public function getDroppedSequences(): array
|
|
{
|
|
return $this->removedSequences;
|
|
}
|
|
|
|
/**
|
|
* Returns whether the diff is empty (contains no changes).
|
|
*/
|
|
public function isEmpty(): bool
|
|
{
|
|
return count($this->newNamespaces) === 0
|
|
&& count($this->removedNamespaces) === 0
|
|
&& count($this->newTables) === 0
|
|
&& count($this->changedTables) === 0
|
|
&& count($this->removedTables) === 0
|
|
&& count($this->newSequences) === 0
|
|
&& count($this->changedSequences) === 0
|
|
&& count($this->removedSequences) === 0;
|
|
}
|
|
|
|
/**
|
|
* The to save sql mode ensures that the following things don't happen:
|
|
*
|
|
* 1. Tables are deleted
|
|
* 2. Sequences are deleted
|
|
* 3. Foreign Keys which reference tables that would otherwise be deleted.
|
|
*
|
|
* This way it is ensured that assets are deleted which might not be relevant to the metadata schema at all.
|
|
*
|
|
* @deprecated
|
|
*
|
|
* @return list<string>
|
|
*/
|
|
public function toSaveSql(AbstractPlatform $platform)
|
|
{
|
|
Deprecation::trigger(
|
|
'doctrine/dbal',
|
|
'https://github.com/doctrine/dbal/pull/5766',
|
|
'%s is deprecated.',
|
|
__METHOD__,
|
|
);
|
|
|
|
return $this->_toSql($platform, true);
|
|
}
|
|
|
|
/**
|
|
* @deprecated Use {@link AbstractPlatform::getAlterSchemaSQL()} instead.
|
|
*
|
|
* @return list<string>
|
|
*/
|
|
public function toSql(AbstractPlatform $platform)
|
|
{
|
|
Deprecation::triggerIfCalledFromOutside(
|
|
'doctrine/dbal',
|
|
'https://github.com/doctrine/dbal/pull/5766',
|
|
'%s is deprecated. Use AbstractPlatform::getAlterSchemaSQL() instead.',
|
|
__METHOD__,
|
|
);
|
|
|
|
return $this->_toSql($platform, false);
|
|
}
|
|
|
|
/**
|
|
* @param bool $saveMode
|
|
*
|
|
* @return list<string>
|
|
*/
|
|
protected function _toSql(AbstractPlatform $platform, $saveMode = false)
|
|
{
|
|
$sql = [];
|
|
|
|
if ($platform->supportsSchemas()) {
|
|
foreach ($this->getCreatedSchemas() as $schema) {
|
|
$sql[] = $platform->getCreateSchemaSQL($schema);
|
|
}
|
|
}
|
|
|
|
if ($platform->supportsForeignKeyConstraints() && $saveMode === false) {
|
|
foreach ($this->orphanedForeignKeys as $orphanedForeignKey) {
|
|
$sql[] = $platform->getDropForeignKeySQL($orphanedForeignKey, $orphanedForeignKey->getLocalTable());
|
|
}
|
|
}
|
|
|
|
if ($platform->supportsSequences() === true) {
|
|
foreach ($this->getAlteredSequences() as $sequence) {
|
|
$sql[] = $platform->getAlterSequenceSQL($sequence);
|
|
}
|
|
|
|
if ($saveMode === false) {
|
|
foreach ($this->getDroppedSequences() as $sequence) {
|
|
$sql[] = $platform->getDropSequenceSQL($sequence);
|
|
}
|
|
}
|
|
|
|
foreach ($this->getCreatedSequences() as $sequence) {
|
|
$sql[] = $platform->getCreateSequenceSQL($sequence);
|
|
}
|
|
}
|
|
|
|
$sql = array_merge($sql, $platform->getCreateTablesSQL($this->getCreatedTables()));
|
|
|
|
if ($saveMode === false) {
|
|
$sql = array_merge($sql, $platform->getDropTablesSQL($this->getDroppedTables()));
|
|
}
|
|
|
|
foreach ($this->getAlteredTables() as $tableDiff) {
|
|
$sql = array_merge($sql, $platform->getAlterTableSQL($tableDiff));
|
|
}
|
|
|
|
return $sql;
|
|
}
|
|
}
|