-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: Martin Auswöger <[email protected]>
- Loading branch information
Showing
35 changed files
with
1,057 additions
and
335 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
<?php | ||
|
||
namespace Doctrine\DBAL\Platforms\MySQL; | ||
|
||
use Doctrine\DBAL\Platforms\MySQLPlatform; | ||
use Doctrine\DBAL\Schema\Comparator as BaseComparator; | ||
use Doctrine\DBAL\Schema\Table; | ||
|
||
use function array_diff_assoc; | ||
use function array_intersect_key; | ||
|
||
/** | ||
* Compares schemas in the context of MySQL platform. | ||
* | ||
* In MySQL, unless specified explicitly, the column's character set and collation are inherited from its containing | ||
* table. So during comparison, an omitted value and the value that matches the default value of table in the | ||
* desired schema must be considered equal. | ||
*/ | ||
class Comparator extends BaseComparator | ||
{ | ||
/** | ||
* @internal The comparator can be only instantiated by a schema manager. | ||
*/ | ||
public function __construct(MySQLPlatform $platform) | ||
{ | ||
parent::__construct($platform); | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
public function diffTable(Table $fromTable, Table $toTable) | ||
{ | ||
$defaults = array_intersect_key($fromTable->getOptions(), [ | ||
'charset' => null, | ||
'collation' => null, | ||
]); | ||
|
||
if ($defaults !== []) { | ||
$fromTable = clone $fromTable; | ||
$toTable = clone $toTable; | ||
|
||
$this->normalizeColumns($fromTable, $defaults); | ||
$this->normalizeColumns($toTable, $defaults); | ||
} | ||
|
||
return parent::diffTable($fromTable, $toTable); | ||
} | ||
|
||
/** | ||
* @param array<string,mixed> $defaults | ||
*/ | ||
private function normalizeColumns(Table $table, array $defaults): void | ||
{ | ||
foreach ($table->getColumns() as $column) { | ||
$options = $column->getPlatformOptions(); | ||
$diff = array_diff_assoc($options, $defaults); | ||
|
||
if ($diff === $options) { | ||
continue; | ||
} | ||
|
||
$column->setPlatformOptions($diff); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
<?php | ||
|
||
namespace Doctrine\DBAL\Platforms\SQLServer; | ||
|
||
use Doctrine\DBAL\Platforms\SQLServer2012Platform; | ||
use Doctrine\DBAL\Schema\Comparator as BaseComparator; | ||
use Doctrine\DBAL\Schema\Table; | ||
|
||
/** | ||
* Compares schemas in the context of SQL Server platform. | ||
* | ||
* @link https://docs.microsoft.com/en-us/sql/t-sql/statements/collations?view=sql-server-ver15 | ||
*/ | ||
class Comparator extends BaseComparator | ||
{ | ||
/** @var string */ | ||
private $databaseCollation; | ||
|
||
/** | ||
* @internal The comparator can be only instantiated by a schema manager. | ||
*/ | ||
public function __construct(SQLServer2012Platform $platform, string $databaseCollation) | ||
{ | ||
parent::__construct($platform); | ||
|
||
$this->databaseCollation = $databaseCollation; | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
public function diffTable(Table $fromTable, Table $toTable) | ||
{ | ||
$fromTable = clone $fromTable; | ||
$toTable = clone $toTable; | ||
|
||
$this->normalizeColumns($fromTable); | ||
$this->normalizeColumns($toTable); | ||
|
||
return parent::diffTable($fromTable, $toTable); | ||
} | ||
|
||
private function normalizeColumns(Table $table): void | ||
{ | ||
foreach ($table->getColumns() as $column) { | ||
$options = $column->getPlatformOptions(); | ||
|
||
if (! isset($options['collation']) || $options['collation'] !== $this->databaseCollation) { | ||
continue; | ||
} | ||
|
||
unset($options['collation']); | ||
$column->setPlatformOptions($options); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
<?php | ||
|
||
namespace Doctrine\DBAL\Platforms\SQLite; | ||
|
||
use Doctrine\DBAL\Platforms\SqlitePlatform; | ||
use Doctrine\DBAL\Schema\Comparator as BaseComparator; | ||
use Doctrine\DBAL\Schema\Table; | ||
|
||
use function strcasecmp; | ||
|
||
/** | ||
* Compares schemas in the context of SQLite platform. | ||
* | ||
* BINARY is the default column collation and should be ignored if specified explicitly. | ||
*/ | ||
class Comparator extends BaseComparator | ||
{ | ||
/** | ||
* @internal The comparator can be only instantiated by a schema manager. | ||
*/ | ||
public function __construct(SqlitePlatform $platform) | ||
{ | ||
parent::__construct($platform); | ||
} | ||
|
||
/** | ||
* {@inheritDoc} | ||
*/ | ||
public function diffTable(Table $fromTable, Table $toTable) | ||
{ | ||
$fromTable = clone $fromTable; | ||
$toTable = clone $toTable; | ||
|
||
$this->normalizeColumns($fromTable); | ||
$this->normalizeColumns($toTable); | ||
|
||
return parent::diffTable($fromTable, $toTable); | ||
} | ||
|
||
private function normalizeColumns(Table $table): void | ||
{ | ||
foreach ($table->getColumns() as $column) { | ||
$options = $column->getPlatformOptions(); | ||
|
||
if (! isset($options['collation']) || strcasecmp($options['collation'], 'binary') !== 0) { | ||
continue; | ||
} | ||
|
||
unset($options['collation']); | ||
$column->setPlatformOptions($options); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.