Completed
Push — master ( 9aaed4...af3d52 )
by
unknown
04:30
created

CratePlatform   F

Complexity

Total Complexity 114

Size/Duplication

Total Lines 720
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 11

Test Coverage

Coverage 86.53%

Importance

Changes 0
Metric Value
wmc 114
lcom 2
cbo 11
dl 0
loc 720
ccs 212
cts 245
cp 0.8653
rs 3.9999
c 0
b 0
f 0

56 Methods

Rating   Name   Duplication   Size   Complexity  
A getSubstringExpression() 0 8 2
A getNowExpression() 0 4 1
A getRegexpExpression() 0 4 1
A getDateDiffExpression() 0 4 1
A supportsSequences() 0 4 1
A supportsSchemas() 0 4 1
A supportsIdentityColumns() 0 4 1
A supportsIndexes() 0 4 1
A supportsCommentOnStatement() 0 4 1
A supportsForeignKeyConstraints() 0 4 1
A supportsForeignKeyOnUpdate() 0 4 1
A supportsViews() 0 4 1
A prefersSequences() 0 4 1
A getListDatabasesSQL() 0 4 1
A getIndexDeclarationSQL() 0 11 2
A getBooleanTypeDeclarationSQL() 0 4 1
A getIntegerTypeDeclarationSQL() 0 4 1
A getBigIntTypeDeclarationSQL() 0 4 1
A getSmallIntTypeDeclarationSQL() 0 4 1
A getFloatDeclarationSQL() 0 4 1
A getDecimalTypeDeclarationSQL() 0 4 1
A getDateTimeTypeDeclarationSQL() 0 4 1
A getDateTimeTzTypeDeclarationSQL() 0 4 1
A getDateTypeDeclarationSQL() 0 4 1
A getTimeTypeDeclarationSQL() 0 4 1
A _getCommonIntegerTypeDeclarationSQL() 0 4 1
A getVarcharTypeDeclarationSQLSnippet() 0 4 1
A getArrayTypeDeclarationSQL() 0 5 2
A getName() 0 4 1
A getSQLResultCasing() 0 4 1
A getDateTimeTzFormatString() 0 4 1
A getDateTimeFormatString() 0 4 1
A getDateFormatString() 0 4 1
A getTimeFormatString() 0 4 1
A getTruncateTableSQL() 0 4 1
A getReadLockSQL() 0 4 1
A getVarcharMaxLength() 0 4 1
A getReservedKeywordsClass() 0 4 1
A getBlobTypeDeclarationSQL() 0 4 1
D getAlterTableSQL() 0 40 9
A getColumnDeclarationSQL() 0 11 2
B convertBooleans() 0 20 11
B getMapTypeDeclarationSQL() 0 14 5
A initializeDoctrineTypeMappings() 0 22 1
A getClobTypeDeclarationSQL() 0 4 1
A __construct() 0 12 3
A getListTablesSQL() 0 5 1
A getCreateDatabaseSQL() 0 4 1
A getDropDatabaseSQL() 0 4 1
A getCreateForeignKeySQL() 0 4 1
A getGuidTypeDeclarationSQL() 0 4 1
A getListTableColumnsSQL() 0 10 2
A getListTableConstraintsSQL() 0 10 2
C getCreateTableSQL() 0 77 17
C _getCreateTableSQL() 0 22 7
C prepareColumnData() 0 33 7

How to fix   Complexity   

Complex Class

Complex classes like CratePlatform often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use CratePlatform, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * Licensed to CRATE Technology GmbH("Crate") under one or more contributor
4
 * license agreements.  See the NOTICE file distributed with this work for
5
 * additional information regarding copyright ownership.  Crate licenses
6
 * this file to you under the Apache License, Version 2.0 (the "License");
7
 * you may not use this file except in compliance with the License.  You may
8
 * obtain a copy of the License at
9
 *
10
 * http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing, software
13
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
15
 * License for the specific language governing permissions and limitations
16
 * under the License.
17
 *
18
 * However, if you have executed another commercial license agreement
19
 * with Crate these terms will supersede the license and you may use the
20
 * software solely pursuant to the terms of the relevant commercial agreement.
21
 */
22
namespace Crate\DBAL\Platforms;
23
24
use Crate\DBAL\Types\MapType;
25
use Crate\DBAL\Types\TimestampType;
26
use Doctrine\DBAL\DBALException;
27
use Doctrine\DBAL\Event\SchemaCreateTableColumnEventArgs;
28
use Doctrine\DBAL\Event\SchemaCreateTableEventArgs;
29
use Doctrine\DBAL\Events;
30
use Doctrine\DBAL\Platforms\AbstractPlatform;
31
use Doctrine\DBAL\Schema\Identifier;
32
use Doctrine\DBAL\Schema\Index;
33
use Doctrine\DBAL\Schema\Table;
34
use Doctrine\DBAL\Schema\TableDiff;
35
use Doctrine\DBAL\Types\Type;
36
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
37
38
class CratePlatform extends AbstractPlatform
39
{
40
41
    const TIMESTAMP_FORMAT =  'Y-m-d\TH:i:s';
42
    const TIMESTAMP_FORMAT_TZ =  'Y-m-d\TH:i:sO';
43
44
    /**
45
     * {@inheritDoc}
46
     */
47 105
    public function __construct()
48
    {
49 105
        parent::__construct();
50 105
        $this->initializeDoctrineTypeMappings();
51 105
        if (!Type::hasType(MapType::NAME)) {
52
            Type::addType(MapType::NAME, 'Crate\DBAL\Types\MapType');
53
        }
54 105
        if (!Type::hasType(TimestampType::NAME)) {
55
            Type::addType(TimestampType::NAME, 'Crate\DBAL\Types\TimestampType');
56
        }
57 105
        Type::overrideType('array', 'Crate\DBAL\Types\ArrayType');
58 105
    }
59
60
    /**
61
     * {@inheritDoc}
62
     */
63 1
    public function getSubstringExpression($value, $from = 0, $length = null)
64
    {
65 1
        if ($length === null) {
66 1
            return 'SUBSTR(' . $value . ', ' . $from . ')';
67
        }
68
69 1
        return 'SUBSTR(' . $value . ', ' . $from . ', ' . $length . ')';
70
    }
71
72
    /**
73
     * {@inheritDoc}
74
     */
75 1
    public function getNowExpression()
76
    {
77 1
        throw DBALException::notSupported(__METHOD__);
78
    }
79
80
    /**
81
     * {@inheritDoc}
82
     */
83 1
    public function getRegexpExpression()
84
    {
85 1
        return 'LIKE';
86
    }
87
88
    /**
89
     * {@inheritDoc}
90
     */
91 1
    public function getDateDiffExpression($date1, $date2)
92
    {
93 1
        throw DBALException::notSupported(__METHOD__);
94
    }
95
96
    /**
97
     * {@inheritDoc}
98
     */
99 2
    public function supportsSequences()
100
    {
101 2
        return false;
102
    }
103
104
    /**
105
     * If we want to support Schemas, we need to implement 
106
     * getListNamespacesSQL and getCreateSchemaSQL methods
107
     * 
108
     * {@inheritDoc}
109
     */
110 2
    public function supportsSchemas()
111
    {
112 2
        return false;
113
    }
114
115
    /**
116
     * {@inheritDoc}
117
     */
118 1
    public function supportsIdentityColumns()
119
    {
120 1
        return true;
121
    }
122
123
    /**
124
     * {@inheritDoc}
125
     */
126 1
    public function supportsIndexes()
127
    {
128 1
        return false;
129
    }
130
131
    /**
132
     * {@inheritDoc}
133
     */
134 55
    public function supportsCommentOnStatement()
135
    {
136 55
        return false;
137
    }
138
139
    /**
140
     * {@inheritDoc}
141
     */
142 7
    public function supportsForeignKeyConstraints()
143
    {
144 7
        return false;
145
    }
146
147
    /**
148
     * {@inheritDoc}
149
     */
150 1
    public function supportsForeignKeyOnUpdate()
151
    {
152 1
        return false;
153
    }
154
155
    /**
156
     * {@inheritDoc}
157
     */
158 1
    public function supportsViews()
159
    {
160 1
        return false;
161
    }
162
163
    /**
164
     * {@inheritDoc}
165
     */
166 1
    public function prefersSequences()
167
    {
168 1
        return false;
169
    }
170
171
    /**
172
     * {@inheritDoc}
173
     */
174 1
    public function getListDatabasesSQL()
175
    {
176 1
        throw DBALException::notSupported(__METHOD__);
177
    }
178
179
    /**
180
     * {@inheritDoc}
181
     */
182
    public function getListTablesSQL()
183
    {
184
        return "SELECT table_name, schema_name FROM information_schema.tables " .
185
            "WHERE schema_name = 'doc' OR schema_name = 'blob'";
186
    }
187
188
    /**
189
     * {@inheritDoc}
190
     */
191
    public function getListTableColumnsSQL($table, $database = null)
192
    {
193
        $t = explode('.', $table);
194
        if (count($t) == 1) {
195
            array_unshift($t, 'doc');
196
        }
197
        // todo: make safe
198
        return "SELECT * from information_schema.columns " .
199
            "WHERE table_name = '$t[1]' AND schema_name = '$t[0]'";
200
    }
201
202
    /**
203
     * {@inheritDoc}
204
     */
205
    public function getListTableConstraintsSQL($table, $database = null)
0 ignored issues
show
Unused Code introduced by
The parameter $database is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
206
    {
207
        $t = explode('.', $table);
208
        if (count($t) == 1) {
209
            array_unshift($t, 'doc');
210
        }
211
        // todo: make safe
212
        return "SELECT constraint_name, constraint_type from information_schema.table_constraints " .
213
            "WHERE table_name = '$t[1]' AND schema_name = '$t[0]' AND constraint_type = 'PRIMARY_KEY'";
214
    }
215
216
    /**
217
     * {@inheritDoc}
218
     */
219 5
    public function getAlterTableSQL(TableDiff $diff)
220
    {
221 5
        $sql = array();
222 5
        $commentsSQL = array();
223 5
        $columnSql = array();
224
225 5
        foreach ($diff->addedColumns as $column) {
226 2
            if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) {
227
                continue;
228
            }
229
230 2
            $query = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray());
231 2
            $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query;
232 2
            if ($comment = $this->getColumnComment($column)) {
233 2
                $commentsSQL[] = $this->getCommentOnColumnSQL($diff->name, $column->getName(), $comment);
234
            }
235
        }
236
237 5
        if (count($diff->removedColumns) > 0) {
238
            throw DBALException::notSupported("Alter Table: drop columns");
239
        }
240 5
        if (count($diff->changedColumns) > 0) {
241
            throw DBALException::notSupported("Alter Table: change column options");
242
        }
243 5
        if (count($diff->renamedColumns) > 0) {
244
            throw DBALException::notSupported("Alter Table: rename columns");
245
        }
246
247 5
        $tableSql = array();
248
249 5
        if (!$this->onSchemaAlterTable($diff, $tableSql)) {
250 5
            if ($diff->newName !== false) {
251
                throw DBALException::notSupported("Alter Table: rename table");
252
            }
253
254 5
            $sql = array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff), $commentsSQL);
255
        }
256
257 5
        return array_merge($sql, $tableSql, $columnSql);
258
    }
259
260
    /**
261
     * {@inheritDoc}
262
     */
263 58
    public function getColumnDeclarationSQL($name, array $field)
264
    {
265 58
        if (isset($field['columnDefinition'])) {
266 34
            $columnDef = $this->getCustomTypeDeclarationSQL($field);
267
        } else {
268 57
            $typeDecl = $field['type']->getSqlDeclaration($field, $this);
269 57
            $columnDef = $typeDecl;
270
        }
271
272 58
        return $name . ' ' . $columnDef;
273
    }
274
275
    /**
276
     * Generate table index column declaration
277
     * @codeCoverageIgnore
278
     */
279
    public function getIndexDeclarationSQL($name, Index $index)
280
    {
281
        $columns = $index->getQuotedColumns($this);
282
        $name = new Identifier($name);
283
284
        if (count($columns) == 0) {
285
            throw new \InvalidArgumentException("Incomplete definition. 'columns' required.");
286
        }
287
288
        return 'INDEX ' . $name->getQuotedName($this) . ' USING FULLTEXT ('. $this->getIndexFieldDeclarationListSQL($columns) . ')';
289
    }
290
291
    /**
292
     * {@inheritDoc}
293
     *
294
     * Crate wants boolean values converted to the strings 'true'/'false'.
295
     */
296 2
    public function convertBooleans($item)
297
    {
298 2
        if (is_array($item)) {
299 1
            foreach ($item as $key => $value) {
300 1
                if (is_bool($value)) {
301 1
                    $item[$key] = ($value) ? 'true' : 'false';
302 1
                } elseif (is_numeric($value)) {
303 1
                    $item[$key] = ($value > 0) ? 'true' : 'false';
304
                }
305
            }
306
        } else {
307 2
            if (is_bool($item)) {
308 2
                $item = ($item) ? 'true' : 'false';
309 1
            } elseif (is_numeric($item)) {
310 1
                $item = ($item > 0) ? 'true' : 'false';
311
            }
312
        }
313
314 2
        return $item;
315
    }
316
317
    /**
318
     * {@inheritDoc}
319
     */
320 1
    public function getBooleanTypeDeclarationSQL(array $field)
321
    {
322 1
        return 'BOOLEAN';
323
    }
324
325
    /**
326
     * {@inheritDoc}
327
     */
328 53
    public function getIntegerTypeDeclarationSQL(array $field)
329
    {
330 53
        return 'INTEGER';
331
    }
332
333
    /**
334
     * {@inheritDoc}
335
     */
336 1
    public function getBigIntTypeDeclarationSQL(array $field)
337
    {
338 1
        return 'LONG';
339
    }
340
341
    /**
342
     * {@inheritDoc}
343
     */
344 1
    public function getSmallIntTypeDeclarationSQL(array $field)
345
    {
346 1
        return 'SHORT';
347
    }
348
349
    /**
350
     * {@inheritDoc}
351
     */
352 34
    public function getFloatDeclarationSQL(array $field)
353
    {
354 34
        return 'DOUBLE';
355
    }
356
357
    /**
358
     * {@inheritDoc}
359
     */
360
    public function getDecimalTypeDeclarationSQL(array $columnDef)
361
    {
362
        return 'DOUBLE';
363
    }
364
365
    /**
366
     * {@inheritDoc}
367
     */
368 24
    public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration)
369
    {
370 24
        return 'TIMESTAMP';
371
    }
372
373
    /**
374
     * {@inheritDoc}
375
     */
376 1
    public function getDateTimeTzTypeDeclarationSQL(array $fieldDeclaration)
377
    {
378 1
        return 'TIMESTAMP';
379
    }
380
381
    /**
382
     * {@inheritDoc}
383
     */
384 1
    public function getDateTypeDeclarationSQL(array $fieldDeclaration)
385
    {
386 1
        return 'TIMESTAMP';
387
    }
388
389
    /**
390
     * {@inheritDoc}
391
     */
392 1
    public function getTimeTypeDeclarationSQL(array $fieldDeclaration)
393
    {
394 1
        return 'TIMESTAMP';
395
    }
396
397
    /**
398
     * {@inheritDoc}
399
     */
400
    protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef)
401
    {
402
        return '';
403
    }
404
405
    /**
406
     * {@inheritDoc}
407
     */
408 52
    protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed)
409
    {
410 52
        return 'STRING';
411
    }
412
413
    /**
414
     * {@inheritDoc}
415
     */
416 1
    public function getClobTypeDeclarationSQL(array $field)
417
    {
418 1
        return 'STRING';
419
    }
420
421
    /**
422
     * Gets the SQL snippet used to declare an OBJECT column type.
423
     *
424
     * @param array $field
425
     *
426
     * @return string
427
     */
428 36
    public function getMapTypeDeclarationSQL(array $field, array $options)
0 ignored issues
show
Unused Code introduced by
The parameter $field is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
429
    {
430 36
        $type = array_key_exists('type', $options) ? $options['type'] : MapType::DYNAMIC;
431
432 36
        $fields = array_key_exists('fields', $options) ? $options['fields'] : array();
433 36
        $columns = array();
434 36
        foreach ($fields as $field) {
435 35
            $columns[$field->getQuotedName($this)] = $this->prepareColumnData($field);
436
        }
437 36
        $objectFields = $this->getColumnDeclarationListSQL($columns);
438
439 36
        $declaration = count($columns) > 0 ? ' AS ( ' . $objectFields . ' )' : '';
440 36
        return 'OBJECT ( ' . $type . ' )' . $declaration ;
441
    }
442
443
    /**
444
     * Gets the SQL snippet used to declare an ARRAY column type.
445
     *
446
     * @param array $field
447
     *
448
     * @return string
449
     */
450 4
    public function getArrayTypeDeclarationSQL(array $field, array $options)
451
    {
452 4
        $type = array_key_exists('type', $options) ? $options['type'] : Type::STRING;
453 4
        return 'ARRAY ( ' . Type::getType($type)->getSQLDeclaration($field, $this) . ' )';
454
    }
455
456
    /**
457
     * {@inheritDoc}
458
     */
459 2
    public function getName()
460
    {
461 2
        return 'crate';
462
    }
463
464
    /**
465
     * {@inheritDoc}
466
     *
467
     * PostgreSQL returns all column names in SQL result sets in lowercase.
468
     */
469 1
    public function getSQLResultCasing($column)
470
    {
471 1
        return strtolower($column);
472
    }
473
474
    /**
475
     * {@inheritDoc}
476
     */
477 2
    public function getDateTimeTzFormatString()
478
    {
479 2
        return self::TIMESTAMP_FORMAT_TZ;
480
    }
481
482
    /**
483
     * {@inheritDoc}
484
     */
485 5
    public function getDateTimeFormatString()
486
    {
487 5
        return self::TIMESTAMP_FORMAT;
488
    }
489
490
    /**
491
     * {@inheritDoc}
492
     */
493 1
    public function getDateFormatString()
494
    {
495 1
        return self::TIMESTAMP_FORMAT;
496
    }
497
498
    /**
499
     * {@inheritDoc}
500
     */
501 1
    public function getTimeFormatString()
502
    {
503 1
        return self::TIMESTAMP_FORMAT;
504
    }
505
506
    /**
507
     * {@inheritDoc}
508
     */
509 1
    public function getTruncateTableSQL($tableName, $cascade = false)
510
    {
511 1
        throw DBALException::notSupported(__METHOD__);
512
    }
513
514
    /**
515
     * {@inheritDoc}
516
     */
517 1
    public function getReadLockSQL()
518
    {
519 1
        throw DBALException::notSupported(__METHOD__);
520
    }
521
522
    /**
523
     * {@inheritDoc}
524
     */
525 105
    protected function initializeDoctrineTypeMappings()
526
    {
527 105
        $this->doctrineTypeMapping = array(
528
            'short'         => 'smallint',
529
            'integer'       => 'integer',
530
            'long'          => 'bigint',
531
            'int'           => 'integer',
532
            'bool'          => 'boolean',
533
            'boolean'       => 'boolean',
534
            'string'        => 'string',
535
            'float'         => 'float',
536
            'double'        => 'float',
537
            'timestamp'     => 'timestamp',
538
            'object'        => 'map',
539
            'string_array'  => 'array',
540
            'float_array'   => 'array',
541
            'double_array'  => 'array',
542
            'integer_array' => 'array',
543
            'object_array'  => 'array',
544
            'array'         => 'array',
545
        );
546 105
    }
547
548
    /**
549
     * {@inheritDoc}
550
     */
551 52
    public function getVarcharMaxLength()
552
    {
553 52
        return PHP_INT_MAX;
554
    }
555
556
    /**
557
     * {@inheritDoc}
558
     */
559 25
    protected function getReservedKeywordsClass()
560
    {
561 25
        return 'Crate\DBAL\Platforms\Keywords\CrateKeywords';
562
    }
563
564
    /**
565
     * {@inheritDoc}
566
     */
567 1
    public function getBlobTypeDeclarationSQL(array $field)
568
    {
569 1
        throw DBALException::notSupported(__METHOD__);
570
    }
571
572
    /**
573
     * {@inheritDoc}
574
     * Gets the SQL statement(s) to create a table with the specified name, columns and constraints
575
     * on this platform.
576
     *
577
     * @param Table $table The name of the table.
578
     * @param integer $createFlags
579
     *
580
     * @return array The sequence of SQL statements.
581
     */
582 57
    public function getCreateTableSQL(Table $table, $createFlags = self::CREATE_INDEXES)
583
    {
584 57
        if (!is_int($createFlags)) {
585
            $msg = "Second argument of CratePlatform::getCreateTableSQL() has to be integer.";
586
            throw new \InvalidArgumentException($msg);
587
        }
588
589 57
        if (count($table->getColumns()) === 0) {
590 2
            throw DBALException::noColumnsSpecifiedForTable($table->getName());
591
        }
592
593 55
        $tableName = $table->getQuotedName($this);
594 55
        $options = $table->getOptions();
595 55
        $options['uniqueConstraints'] = array();
596 55
        $options['indexes'] = array();
597 55
        $options['primary'] = array();
598
599 55
        if (($createFlags&self::CREATE_INDEXES) > 0) {
600 55
            foreach ($table->getIndexes() as $index) {
601
                /* @var $index Index */
602 40
                if ($index->isPrimary()) {
603 37
                    $platform = $this;
604 37
                    $options['primary'] = array_map(function ($columnName) use ($table, $platform) {
605 37
                        return $table->getColumn($columnName)->getQuotedName($platform);
606 37
                    }, $index->getColumns());
607 37
                    $options['primary_index'] = $index;
608 3
                } else if ($index->isUnique()) {
609 1
                    throw DBALException::notSupported("Unique constraints are not supported. Use `primary key` instead");
610
                } else {
611 39
                    $options['indexes'][$index->getName()] = $index;
612
                }
613
            }
614
        }
615
616 54
        $columnSql = array();
617 54
        $columns = array();
618
619 54
        foreach ($table->getColumns() as $column) {
620 54
            if (null !== $this->_eventManager &&
621 54
                $this->_eventManager->hasListeners(Events::onSchemaCreateTableColumn)) {
622
623 1
                $eventArgs = new SchemaCreateTableColumnEventArgs($column, $table, $this);
624 1
                $this->_eventManager->dispatchEvent(Events::onSchemaCreateTableColumn, $eventArgs);
625
626 1
                $columnSql = array_merge($columnSql, $eventArgs->getSql());
627
628 1
                if ($eventArgs->isDefaultPrevented()) {
629
                    continue;
630
                }
631
            }
632 54
            $columns[$column->getQuotedName($this)] = $this->prepareColumnData($column, $options['primary']);
0 ignored issues
show
Bug introduced by
It seems like $options['primary'] can also be of type object<Doctrine\DBAL\Schema\Index>; however, Crate\DBAL\Platforms\Cra...rm::prepareColumnData() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
633
        }
634
635 53
        if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaCreateTable)) {
636 1
            $eventArgs = new SchemaCreateTableEventArgs($table, $columns, $options, $this);
637 1
            $this->_eventManager->dispatchEvent(Events::onSchemaCreateTable, $eventArgs);
638
639 1
            if ($eventArgs->isDefaultPrevented()) {
640
                return array_merge($eventArgs->getSql(), $columnSql);
641
            }
642
        }
643
644 53
        $sql = $this->_getCreateTableSQL($tableName, $columns, $options);
645 53
        if ($this->supportsCommentOnStatement()) {
646
            foreach ($table->getColumns() as $column) {
647
                if ($this->getColumnComment($column)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getColumnComment($column) of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
648
                    $sql[] = $this->getCommentOnColumnSQL(
649
                        $tableName,
650
                        $column->getName(),
651
                        $this->getColumnComment($column)
652
                    );
653
                }
654
            }
655
        }
656
657 53
        return array_merge($sql, $columnSql);
658
    }
659
660
    /**
661
     * {@inheritDoc}
662
     */
663 53
    protected function _getCreateTableSQL($tableName, array $columns, array $options = array())
664
    {
665 53
        $columnListSql = $this->getColumnDeclarationListSQL($columns);
666
667 53
        if (isset($options['primary']) && ! empty($options['primary'])) {
668 37
            $keyColumns = array_unique(array_values($options['primary']));
669 37
            $columnListSql .= ', PRIMARY KEY(' . implode(', ', $keyColumns) . ')';
670
        }
671
672 53
        if (isset($options['indexes']) && ! empty($options['indexes'])) {
673 2
            foreach ($options['indexes'] as $index => $definition) {
674 2
                $columnListSql .= ', ' . $this->getIndexDeclarationSQL($index, $definition);
675
            }
676
        }
677
 
678 53
        if (isset($options['foreignKeys'])) {
679
            throw DBALException::notSupported("Create Table: foreign keys");
680
        }
681
682 53
        $query = 'CREATE TABLE ' . $tableName . ' (' . $columnListSql . ')';
683 53
        return array($query);
684
    }
685
686
    /**
687
     * @param \Doctrine\DBAL\Schema\Column $column The name of the table.
688
     * @param array List of primary key column names
689
     *
690
     * @return array The column data as associative array.
691
     */
692 56
    public function prepareColumnData($column, $primaries = array())
693
    {
694 56
        if ($column->hasCustomSchemaOption("unique") ? $column->getCustomSchemaOption("unique") : false) {
695 1
            throw DBALException::notSupported("Unique constraints are not supported. Use `primary key` instead");
696
        }
697
698 55
        $columnData = array();
699 55
        $columnData['name'] = $column->getQuotedName($this);
700 55
        $columnData['type'] = $column->getType();
701 55
        $columnData['length'] = $column->getLength();
702 55
        $columnData['notnull'] = $column->getNotNull();
703 55
        $columnData['fixed'] = $column->getFixed();
704 55
        $columnData['unique'] = false;
705 55
        $columnData['version'] = $column->hasPlatformOption("version") ? $column->getPlatformOption("version") : false;
706
707 55
        if (strtolower($columnData['type']) == "string" && $columnData['length'] === null) {
708 46
            $columnData['length'] = 255;
709
        }
710
711 55
        $columnData['unsigned'] = $column->getUnsigned();
712 55
        $columnData['precision'] = $column->getPrecision();
713 55
        $columnData['scale'] = $column->getScale();
714 55
        $columnData['default'] = $column->getDefault();
715 55
        $columnData['columnDefinition'] = $column->getColumnDefinition();
716 55
        $columnData['autoincrement'] = $column->getAutoincrement();
717 55
        $columnData['comment'] = $this->getColumnComment($column);
718 55
        $columnData['platformOptions'] = $column->getPlatformOptions();
719
720 55
        if (in_array($column->getName(), $primaries)) {
721 36
            $columnData['primary'] = true;
722
        }
723 55
        return $columnData;
724
    }
725
726
    /**
727
     * {@inheritDoc}
728
     */
729 1
    public function getCreateDatabaseSQL($database)
730
    {
731 1
        throw DBALException::notSupported(__METHOD__);
732
    }
733
734
    /**
735
     * {@inheritDoc}
736
     */
737 1
    public function getDropDatabaseSQL($database)
738
    {
739 1
        throw DBALException::notSupported(__METHOD__);
740
    }
741
    
742
    /**
743
     * {@inheritDoc}
744
     */
745 1
    public function getCreateForeignKeySQL(ForeignKeyConstraint $foreignKey, $table)
746
    {
747 1
        throw DBALException::notSupported(__METHOD__);
748
    }
749
    
750
    /**
751
     * {@inheritDoc}
752
     */
753 1
    public function getGuidTypeDeclarationSQL(array $field)
754
    {
755 1
        throw DBALException::notSupported(__METHOD__);
756
    }
757
}
758