Issues (291)

tests/TDBMAbstractServiceTest.php (8 issues)

1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 Copyright (C) 2006-2014 David Négrier - THE CODING MACHINE
7
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 2 of the License, or
11
(at your option) any later version.
12
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
18
You should have received a copy of the GNU General Public License
19
along with this program; if not, write to the Free Software
20
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21
*/
22
23
namespace TheCodingMachine\TDBM;
24
25
use DateTime;
26
use DateTimeImmutable;
27
use Doctrine\Common\Cache\ArrayCache;
28
use Doctrine\DBAL\Connection;
29
use Doctrine\DBAL\Platforms\MySQLPlatform;
30
use Doctrine\DBAL\Platforms\OraclePlatform;
31
use Doctrine\DBAL\Types\Type;
32
use Doctrine\DBAL\Types\Types;
33
use PHPUnit\Framework\TestCase;
34
use TheCodingMachine\FluidSchema\TdbmFluidSchema;
35
use TheCodingMachine\TDBM\Fixtures\Interfaces\TestUserDaoInterface;
36
use TheCodingMachine\TDBM\Fixtures\Interfaces\TestUserInterface;
37
use TheCodingMachine\TDBM\Fixtures\Traits\TestOtherUserTrait;
38
use TheCodingMachine\TDBM\Fixtures\Traits\TestUserDaoTrait;
39
use TheCodingMachine\TDBM\Fixtures\Traits\TestUserTrait;
40
use TheCodingMachine\TDBM\Utils\Annotation\AnnotationParser;
41
use TheCodingMachine\TDBM\Utils\DefaultNamingStrategy;
42
use TheCodingMachine\TDBM\Utils\PathFinder\PathFinder;
43
44
use function stripos;
45
46
abstract class TDBMAbstractServiceTest extends TestCase
47
{
48
    /**
49
     * @var Connection
50
     */
51
    protected static $dbConnection;
52
53
    /**
54
     * @var TDBMService
55
     */
56
    protected $tdbmService;
57
58
    /**
59
     * @var DummyGeneratorListener
60
     */
61
    private $dummyGeneratorListener;
62
63
    /**
64
     * @var ConfigurationInterface
65
     */
66
    private $configuration;
67
68
    /**
69
     * @var ArrayCache
70
     */
71
    private static $cache;
72
73
    public static function setUpBeforeClass(): void
74
    {
75
        self::resetConnection();
76
77
        self::$cache = new ArrayCache();
0 ignored issues
show
Deprecated Code introduced by
The class Doctrine\Common\Cache\ArrayCache has been deprecated: Deprecated without replacement in doctrine/cache 1.11. This class will be dropped in 2.0 ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

77
        self::$cache = /** @scrutinizer ignore-deprecated */ new ArrayCache();
Loading history...
78
79
        $dbConnection = ConnectionFactory::resetDatabase(
80
            $GLOBALS['db_driver'],
81
            $GLOBALS['db_host'] ?? null,
82
            $GLOBALS['db_port'] ?? null,
83
            $GLOBALS['db_username'] ?? null,
84
            $GLOBALS['db_admin_username'] ?? null,
85
            $GLOBALS['db_password'] ?? null,
86
            $GLOBALS['db_name'] ?? null
87
        );
88
89
        self::$dbConnection = $dbConnection;
90
91
        self::initSchema($dbConnection);
92
    }
93
94
    private static function resetConnection(): void
95
    {
96
        if (self::$dbConnection !== null) {
97
            self::$dbConnection->close();
98
        }
99
        self::$dbConnection = null;
100
    }
101
102
    protected static function getConnection(): Connection
103
    {
104
        if (self::$dbConnection === null) {
105
            self::$dbConnection = ConnectionFactory::createConnection(
106
                $GLOBALS['db_driver'],
107
                $GLOBALS['db_host'] ?? null,
108
                $GLOBALS['db_port'] ?? null,
109
                $GLOBALS['db_username'] ?? null,
110
                $GLOBALS['db_password'] ?? null,
111
                $GLOBALS['db_name'] ?? null
112
            );
113
        }
114
        return self::$dbConnection;
115
    }
116
117
    protected function onlyMySql()
118
    {
119
        if (!self::getConnection()->getDatabasePlatform() instanceof MySqlPlatform) {
120
            $this->markTestSkipped('MySQL specific test');
121
        }
122
    }
123
124
    protected function setUp(): void
125
    {
126
        $this->tdbmService = new TDBMService($this->getConfiguration());
127
    }
128
129
    protected function getDummyGeneratorListener(): DummyGeneratorListener
130
    {
131
        if ($this->dummyGeneratorListener === null) {
132
            $this->dummyGeneratorListener = new DummyGeneratorListener();
133
        }
134
        return $this->dummyGeneratorListener;
135
    }
136
137
    protected function getCache(): ArrayCache
138
    {
139
        return self::$cache;
140
    }
141
142
    protected function getConfiguration(): ConfigurationInterface
143
    {
144
        if ($this->configuration === null) {
145
            $this->configuration = new Configuration('TheCodingMachine\\TDBM\\Test\\Dao\\Bean', 'TheCodingMachine\\TDBM\\Test\\Dao', self::getConnection(), $this->getNamingStrategy(), $this->getCache(), null, null, [$this->getDummyGeneratorListener()]);
146
            $this->configuration->setPathFinder(new PathFinder(null, dirname(__DIR__, 4)));
147
        }
148
        return $this->configuration;
149
    }
150
151
    protected function getNamingStrategy()
152
    {
153
        $strategy = new DefaultNamingStrategy(AnnotationParser::buildWithDefaultAnnotations([]), self::getConnection()->getSchemaManager());
0 ignored issues
show
Deprecated Code introduced by
The function Doctrine\DBAL\Connection::getSchemaManager() has been deprecated: Use {@see createSchemaManager()} instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

153
        $strategy = new DefaultNamingStrategy(AnnotationParser::buildWithDefaultAnnotations([]), /** @scrutinizer ignore-deprecated */ self::getConnection()->getSchemaManager());

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
154
        $strategy->setBeanPrefix('');
155
        $strategy->setBeanSuffix('Bean');
156
        $strategy->setBaseBeanPrefix('');
157
        $strategy->setBaseBeanSuffix('BaseBean');
158
        $strategy->setDaoPrefix('');
159
        $strategy->setDaoSuffix('Dao');
160
        $strategy->setBaseDaoPrefix('');
161
        $strategy->setBaseDaoSuffix('BaseDao');
162
163
        return $strategy;
164
    }
165
166
    private static function initSchema(Connection $connection): void
167
    {
168
        $fromSchema = $connection->createSchemaManager()->createSchema();
0 ignored issues
show
Deprecated Code introduced by
The function Doctrine\DBAL\Schema\Abs...Manager::createSchema() has been deprecated: Use {@link introspectSchema()} instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

168
        $fromSchema = /** @scrutinizer ignore-deprecated */ $connection->createSchemaManager()->createSchema();

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
169
        $toSchema = clone $fromSchema;
170
171
        $db = new TdbmFluidSchema($toSchema, new \TheCodingMachine\FluidSchema\DefaultNamingStrategy($connection->getDatabasePlatform()));
172
173
        $db->table('country')
174
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
175
            ->column('label')->string(255)->unique();
176
177
        $db->table('person')
178
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
179
            ->column('name')->string(255);
180
181
        if ($connection->getDatabasePlatform() instanceof OraclePlatform) {
182
            $toSchema->getTable($connection->quoteIdentifier('person'))
183
                ->addColumn(
184
                    $connection->quoteIdentifier('created_at'),
185
                    'datetime',
186
                    ['columnDefinition' => 'TIMESTAMP(0) DEFAULT SYSDATE NOT NULL']
187
                );
188
        } else {
189
            $toSchema->getTable('person')
190
                ->addColumn(
191
                    $connection->quoteIdentifier('created_at'),
192
                    'datetime',
193
                    ['columnDefinition' => 'timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP']
194
                );
195
        }
196
197
        $db->table('person')
198
            ->column('modified_at')->datetime()->null()->index()
199
            ->column('order')->integer()->null();
200
201
202
        $db->table('contact')
203
            ->extends('person')
204
            ->column('email')->string(255)
205
            ->column('manager_id')->references('contact')->null();
206
207
        $db->table('users')
208
            ->addAnnotation('AddTrait', ['name' => TestUserTrait::class], false)
209
            ->addAnnotation('AddTrait', ['name' => TestOtherUserTrait::class, 'modifiers' => ['\\' . TestOtherUserTrait::class . '::method1 insteadof \\' . TestUserTrait::class, '\\' . TestUserTrait::class . '::method1 as method1renamed']], false)
210
            ->addAnnotation('AddTraitOnDao', ['name' => TestUserDaoTrait::class], false)
211
            ->implementsInterface(TestUserInterface::class)
212
            ->implementsInterfaceOnDao(TestUserDaoInterface::class)
213
            ->extends('contact')
214
            ->column('login')->string(255)
215
            ->column('password')->string(255)->null()
216
            ->column('status')->string(10)->null()->default(null)
217
            ->column('country_id')->references('country')
218
            // Used to test generation for a column that starts with a digit
219
            ->then()->column('3d_view')->boolean()->default(true);
220
221
        $db->table('rights')
222
            ->column('label')->string(255)->primaryKey()->comment('Non autoincrementable primary key');
223
224
        $db->table('roles')
225
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
226
            ->column('name')->string(255)
227
            ->column('created_at')->date()->null()
228
            ->column('status')->boolean()->null()->default(1);
229
230
        $db->table('roles_rights')
231
            ->column('role_id')->references('roles')
232
            ->column('right_label')->references('rights')->then()
233
            ->primaryKey(['role_id', 'right_label']);
234
235
        $db->table('users_roles')
236
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
237
            ->column('user_id')->references('users')
238
            ->column('role_id')->references('roles');
239
240
        $db->table('all_nullable')
241
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
242
            ->column('label')->string(255)->null()
243
            ->column('country_id')->references('country')->null();
244
245
        $db->table('animal')
246
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
247
            ->column('name')->string(45)->index()
248
            ->column('UPPERCASE_COLUMN')->string(45)->null()
249
            ->column('order')->integer()->null();
250
251
        $db->table('dog')
252
            ->extends('animal')
253
            ->column('race')->string(45)->null();
254
255
        $db->table('cat')
256
            ->extends('animal')
257
            ->column('cuteness_level')->integer()->null();
258
259
        $db->table('panda')
260
            ->extends('animal')
261
            ->column('weight')->float()->null();
262
263
        $db->table('boats')
264
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
265
            ->column('name')->string(255)
266
            ->column('anchorage_country')->references('country')->notNull()->then()
267
            ->column('current_country')->references('country')->null()->then()
268
            ->column('length')->decimal(10, 2)->null()->then()
269
            ->unique(['anchorage_country', 'name']);
270
271
        $db->table('sailed_countries')
272
            ->column('boat_id')->references('boats')
273
            ->column('country_id')->references('country')
274
            ->then()->primaryKey(['boat_id', 'country_id']);
275
276
        $db->table('category')
277
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
278
            ->column('label')->string(255)
279
            ->column('parent_id')->references('category')->null();
280
281
        $db->table('article')
282
            ->column('id')->string(36)->primaryKey()->comment('@UUID')
283
            ->column('content')->string(255)
284
            ->column('author_id')->references('users')->null()
285
            ->column('attachment')->blob()->null();
286
287
        $db->table('article2')
288
            ->column('id')->string(36)->primaryKey()->comment('@UUID v4')
289
            ->column('content')->string(255);
290
291
        $db->table('files')
292
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
293
            ->column('file')->blob()
294
            ->column('md5')->string()->null()->comment("@ProtectedGetter\n@ProtectedSetter")
295
            ->column('article_id')->references('article')->null()->comment("@ProtectedGetter\n@ProtectedSetter\n@ProtectedOneToMany");
296
297
        $toSchema->getTable('users')
298
            ->addUniqueIndex([$connection->quoteIdentifier('login')], 'users_login_idx')
299
            ->addIndex([$connection->quoteIdentifier('status'), $connection->quoteIdentifier('country_id')], 'users_status_country_idx');
300
301
        // We create the same index twice
302
        // except for Oracle that won't let us create twice the same index.
303
        if (!$connection->getDatabasePlatform() instanceof OraclePlatform) {
304
            $toSchema->getTable('users')
305
                ->addUniqueIndex([$connection->quoteIdentifier('login')], 'users_login_idx_2');
306
        }
307
308
        // A table with a foreign key that references a non primary key.
309
        $db->table('ref_no_prim_key')
310
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment('@Autoincrement')
311
            ->column('from')->string(50)
312
            ->column('to')->string(50)->unique();
313
314
        $toSchema->getTable($connection->quoteIdentifier('ref_no_prim_key'))->addForeignKeyConstraint($connection->quoteIdentifier('ref_no_prim_key'), [$connection->quoteIdentifier('from')], [$connection->quoteIdentifier('to')]);
315
316
        // A table with multiple primary keys.
317
        $db->table('states')
318
            ->column('country_id')->references('country')
319
            ->column('code')->string(3)
320
            ->column('name')->string(50)->then()
321
            ->primaryKey(['country_id', 'code']);
322
323
        // Tables using @Json annotations
324
        $db->table('accounts')
325
            ->column('id')->integer()->primaryKey()->autoIncrement()->notNull()
326
            ->column('name')->string();
327
328
        $db->table('nodes')
329
            ->column('id')->integer()->primaryKey()->autoIncrement()->comment("@JsonIgnore\n@Autoincrement")
330
            ->column('alias_id')->references('nodes')->null()->comment('@JsonRecursive')
331
            ->column('parent_id')->references('nodes')->null()->comment('@JsonInclude')
332
            ->column('root_id')->references('nodes')->null()->comment('@JsonIgnore')
333
            ->column('owner_id')->references('accounts')->null()->comment('@JsonFormat(property="name") @JsonInclude')
334
            ->column('name')->string()->comment('@JsonKey("basename")')
335
            ->column('size')->integer()->notNull()->default(0)->comment('@JsonFormat(unit=" o")')
336
            ->column('weight')->float()->null()->comment('@JsonFormat(decimals=2,unit="g")')
337
            ->column('created_at')->date()->null()->comment('@JsonFormat("Y-m-d")');
338
339
        $db->table('nodes_guests')
340
            ->column('node_id')->references('nodes')->comment('@JsonIgnore')
341
            ->column('guest_id')->references('accounts')->comment('@JsonKey("guests") @JsonFormat(method="getName")');
342
343
        $db->table('node_entries')
344
            ->column('id')->integer()->primaryKey()->autoIncrement()
345
            ->column('node_id')->references('nodes')->comment('@JsonCollection("entries") @JsonFormat(property="entry")')
346
            ->column('entry')->string()->null();
347
348
        $db->table('artists')
0 ignored issues
show
Deprecated Code introduced by
The function TheCodingMachine\FluidSc...dbmFluidColumn::array() has been deprecated: Use json() instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

348
        /** @scrutinizer ignore-deprecated */ $db->table('artists')

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
349
            ->column('id')->integer()->primaryKey()->autoIncrement()
350
            ->column('children')->array()->null() //used to test conflicts with autopivot
351
            ->column('name')->string();
352
353
        $db->table('albums')
354
            ->column('id')->integer()->primaryKey()->autoIncrement()
355
            ->column('artist_id')->references('artists')->comment('@JsonCollection(key="discography")')
356
            ->column('account_id')->references('accounts')
357
            ->column('node_id')->references('nodes')->null()
358
            ->column('title')->string()
359
            ->then()->unique(['artist_id', 'account_id'])->unique(['artist_id', 'node_id']);
360
361
        $db->table('tracks')
362
            ->column('id')->integer()->primaryKey()->autoIncrement()
363
            ->column('album_id')->references('albums')->comment('@JsonCollection @JsonRecursive')
364
            ->column('title')->string()
365
            ->column('duration')->time()->comment('@JsonFormat("H:i:s")');
366
367
        $db->table('featuring')
368
            ->column('id')->integer()->primaryKey()->autoIncrement()
369
            ->column('track_id')->references('tracks')
370
            ->column('artist_id')->references('artists')->comment('@JsonKey("feat") @JsonInclude');
371
372
        $db->table('artists_relations') //used to test the auto pivot case
373
            ->column('id')->integer()->primaryKey()->autoIncrement()
374
            ->column('parent_id')->references('artists')
375
            ->column('child_id')->references('artists');
376
377
        $db->table('children') //used to test conflicts with autopivot
378
            ->column('id')->integer()->primaryKey()->autoIncrement()
379
            ->column('artist_id')->references('artists');
380
381
        $db->junctionTable('person', 'boats');
382
383
        if (!$connection->getDatabasePlatform() instanceof OraclePlatform) {
384
            $db->table('base_objects')
385
                ->column('id')->integer()->primaryKey()->autoIncrement()
386
                ->column('label')->string();
387
            $db->table('inherited_objects')
388
                ->column('id')->integer()->primaryKey()->autoIncrement()
389
                ->column('base_object_id')->references('base_objects')->unique()->comment('@JsonCollection');
390
        }
391
392
        $db->table('composite_fk_target_reference')
393
            ->column('id')->integer()->primaryKey()->autoIncrement()
394
            ->column('label')->string();
395
396
        $targetTable = $db->table('composite_fk_target')
397
            ->column('id_1')->references('composite_fk_target_reference')
398
            ->column('id_2')->integer()
399
            ->then()->primaryKey(['id_1', 'id_2']);
400
        $db->table('composite_fk_source')
401
            ->column('id')->integer()->primaryKey()->autoIncrement()
402
            ->column('fk_1')->integer()
403
            ->column('fk_2')->integer()
404
            ->then()->getDbalTable()->addForeignKeyConstraint($targetTable->getDbalTable(), [$connection->quoteIdentifier('fk_1'), $connection->quoteIdentifier('fk_2')], [$connection->quoteIdentifier('id_1'), $connection->quoteIdentifier('id_2')]);
405
406
        // Test case, the problem here is:
407
        // - `inheritance_agency` have an FK to `inheritance_society.**id_entity**`
408
        // - `inheritance_society` have an FK to `inheritance_entity.**id**`
409
        $db->table('inheritance_entity')
410
            ->column('id')->integer()->primaryKey()->autoIncrement();
411
        $db->table('inheritance_society')
412
            ->column('id_entity')->references('inheritance_entity')->primaryKey()
413
            ->then();
414
        $db->table('inheritance_agency')
415
            ->column('id')->integer()->primaryKey()->autoIncrement()
416
            ->column('id_parent_society')->references('inheritance_society');
417
418
        // Uppercase table and column names:
419
        if (!$connection->getDatabasePlatform() instanceof OraclePlatform) {
420
            $db->table('UPPERCASE_A')
421
                ->column('id')->integer()->primaryKey()->autoIncrement();
422
423
            $db->table('UPPERCASE_B')
424
                ->column('id')->integer()->primaryKey()->autoIncrement()
425
                ->column('UNIQUE_UPPERCASE_A_ID')->references('UPPERCASE_A')->unique();
426
427
            $db->table('UPPERCASE_A')
428
                ->column('UPPERCASE_B_ID')->references('UPPERCASE_B');
429
        }
430
431
        // Reserved keywords from https://dev.mysql.com/doc/refman/8.0/en/keywords.html
432
        // and https://docs.oracle.com/cd/B19306_01/em.102/b40103/app_oracle_reserved_words.htm
433
        $db->table('values')
434
            ->column('key')->integer()->primaryKey()->autoIncrement();
435
436
        $db->table('accessible')
437
            ->column('add')->integer()->primaryKey()->autoIncrement();
438
439
        $db->table('all')
440
            ->column('analyze')->references('values')
441
            ->column('and')->references('accessible');
442
443
        $sqlStmts = $toSchema->getMigrateFromSql($fromSchema, $connection->getDatabasePlatform());
0 ignored issues
show
Deprecated Code introduced by
The function Doctrine\DBAL\Schema\Schema::getMigrateFromSql() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

443
        $sqlStmts = /** @scrutinizer ignore-deprecated */ $toSchema->getMigrateFromSql($fromSchema, $connection->getDatabasePlatform());
Loading history...
444
445
        foreach ($sqlStmts as $sqlStmt) {
446
            //echo $sqlStmt."\n";
447
            $connection->exec($sqlStmt);
0 ignored issues
show
Deprecated Code introduced by
The function Doctrine\DBAL\Connection::exec() has been deprecated: please use {@see executeStatement()} instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

447
            /** @scrutinizer ignore-deprecated */ $connection->exec($sqlStmt);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
448
        }
449
450
        // Let's generate computed columns
451
        if ($connection->getDatabasePlatform() instanceof MySqlPlatform && !self::isMariaDb($connection)) {
452
            $connection->exec('CREATE TABLE `players` (
0 ignored issues
show
Deprecated Code introduced by
The function Doctrine\DBAL\Connection::exec() has been deprecated: please use {@see executeStatement()} instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

452
            /** @scrutinizer ignore-deprecated */ $connection->exec('CREATE TABLE `players` (

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
453
               `id` INT UNSIGNED AUTO_INCREMENT NOT NULL,
454
               `player_and_games` JSON NOT NULL,
455
               `names_virtual` VARCHAR(20) GENERATED ALWAYS AS (`player_and_games` ->> \'$.name\') NOT NULL COMMENT \'@ReadOnly\',
456
               `animal_id` INT COMMENT \'@ReadOnly\',
457
               PRIMARY KEY (`id`),
458
               FOREIGN KEY (animal_id) REFERENCES animal(id)
459
            );
460
            ');
461
        }
462
463
        self::insert($connection, 'country', [
464
            'label' => 'France',
465
        ]);
466
        self::insert($connection, 'country', [
467
            'label' => 'uk',
468
        ]);
469
        self::insert($connection, 'country', [
470
            'label' => 'Jamaica',
471
        ]);
472
473
        self::insert($connection, 'person', [
474
            'name' => 'John Smith',
475
            'created_at' => '2015-10-24 11:57:13',
476
        ]);
477
        self::insert($connection, 'person', [
478
            'name' => 'Jean Dupont',
479
            'created_at' => '2015-10-24 11:57:13',
480
        ]);
481
        self::insert($connection, 'person', [
482
            'name' => 'Robert Marley',
483
            'created_at' => '2015-10-24 11:57:13',
484
        ]);
485
        self::insert($connection, 'person', [
486
            'name' => 'Bill Shakespeare',
487
            'created_at' => '2015-10-24 11:57:13',
488
        ]);
489
490
        self::insert($connection, 'contact', [
491
            'id' => 1,
492
            'email' => '[email protected]',
493
            'manager_id' => null,
494
        ]);
495
        self::insert($connection, 'contact', [
496
            'id' => 2,
497
            'email' => '[email protected]',
498
            'manager_id' => null,
499
        ]);
500
        self::insert($connection, 'contact', [
501
            'id' => 3,
502
            'email' => '[email protected]',
503
            'manager_id' => null,
504
        ]);
505
        self::insert($connection, 'contact', [
506
            'id' => 4,
507
            'email' => '[email protected]',
508
            'manager_id' => 1,
509
        ]);
510
511
        self::insert($connection, 'rights', [
512
            'label' => 'CAN_SING',
513
        ]);
514
        self::insert($connection, 'rights', [
515
            'label' => 'CAN_WRITE',
516
        ]);
517
518
        self::insert($connection, 'roles', [
519
            'name' => 'Admins',
520
            'created_at' => '2015-10-24'
521
        ]);
522
        self::insert($connection, 'roles', [
523
            'name' => 'Writers',
524
            'created_at' => '2015-10-24'
525
        ]);
526
        self::insert($connection, 'roles', [
527
            'name' => 'Singers',
528
            'created_at' => '2015-10-24'
529
        ]);
530
531
        self::insert($connection, 'roles_rights', [
532
            'role_id' => 1,
533
            'right_label' => 'CAN_SING'
534
        ]);
535
        self::insert($connection, 'roles_rights', [
536
            'role_id' => 3,
537
            'right_label' => 'CAN_SING'
538
        ]);
539
        self::insert($connection, 'roles_rights', [
540
            'role_id' => 1,
541
            'right_label' => 'CAN_WRITE'
542
        ]);
543
        self::insert($connection, 'roles_rights', [
544
            'role_id' => 2,
545
            'right_label' => 'CAN_WRITE'
546
        ]);
547
548
        self::insert($connection, 'users', [
549
            'id' => 1,
550
            'login' => 'john.smith',
551
            'password' => null,
552
            'status' => 'on',
553
            'country_id' => 2
554
        ]);
555
        self::insert($connection, 'users', [
556
            'id' => 2,
557
            'login' => 'jean.dupont',
558
            'password' => null,
559
            'status' => 'on',
560
            'country_id' => 1
561
        ]);
562
        self::insert($connection, 'users', [
563
            'id' => 3,
564
            'login' => 'robert.marley',
565
            'password' => null,
566
            'status' => 'off',
567
            'country_id' => 3
568
        ]);
569
        self::insert($connection, 'users', [
570
            'id' => 4,
571
            'login' => 'bill.shakespeare',
572
            'password' => null,
573
            'status' => 'off',
574
            'country_id' => 2
575
        ]);
576
577
        self::insert($connection, 'users_roles', [
578
            'user_id' => 1,
579
            'role_id' => 1,
580
        ]);
581
        self::insert($connection, 'users_roles', [
582
            'user_id' => 2,
583
            'role_id' => 1,
584
        ]);
585
        self::insert($connection, 'users_roles', [
586
            'user_id' => 3,
587
            'role_id' => 3,
588
        ]);
589
        self::insert($connection, 'users_roles', [
590
            'user_id' => 4,
591
            'role_id' => 2,
592
        ]);
593
        self::insert($connection, 'users_roles', [
594
            'user_id' => 3,
595
            'role_id' => 2,
596
        ]);
597
598
        self::insert($connection, 'ref_no_prim_key', [
599
            'from' => 'foo',
600
            'to' => 'foo',
601
        ]);
602
603
        self::insert($connection, 'accounts', [
604
            'id' => 1,
605
            'name' => 'root'
606
        ]);
607
        self::insert($connection, 'accounts', [
608
            'id' => 2,
609
            'name' => 'user'
610
        ]);
611
        self::insert($connection, 'accounts', [
612
            'id' => 3,
613
            'name' => 'www'
614
        ]);
615
        self::insert($connection, 'nodes', [
616
            'id' => 1,
617
            'owner_id' => 1,
618
            'name' => '/',
619
            'created_at' => (new DateTime('last year'))->format('Y-m-d 00:00:00'),
620
        ]);
621
        self::insert($connection, 'nodes', [
622
            'id' => 2,
623
            'name' => 'private',
624
            'created_at' => (new DateTime('last year'))->format('Y-m-d 00:00:00'),
625
            'parent_id' => 1,
626
        ]);
627
        self::insert($connection, 'nodes', [
628
            'id' => 3,
629
            'name' => 'var',
630
            'created_at' => (new DateTime('last year'))->format('Y-m-d 00:00:00'),
631
            'parent_id' => 2,
632
        ]);
633
        self::insert($connection, 'nodes', [
634
            'id' => 4,
635
            'name' => 'var',
636
            'created_at' => (new DateTime('last year'))->format('Y-m-d 00:00:00'),
637
            'parent_id' => 1,
638
            'alias_id' => 3
639
        ]);
640
        self::insert($connection, 'nodes', [
641
            'id' => 5,
642
            'name' => 'www',
643
            'created_at' => (new DateTime('last week'))->format('Y-m-d 00:00:00'),
644
            'parent_id' => 4
645
        ]);
646
        self::insert($connection, 'nodes', [
647
            'id' => 6,
648
            'owner_id' => 2,
649
            'name' => 'index.html',
650
            'created_at' => (new DateTime('now'))->format('Y-m-d 00:00:00'),
651
            'size' => 512,
652
            'weight' => 42.5,
653
            'parent_id' => 5
654
        ]);
655
        self::insert($connection, 'nodes', [
656
            'id' => 7,
657
            'name' => 'index.html',
658
            'created_at' => (new DateTime('now'))->format('Y-m-d 00:00:00'),
659
            'alias_id' => 6,
660
            'parent_id' => 1
661
        ]);
662
        self::insert($connection, 'nodes', [
663
            'id' => 8,
664
            'name' => 'index.htm',
665
            'created_at' => (new DateTime('now'))->format('Y-m-d 00:00:00'),
666
            'alias_id' => 7,
667
            'parent_id' => 1
668
        ]);
669
        self::insert($connection, 'nodes_guests', [
670
            'node_id' => 6,
671
            'guest_id' => 1
672
        ]);
673
        self::insert($connection, 'nodes_guests', [
674
            'node_id' => 6,
675
            'guest_id' => 3
676
        ]);
677
        self::insert($connection, 'node_entries', [
678
            'node_id' => 6,
679
            'entry' => '<h1>'
680
        ]);
681
        self::insert($connection, 'node_entries', [
682
            'node_id' => 6,
683
            'entry' => 'Hello, World'
684
        ]);
685
        self::insert($connection, 'node_entries', [
686
            'node_id' => 6,
687
            'entry' => '</h1>'
688
        ]);
689
690
691
        self::insert($connection, 'artists', [
692
            'id' => 1,
693
            'name' => 'Pink Floyd'
694
        ]);
695
        self::insert($connection, 'artists', [
696
            'id' => 2,
697
            'name' => 'Roger Waters'
698
        ]);
699
        self::insert($connection, 'artists', [
700
            'id' => 3,
701
            'name' => 'David Gilmour'
702
        ]);
703
        self::insert($connection, 'albums', [
704
            'id' => 1,
705
            'artist_id' => 1,
706
            'account_id' => 1,
707
            'title' => 'Animals'
708
        ]);
709
        self::insert($connection, 'artists_relations', [
710
            'parent_id' => 1,
711
            'child_id' => 2
712
        ]);
713
714
        $timeType = Type::getType(Types::TIME_IMMUTABLE);
715
716
        self::insert($connection, 'tracks', [
717
            'album_id' => 1,
718
            'title' => 'Pigs on the Wing 1',
719
            // Note: Oracle does not have a TIME column type
720
            'duration' => $timeType->convertToDatabaseValue(new DateTimeImmutable('1970-01-01 00:01:25'), $connection->getDatabasePlatform()),
721
        ]);
722
        self::insert($connection, 'tracks', [
723
            'album_id' => 1,
724
            'title' => 'Dogs',
725
            'duration' => $timeType->convertToDatabaseValue(new DateTimeImmutable('1970-01-01 00:17:04'), $connection->getDatabasePlatform()),
726
        ]);
727
        self::insert($connection, 'tracks', [
728
            'album_id' => 1,
729
            'title' => 'Pigs (Three Different Ones)',
730
            'duration' => $timeType->convertToDatabaseValue(new DateTimeImmutable('1970-01-01 00:11:22'), $connection->getDatabasePlatform()),
731
        ]);
732
        self::insert($connection, 'tracks', [
733
            'album_id' => 1,
734
            'title' => 'Sheep',
735
            'duration' => $timeType->convertToDatabaseValue(new DateTimeImmutable('1970-01-01 00:10:24'), $connection->getDatabasePlatform()),
736
        ]);
737
        self::insert($connection, 'tracks', [
738
            'album_id' => 1,
739
            'title' => 'Pigs on the Wing 2',
740
            'duration' => $timeType->convertToDatabaseValue(new DateTimeImmutable('1970-01-01 00:01:26'), $connection->getDatabasePlatform()),
741
        ]);
742
        self::insert($connection, 'featuring', [
743
            'track_id' => 1,
744
            'artist_id' => 2
745
        ]);
746
        self::insert($connection, 'featuring', [
747
            'track_id' => 2,
748
            'artist_id' => 3
749
        ]);
750
        self::insert($connection, 'featuring', [
751
            'track_id' => 2,
752
            'artist_id' => 2
753
        ]);
754
        self::insert($connection, 'featuring', [
755
            'track_id' => 3,
756
            'artist_id' => 2
757
        ]);
758
        self::insert($connection, 'featuring', [
759
            'track_id' => 4,
760
            'artist_id' => 2
761
        ]);
762
        self::insert($connection, 'featuring', [
763
            'track_id' => 5,
764
            'artist_id' => 2
765
        ]);
766
767
        self::insert($connection, 'boats', [
768
            'name' => 'RoseBud',
769
            'anchorage_country' => 1,
770
            'current_country' => 1,
771
            'length' => '13.5',
772
        ]);
773
774
        self::insert($connection, 'person_boats', [
775
            'person_id' => 1,
776
            'boat_id' => 1,
777
        ]);
778
        self::insert($connection, 'composite_fk_target_reference', [
779
            'id' => 1,
780
            'label' => 'test'
781
        ]);
782
        self::insert($connection, 'composite_fk_target', [
783
            'id_1' => 1,
784
            'id_2' => 1
785
        ]);
786
        self::insert($connection, 'composite_fk_source', [
787
            'id' => 1,
788
            'fk_1' => 1,
789
            'fk_2' => 1
790
        ]);
791
792
        self::insert($connection, 'values', ['key' => 1]);
793
        self::insert($connection, 'accessible', ['add' => 1]);
794
        self::insert($connection, 'all', ['analyze' => 1, 'and' => 1]);
795
    }
796
797
    private static function quoteKeys(Connection $connection, array $data): array
798
    {
799
        $quotedData = [];
800
        foreach ($data as $id => $value) {
801
            $quotedData[$connection->quoteIdentifier($id)] = $value;
802
        }
803
        return $quotedData;
804
    }
805
806
    public static function insert(Connection $connection, string $tableName, array $data): void
807
    {
808
        $connection->insert($connection->quoteIdentifier($tableName), self::quoteKeys($connection, $data));
809
    }
810
811
    public static function update(Connection $connection, string $tableName, array $data, array $criteria): void
812
    {
813
        $connection->update($connection->quoteIdentifier($tableName), self::quoteKeys($connection, $data), self::quoteKeys($connection, $criteria));
814
    }
815
816
    protected static function delete(Connection $connection, string $tableName, array $criteria): void
817
    {
818
        $connection->delete($connection->quoteIdentifier($tableName), self::quoteKeys($connection, $criteria));
819
    }
820
821
    protected static function isMariaDb(Connection $connection): bool
822
    {
823
        if (!$connection->getDatabasePlatform() instanceof MySqlPlatform) {
824
            return false;
825
        }
826
        $version = $connection->fetchOne('SELECT VERSION()');
827
        return stripos($version, 'maria') !== false;
0 ignored issues
show
It seems like $version can also be of type false; however, parameter $haystack of stripos() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

827
        return stripos(/** @scrutinizer ignore-type */ $version, 'maria') !== false;
Loading history...
828
    }
829
}
830