Skip to content

Commit e068b30

Browse files
committed
Fixes for postgres compat
1 parent 854c229 commit e068b30

File tree

4 files changed

+47
-15
lines changed

4 files changed

+47
-15
lines changed

src/Persistence/Db/Doctrine/Migration/CustomColumnDefinitionEventSubscriber.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function getSubscribedEvents()
2626

2727
public function onSchemaColumnDefinition(SchemaColumnDefinitionEventArgs $event)
2828
{
29-
$fieldType = $event->getTableColumn()['Type'];
29+
$fieldType = $event->getTableColumn()['Type'] ?? $event->getTableColumn()['type'];
3030

3131
if (stripos($fieldType, 'enum(') !== false) {
3232
$fieldValues = $this->parseEnumTypeToValues($fieldType);

src/Persistence/Db/Doctrine/Migration/DoctrineSchemaConverter.php

+16-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use Dms\Core\Persistence\Db\Schema\Table;
1414
use Dms\Core\Persistence\Db\Schema\Type;
1515
use Doctrine\DBAL\Schema\Schema;
16+
use Doctrine\DBAL\Platforms\AbstractPlatform;
17+
use Doctrine\DBAL\Platforms\MySqlPlatform;
1618
use Doctrine\DBAL\Schema\Table as DoctrineTable;
1719
use Doctrine\DBAL\Types\Type as DoctrineType;
1820

@@ -28,26 +30,27 @@ class DoctrineSchemaConverter
2830
* Converts the database to the equivalent doctrine schema.
2931
*
3032
* @param Database $database
33+
* @param AbstractPlatform $platform
3134
*
3235
* @return Schema
3336
*/
34-
public function convertToDoctrineSchema(Database $database) : \Doctrine\DBAL\Schema\Schema
37+
public function convertToDoctrineSchema(Database $database, AbstractPlatform $platform) : \Doctrine\DBAL\Schema\Schema
3538
{
3639
$schema = new Schema();
3740

3841
foreach ($database->getTables() as $table) {
39-
$this->mapTable($schema, $table);
42+
$this->mapTable($schema, $table, $platform);
4043
}
4144

4245
return $schema;
4346
}
4447

45-
private function mapTable(Schema $schema, Table $table)
48+
private function mapTable(Schema $schema, Table $table, AbstractPlatform $platform)
4649
{
4750
$doctrineTable = $schema->createTable($table->getName());
4851

4952
foreach ($table->getColumns() as $column) {
50-
$this->mapColumn($doctrineTable, $column);
53+
$this->mapColumn($doctrineTable, $column, $platform);
5154
}
5255

5356
if ($table->hasPrimaryKeyColumn()) {
@@ -102,9 +105,9 @@ private function mapForeignKeyMode($mode)
102105
ForeignKeyMode::validate($mode);
103106
}
104107

105-
private function mapColumn(DoctrineTable $doctrineTable, Column $column)
108+
private function mapColumn(DoctrineTable $doctrineTable, Column $column, AbstractPlatform $platform)
106109
{
107-
list($typeName, $options) = $this->mapColumnType($column->getType());
110+
list($typeName, $options) = $this->mapColumnType($column->getType(), $platform);
108111

109112
$doctrineTable->addColumn(
110113
$column->getName(),
@@ -113,7 +116,7 @@ private function mapColumn(DoctrineTable $doctrineTable, Column $column)
113116
);
114117
}
115118

116-
private function mapColumnType(Type\Type $type)
119+
private function mapColumnType(Type\Type $type, AbstractPlatform $platform)
117120
{
118121
$options = [];
119122

@@ -142,9 +145,14 @@ private function mapColumnType(Type\Type $type)
142145

143146
return [DoctrineType::DECIMAL, $options];
144147

145-
case $type instanceof Type\Enum:
148+
case $type instanceof Type\Enum && $platform instanceof MySqlPlatform:
146149
return [CustomEnumTypeGenerator::generate($type->getOptions()), $options];
147150

151+
case $type instanceof Type\Enum:
152+
$options['length'] = 255;
153+
154+
return [DoctrineType::STRING, $options];
155+
148156
case $type instanceof Type\Integer:
149157
$options['autoincrement'] = $type->isAutoIncrement();
150158
$options['unsigned'] = $type->isUnsigned();

src/Persistence/Db/Doctrine/Migration/MigrationGenerator.php

+6-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Dms\Core\Persistence\Db\Mapping\IOrm;
88
use Doctrine\DBAL\Schema\Comparator;
99
use Doctrine\DBAL\Schema\SchemaDiff;
10+
use Doctrine\DBAL\Platforms\MySqlPlatform;
1011

1112
/**
1213
* The migration generator base class.
@@ -40,11 +41,13 @@ public function generateMigration(DoctrineConnection $connection, IOrm $orm, str
4041
{
4142
$doctrine = $connection->getDoctrineConnection();
4243

43-
$doctrine->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
44-
$doctrine->getEventManager()->addEventSubscriber(new CustomColumnDefinitionEventSubscriber());
44+
if ($doctrine->getDatabasePlatform() instanceof MySqlPlatform) {
45+
$doctrine->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
46+
$doctrine->getEventManager()->addEventSubscriber(new CustomColumnDefinitionEventSubscriber());
47+
}
4548

4649
$currentSchema = $doctrine->getSchemaManager()->createSchema();
47-
$expectedSchema = $this->databaseConverter->convertToDoctrineSchema($orm->getDatabase());
50+
$expectedSchema = $this->databaseConverter->convertToDoctrineSchema($orm->getDatabase(), $doctrine->getDatabasePlatform());
4851

4952
$diff = Comparator::compareSchemas($currentSchema, $expectedSchema);
5053
$reverseDiff = Comparator::compareSchemas($expectedSchema, $currentSchema);

tests/Tests/Persistence/Db/Doctrine/Migration/DoctrineSchemaConverterTest.php

+24-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use Doctrine\DBAL\Schema\Schema;
66
use Doctrine\DBAL\Types\Type;
7+
use Doctrine\DBAL\Platforms\AbstractPlatform;
8+
use Doctrine\DBAL\Platforms\MySqlPlatform;
79
use Dms\Common\Testing\CmsTestCase;
810
use Dms\Core\Persistence\Db\Doctrine\Migration\CustomEnumTypeGenerator;
911
use Dms\Core\Persistence\Db\Doctrine\Migration\DoctrineSchemaConverter;
@@ -40,6 +42,7 @@ public function expectedConversions()
4042
[new Database([]), new Schema()],
4143
$this->tablesTest(),
4244
$this->columnTypesTest(),
45+
$this->enumForNonMySqlPlatform(),
4346
$this->foreignKeysTest(),
4447
$this->indexesTest(),
4548
];
@@ -48,10 +51,10 @@ public function expectedConversions()
4851
/**
4952
* @dataProvider expectedConversions
5053
*/
51-
public function testConvertsDatabaseCorrectly(Database $originalDb, Schema $expectedDoctrineSchema)
54+
public function testConvertsDatabaseCorrectly(Database $originalDb, Schema $expectedDoctrineSchema, string $platformClass = AbstractPlatform::class)
5255
{
5356
$converter = new DoctrineSchemaConverter();
54-
$actualDoctrineSchema = $converter->convertToDoctrineSchema($originalDb);
57+
$actualDoctrineSchema = $converter->convertToDoctrineSchema($originalDb, $this->getMockForAbstractClass($platformClass));
5558

5659
$this->assertEquals($expectedDoctrineSchema, $actualDoctrineSchema);
5760
}
@@ -150,7 +153,25 @@ private function columnTypesTest()
150153
$testTable->addColumn('blob_medium', Type::BLOB)->setLength(pow(2, 24) - 1);
151154
$testTable->addColumn('blob_long', Type::BLOB)->setLength(pow(2, 32) - 1);
152155

153-
return [$original, $expected];
156+
return [$original, $expected, MySqlPlatform::class];
157+
}
158+
159+
private function enumForNonMySqlPlatform()
160+
{
161+
$original = new Database([
162+
new Table('test', [
163+
new Column('enum_abc', new Enum(['a', 'b', 'c'])),
164+
new Column('enum_123', new Enum(['1', '2', '3'])),
165+
])
166+
]);
167+
168+
$expected = new Schema();
169+
$testTable = $expected->createTable('test');
170+
171+
$testTable->addColumn('enum_abc', Type::STRING)->setLength(255);
172+
$testTable->addColumn('enum_123', Type::STRING)->setLength(255);
173+
174+
return [$original, $expected, AbstractPlatform::class];
154175
}
155176

156177
public function foreignKeysTest()

0 commit comments

Comments
 (0)