Skip to content

Commit 8c3e645

Browse files
committed
Use ColumnEditor for schema introspection
1 parent ea259d3 commit 8c3e645

File tree

6 files changed

+170
-208
lines changed

6 files changed

+170
-208
lines changed

src/Schema/DB2SchemaManager.php

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Doctrine\DBAL\Result;
99
use Doctrine\DBAL\Schema\Index\IndexType;
1010
use Doctrine\DBAL\Schema\Name\OptionallyQualifiedName;
11-
use Doctrine\DBAL\Types\Type;
1211
use Doctrine\DBAL\Types\Types;
1312

1413
use function array_change_key_case;
@@ -39,17 +38,8 @@ protected function _getPortableTableColumnDefinition(array $tableColumn): Column
3938
{
4039
$tableColumn = array_change_key_case($tableColumn, CASE_LOWER);
4140

42-
$length = $precision = $default = null;
43-
$scale = 0;
44-
$fixed = false;
45-
46-
if ($tableColumn['default'] !== null && $tableColumn['default'] !== 'NULL') {
47-
$default = $tableColumn['default'];
48-
49-
if (preg_match('/^\'(.*)\'$/s', $default, $matches) === 1) {
50-
$default = str_replace("''", "'", $matches[1]);
51-
}
52-
}
41+
$editor = Column::editor()
42+
->setQuotedName($tableColumn['colname']);
5343

5444
$type = $this->platform->getDoctrineTypeMapping($tableColumn['typename']);
5545

@@ -59,48 +49,56 @@ protected function _getPortableTableColumnDefinition(array $tableColumn): Column
5949
$type = Types::BINARY;
6050
}
6151

62-
$length = $tableColumn['length'];
52+
$editor->setLength($tableColumn['length']);
6353
break;
6454

6555
case 'character':
6656
if ($tableColumn['codepage'] === 0) {
6757
$type = Types::BINARY;
6858
}
6959

70-
$length = $tableColumn['length'];
71-
$fixed = true;
60+
$editor
61+
->setLength($tableColumn['length'])
62+
->setFixed(true);
7263
break;
7364

7465
case 'clob':
75-
$length = $tableColumn['length'];
66+
$editor->setLength($tableColumn['length']);
7667
break;
7768

7869
case 'decimal':
7970
case 'double':
8071
case 'real':
81-
$scale = $tableColumn['scale'];
82-
$precision = $tableColumn['length'];
72+
$editor
73+
->setPrecision($tableColumn['length'])
74+
->setScale($tableColumn['scale']);
8375
break;
8476
}
8577

86-
$options = [
87-
'length' => $length,
88-
'fixed' => $fixed,
89-
'default' => $default,
90-
'autoincrement' => $tableColumn['generated'] === 'D',
91-
'notnull' => $tableColumn['nulls'] === 'N',
92-
];
78+
$editor
79+
->setTypeName($type)
80+
->setNotNull($tableColumn['nulls'] === 'N')
81+
->setDefaultValue($this->parseDefaultExpression($tableColumn['default']))
82+
->setAutoincrement($tableColumn['generated'] === 'D');
9383

9484
if ($tableColumn['remarks'] !== null) {
95-
$options['comment'] = $tableColumn['remarks'];
85+
$editor->setComment($tableColumn['remarks']);
86+
}
87+
88+
return $editor->create();
89+
}
90+
91+
private function parseDefaultExpression(?string $expression): ?string
92+
{
93+
if ($expression === null || $expression === 'NULL') {
94+
return null;
9695
}
9796

98-
if ($scale !== null && $precision !== null) {
99-
$options['scale'] = $scale;
100-
$options['precision'] = $precision;
97+
if (preg_match('/^\'(.*)\'$/s', $expression, $matches) === 1) {
98+
return str_replace("''", "'", $matches[1]);
10199
}
102100

103-
return new Column($tableColumn['colname'], Type::getType($type), $options);
101+
return $expression;
104102
}
105103

106104
/**

src/Schema/MySQLSchemaManager.php

Lines changed: 34 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Doctrine\DBAL\Result;
1717
use Doctrine\DBAL\Schema\Index\IndexType;
1818
use Doctrine\DBAL\Schema\Name\OptionallyQualifiedName;
19-
use Doctrine\DBAL\Types\Type;
2019

2120
use function array_change_key_case;
2221
use function array_map;
@@ -111,59 +110,62 @@ protected function _getPortableTableColumnDefinition(array $tableColumn): Column
111110
{
112111
$tableColumn = array_change_key_case($tableColumn, CASE_LOWER);
113112

114-
$dbType = $tableColumn['data_type'];
115-
$length = null;
116-
$scale = 0;
117-
$precision = null;
118-
$fixed = false;
119-
$values = [];
113+
$dbType = $tableColumn['data_type'];
120114

121-
$type = $this->platform->getDoctrineTypeMapping($dbType);
115+
$editor = Column::editor()
116+
->setQuotedName($tableColumn['column_name'])
117+
->setTypeName(
118+
$this->platform->getDoctrineTypeMapping($dbType),
119+
);
120+
121+
if (str_contains($tableColumn['column_type'], 'unsigned')) {
122+
$editor->setUnsigned(true);
123+
}
122124

123125
switch ($dbType) {
124126
case 'char':
125127
case 'varchar':
126-
$length = $tableColumn['character_maximum_length'];
128+
$editor->setLength($tableColumn['character_maximum_length']);
127129
break;
128130

129131
case 'binary':
130132
case 'varbinary':
131-
$length = $tableColumn['character_octet_length'];
133+
$editor->setLength($tableColumn['character_octet_length']);
132134
break;
133135

134136
case 'tinytext':
135-
$length = AbstractMySQLPlatform::LENGTH_LIMIT_TINYTEXT;
137+
$editor->setLength(AbstractMySQLPlatform::LENGTH_LIMIT_TINYTEXT);
136138
break;
137139

138140
case 'text':
139-
$length = AbstractMySQLPlatform::LENGTH_LIMIT_TEXT;
141+
$editor->setLength(AbstractMySQLPlatform::LENGTH_LIMIT_TEXT);
140142
break;
141143

142144
case 'mediumtext':
143-
$length = AbstractMySQLPlatform::LENGTH_LIMIT_MEDIUMTEXT;
145+
$editor->setLength(AbstractMySQLPlatform::LENGTH_LIMIT_MEDIUMTEXT);
144146
break;
145147

146148
case 'tinyblob':
147-
$length = AbstractMySQLPlatform::LENGTH_LIMIT_TINYBLOB;
149+
$editor->setLength(AbstractMySQLPlatform::LENGTH_LIMIT_TINYBLOB);
148150
break;
149151

150152
case 'blob':
151-
$length = AbstractMySQLPlatform::LENGTH_LIMIT_BLOB;
153+
$editor->setLength(AbstractMySQLPlatform::LENGTH_LIMIT_BLOB);
152154
break;
153155

154156
case 'mediumblob':
155-
$length = AbstractMySQLPlatform::LENGTH_LIMIT_MEDIUMBLOB;
157+
$editor->setLength(AbstractMySQLPlatform::LENGTH_LIMIT_MEDIUMBLOB);
156158
break;
157159

158160
case 'float':
159161
case 'double':
160162
case 'real':
161163
case 'numeric':
162164
case 'decimal':
163-
$precision = $tableColumn['numeric_precision'];
165+
$editor->setPrecision($tableColumn['numeric_precision']);
164166

165167
if (isset($tableColumn['numeric_scale'])) {
166-
$scale = $tableColumn['numeric_scale'];
168+
$editor->setScale($tableColumn['numeric_scale']);
167169
}
168170

169171
break;
@@ -172,41 +174,32 @@ protected function _getPortableTableColumnDefinition(array $tableColumn): Column
172174
switch ($dbType) {
173175
case 'char':
174176
case 'binary':
175-
$fixed = true;
177+
$editor->setFixed(true);
176178
break;
177179

178180
case 'enum':
179-
$values = $this->parseEnumExpression($tableColumn['column_type']);
181+
$editor->setValues($this->parseEnumExpression($tableColumn['column_type']));
180182
break;
181183
}
182184

183185
if ($this->platform instanceof MariaDBPlatform) {
184-
$columnDefault = $this->getMariaDBColumnDefault($this->platform, $tableColumn['column_default']);
186+
$default = $this->getMariaDBColumnDefault($this->platform, $tableColumn['column_default']);
185187
} else {
186-
$columnDefault = $tableColumn['column_default'];
188+
$default = $tableColumn['column_default'];
187189
}
188190

189-
$options = [
190-
'length' => $length,
191-
'unsigned' => str_contains($tableColumn['column_type'], 'unsigned'),
192-
'fixed' => $fixed,
193-
'default' => $columnDefault,
194-
'notnull' => $tableColumn['is_nullable'] !== 'YES',
195-
'scale' => $scale,
196-
'precision' => $precision,
197-
'autoincrement' => str_contains($tableColumn['extra'], 'auto_increment'),
198-
'values' => $values,
199-
];
200-
201-
if ($tableColumn['column_comment'] !== null) {
202-
$options['comment'] = $tableColumn['column_comment'];
203-
}
191+
$editor
192+
->setDefaultValue($default)
193+
->setNotNull($tableColumn['is_nullable'] !== 'YES')
194+
->setComment($tableColumn['column_comment'])
195+
->setCharset($tableColumn['character_set_name'])
196+
->setCollation($tableColumn['collation_name']);
204197

205-
$column = new Column($tableColumn['column_name'], Type::getType($type), $options);
206-
$column->setPlatformOption('charset', $tableColumn['character_set_name']);
207-
$column->setPlatformOption('collation', $tableColumn['collation_name']);
198+
if (str_contains($tableColumn['extra'], 'auto_increment')) {
199+
$editor->setAutoincrement(true);
200+
}
208201

209-
return $column;
202+
return $editor->create();
210203
}
211204

212205
/** @return list<string> */

src/Schema/OracleSchemaManager.php

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,9 @@
1313
use Doctrine\DBAL\Schema\Name\OptionallyQualifiedName;
1414
use Doctrine\DBAL\Schema\Name\Parser;
1515
use Doctrine\DBAL\Schema\Name\Parsers;
16-
use Doctrine\DBAL\Types\Type;
1716

1817
use function array_change_key_case;
19-
use function array_key_exists;
2018
use function array_map;
21-
use function assert;
2219
use function implode;
2320
use function is_string;
2421
use function preg_match;
@@ -84,27 +81,11 @@ protected function _getPortableTableColumnDefinition(array $tableColumn): Column
8481
}
8582
}
8683

87-
$length = $precision = null;
88-
$scale = 0;
89-
$fixed = false;
84+
$editor = Column::editor()
85+
->setQuotedName($tableColumn['column_name']);
9086

91-
assert(array_key_exists('data_default', $tableColumn));
92-
93-
// Default values returned from database sometimes have trailing spaces.
94-
if (is_string($tableColumn['data_default'])) {
95-
$tableColumn['data_default'] = trim($tableColumn['data_default']);
96-
}
97-
98-
if ($tableColumn['data_default'] === '' || $tableColumn['data_default'] === 'NULL') {
99-
$tableColumn['data_default'] = null;
100-
}
101-
102-
if ($tableColumn['data_default'] !== null) {
103-
// Default values returned from database are represented as literal expressions
104-
if (preg_match('/^\'(.*)\'$/s', $tableColumn['data_default'], $matches) === 1) {
105-
$tableColumn['data_default'] = str_replace("''", "'", $matches[1]);
106-
}
107-
}
87+
$precision = null;
88+
$scale = 0;
10889

10990
if ($tableColumn['data_precision'] !== null) {
11091
$precision = (int) $tableColumn['data_precision'];
@@ -140,35 +121,54 @@ protected function _getPortableTableColumnDefinition(array $tableColumn): Column
140121
case 'varchar':
141122
case 'varchar2':
142123
case 'nvarchar2':
143-
$length = (int) $tableColumn['char_length'];
124+
$editor->setLength((int) $tableColumn['char_length']);
144125
break;
145126

146127
case 'raw':
147-
$length = (int) $tableColumn['data_length'];
148-
$fixed = true;
128+
$editor
129+
->setLength((int) $tableColumn['data_length'])
130+
->setFixed(true);
149131
break;
150132

151133
case 'char':
152134
case 'nchar':
153-
$length = (int) $tableColumn['char_length'];
154-
$fixed = true;
135+
$editor
136+
->setLength((int) $tableColumn['char_length'])
137+
->setFixed(true);
155138
break;
156139
}
157140

158-
$options = [
159-
'notnull' => $tableColumn['nullable'] === 'N',
160-
'fixed' => $fixed,
161-
'default' => $tableColumn['data_default'],
162-
'length' => $length,
163-
'precision' => $precision,
164-
'scale' => $scale,
165-
];
141+
$editor
142+
->setTypeName($type)
143+
->setPrecision($precision)
144+
->setScale($scale)
145+
->setNotNull($tableColumn['nullable'] === 'N')
146+
->setDefaultValue($this->parseDefaultExpression($tableColumn['data_default']));
166147

167148
if ($tableColumn['comments'] !== null) {
168-
$options['comment'] = $tableColumn['comments'];
149+
$editor->setComment($tableColumn['comments']);
150+
}
151+
152+
return $editor->create();
153+
}
154+
155+
private function parseDefaultExpression(?string $expression): ?string
156+
{
157+
// Default values returned from the database sometimes have trailing spaces.
158+
if (is_string($expression)) {
159+
$expression = trim($expression);
160+
}
161+
162+
if ($expression === null || $expression === 'NULL') {
163+
return null;
164+
}
165+
166+
// Default values returned from the database are represented as literal expressions
167+
if (preg_match('/^\'(.*)\'$/s', $expression, $matches) === 1) {
168+
return str_replace("''", "'", $matches[1]);
169169
}
170170

171-
return new Column($this->getQuotedIdentifierName($tableColumn['column_name']), Type::getType($type), $options);
171+
return $expression;
172172
}
173173

174174
/**

0 commit comments

Comments
 (0)