Skip to content

Commit 79f30d1

Browse files
sbuerkgeorgringer
authored andcommitted
[TASK] Adjust EnumType and SetType type schema handling
With `doctrine/dbal 4.2.0` the `enum` has been added directly in DBAL, implementing it slightly different than the original TYPO3 implementation, which has been mitigated with #105279 and adopted for the `set` type in advance with #105294. TYPO3 still needs to adopt the options reading existing database schema provided by a trait to the extended platform classes and missed to pass the `enum` and `set` option values as `values` to the `Column` objects instead as `platformOption` key, hidden by the fact that getting the array representation of a column merges the platformOptions on the same level with the direct value options. Upcoming `doctrine/dbal` introduces more phpdoc-block array shapes, narrowing down possible (allowed) array keys for `platformOptions` and failing with phpstan in core tests while not beeing a technical issue. This change adjusts related code within the `ext_tables.sql` related `TableBuilder` and the platform trait reading the values and setting it to `Column` objects as value property instead of `platformOption`. Considered as task and not as bugfix due to the fact that this is only static code analysis related and not technically breaking. Minor left-over in the `SetType` implementation for `doctrine/dbal 4.0` is removed along the way. Tested and extracted from doctrine/dbal 4.3.x test, see: https://review.typo3.org/c/Packages/TYPO3.CMS/+/88596 [1] doctrine/dbal#6536 [2] https://github.com/doctrine/dbal/releases/tag/4.2.0 Resolves: #106486 Related: #105294 Related: #105279 Releases: main, 13.4 Change-Id: Ib40d8d684fdce840e4050387416227d56e39698b Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/88905 Tested-by: core-ci <typo3@b13.com> Reviewed-by: Georg Ringer <georg.ringer@gmail.com> Reviewed-by: Garvin Hicking <gh@faktor-e.de> Tested-by: Garvin Hicking <gh@faktor-e.de> Tested-by: Georg Ringer <georg.ringer@gmail.com>
1 parent e191599 commit 79f30d1

File tree

6 files changed

+15
-25
lines changed

6 files changed

+15
-25
lines changed

typo3/sysext/core/Classes/Database/Schema/Parser/TableBuilder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,10 @@ protected function addColumn(CreateColumnDefinitionItem $item): Column
179179
}
180180

181181
if ($item->dataType instanceof SetDataType) {
182-
$column->setPlatformOption('values', $item->dataType->getValues());
182+
$column->setValues($item->dataType->getValues());
183183
}
184184
if ($item->dataType instanceof EnumDataType) {
185-
$column->setPlatformOption('values', $item->dataType->getValues());
185+
$column->setValues($item->dataType->getValues());
186186
}
187187

188188
if ($item->index) {

typo3/sysext/core/Classes/Database/Schema/SchemaManager/CustomDoctrineTypesColumnDefinitionTrait.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected function processCustomDoctrineTypesColumnDefinition(
8484
$doctrineType = $this->determineColumnType($dbType, $tableColumn);
8585

8686
$column = new Column($tableColumn['field'] ?? '', Type::getType($doctrineType), $options);
87-
$column->setPlatformOption('values', $this->getUnquotedEnumerationValues($tableColumn['type']));
87+
$column->setValues($this->getUnquotedEnumerationValues($tableColumn['type']));
8888

8989
return $column;
9090
}

typo3/sysext/core/Classes/Database/Schema/Types/SetType.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,4 @@ public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $pla
4848
return sprintf('SET(%s)', implode(', ', $quotedValues));
4949

5050
}
51-
52-
/**
53-
* Gets the name of this type.
54-
* @todo Remove this method with doctrine/dbal 4.0 upgrade.
55-
* @see https://github.com/doctrine/dbal/blob/3.8.x/UPGRADE.md#deprecated-typegetname
56-
*/
57-
public function getName(): string
58-
{
59-
return static::TYPE;
60-
}
6151
}

typo3/sysext/core/Tests/Unit/Database/Schema/SchemaManager/MySQLSchemaManagerTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ public function buildsColumnForEnumDataType(string $platform): void
7878
$column = $subject->callProcessCustomDoctrineTypesColumnDefinitionFromTraitDirectly(['Type' => "enum('value1', 'value2','value3')"]);
7979
self::assertInstanceOf(Column::class, $column);
8080
self::assertInstanceOf(EnumType::class, $column->getType());
81-
self::assertSame(['value1', 'value2', 'value3'], $column->getPlatformOption('values'));
81+
self::assertSame(['value1', 'value2', 'value3'], $column->getValues());
8282

8383
$column = $subject->callProtectedGetPortableTableColumnDefinition(['Type' => "enum('value1', 'value2','value3')"]);
8484
self::assertInstanceOf(EnumType::class, $column->getType());
85-
self::assertSame(['value1', 'value2', 'value3'], $column->getPlatformOption('values'));
85+
self::assertSame(['value1', 'value2', 'value3'], $column->getValues());
8686
}
8787

8888
#[DataProvider('platformDataProvider')]
@@ -103,11 +103,11 @@ public function buildsColumnForSetDataType(string $platform): void
103103
$column = $subject->callProcessCustomDoctrineTypesColumnDefinitionFromTraitDirectly(['Type' => "set('value1', 'value3')"]);
104104
self::assertInstanceOf(Column::class, $column);
105105
self::assertInstanceOf(SetType::class, $column->getType());
106-
self::assertSame(['value1', 'value3'], $column->getPlatformOption('values'));
106+
self::assertSame(['value1', 'value3'], $column->getValues());
107107

108108
$column = $subject->callProtectedGetPortableTableColumnDefinition(['Type' => "set('value1', 'value3')"]);
109109
self::assertInstanceOf(SetType::class, $column->getType());
110-
self::assertSame(['value1', 'value3'], $column->getPlatformOption('values'));
110+
self::assertSame(['value1', 'value3'], $column->getValues());
111111
}
112112
private function createSchemaManager(Connection $connection, DoctrineAbstractMySQLPlatform $platform): FixtureMySQLSchemaManager
113113
{

typo3/sysext/core/Tests/Unit/Database/Schema/SchemaManager/PostgreSQLSchemaManagerTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ public function buildsColumnForEnumDataType(string $platform): void
5959
$column = $subject->callProcessCustomDoctrineTypesColumnDefinitionFromTraitDirectly(['Type' => "enum('value1', 'value2','value3')"]);
6060
self::assertInstanceOf(Column::class, $column);
6161
self::assertInstanceOf(EnumType::class, $column->getType());
62-
self::assertSame(['value1', 'value2', 'value3'], $column->getPlatformOption('values'));
62+
self::assertSame(['value1', 'value2', 'value3'], $column->getValues());
6363

6464
$column = $subject->callProtectedGetPortableTableColumnDefinition(['Type' => "enum('value1', 'value2','value3')"]);
6565
self::assertInstanceOf(EnumType::class, $column->getType());
66-
self::assertSame(['value1', 'value2', 'value3'], $column->getPlatformOption('values'));
66+
self::assertSame(['value1', 'value2', 'value3'], $column->getValues());
6767
}
6868

6969
#[DataProvider('platformDataProvider')]
@@ -84,11 +84,11 @@ public function buildsColumnForSetDataType(string $platform): void
8484
$column = $subject->callProcessCustomDoctrineTypesColumnDefinitionFromTraitDirectly(['Type' => "set('value1', 'value3')"]);
8585
self::assertInstanceOf(Column::class, $column);
8686
self::assertInstanceOf(SetType::class, $column->getType());
87-
self::assertSame(['value1', 'value3'], $column->getPlatformOption('values'));
87+
self::assertSame(['value1', 'value3'], $column->getValues());
8888

8989
$column = $subject->callProtectedGetPortableTableColumnDefinition(['Type' => "set('value1', 'value3')"]);
9090
self::assertInstanceOf(SetType::class, $column->getType());
91-
self::assertSame(['value1', 'value3'], $column->getPlatformOption('values'));
91+
self::assertSame(['value1', 'value3'], $column->getValues());
9292
}
9393

9494
public static function platformDataProvider(): \Generator

typo3/sysext/core/Tests/Unit/Database/Schema/SchemaManager/SQLiteSchemaManagerTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ public function buildsColumnForEnumDataType(): void
5656
$column = $subject->callProcessCustomDoctrineTypesColumnDefinitionFromTraitDirectly(['Type' => "enum('value1', 'value2','value3')"]);
5757
self::assertInstanceOf(Column::class, $column);
5858
self::assertInstanceOf(EnumType::class, $column->getType());
59-
self::assertSame(['value1', 'value2', 'value3'], $column->getPlatformOption('values'));
59+
self::assertSame(['value1', 'value2', 'value3'], $column->getValues());
6060

6161
$column = $subject->callProtectedGetPortableTableColumnDefinition(['Type' => "enum('value1', 'value2','value3')"]);
6262
self::assertInstanceOf(EnumType::class, $column->getType());
63-
self::assertSame(['value1', 'value2', 'value3'], $column->getPlatformOption('values'));
63+
self::assertSame(['value1', 'value2', 'value3'], $column->getValues());
6464
}
6565

6666
#[Test]
@@ -80,11 +80,11 @@ public function buildsColumnForSetDataType(): void
8080
$column = $subject->callProcessCustomDoctrineTypesColumnDefinitionFromTraitDirectly(['Type' => "set('value1', 'value3')"]);
8181
self::assertInstanceOf(Column::class, $column);
8282
self::assertInstanceOf(SetType::class, $column->getType());
83-
self::assertSame(['value1', 'value3'], $column->getPlatformOption('values'));
83+
self::assertSame(['value1', 'value3'], $column->getValues());
8484

8585
$column = $subject->callProtectedGetPortableTableColumnDefinition(['Type' => "set('value1', 'value3')"]);
8686
self::assertInstanceOf(SetType::class, $column->getType());
87-
self::assertSame(['value1', 'value3'], $column->getPlatformOption('values'));
87+
self::assertSame(['value1', 'value3'], $column->getValues());
8888
}
8989

9090
private function createSchemaManager(Connection $connection, DoctrineSQLitePlatform $platform): FixtureSQLiteSchemaManager

0 commit comments

Comments
 (0)