Passed
Push — dbal ( 59fa40...8433ab )
by Greg
05:50
created

WebtreesSchema::migrate()   B

Complexity

Conditions 4
Paths 6

Size

Total Lines 426
Code Lines 339

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 339
c 1
b 0
f 0
nc 6
nop 2
dl 0
loc 426
rs 8

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * webtrees: online genealogy
5
 * Copyright (C) 2022 webtrees development team
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
 */
17
18
declare(strict_types=1);
19
20
namespace Fisharebest\Webtrees\DB;
21
22
use Doctrine\DBAL\Connection;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, Fisharebest\Webtrees\DB\Connection. Consider defining an alias.

Let?s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let?s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
23
use Doctrine\DBAL\Schema\Schema;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, Fisharebest\Webtrees\DB\Schema. Consider defining an alias.

Let?s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let?s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
24
use Doctrine\DBAL\Schema\SchemaException;
25
use Doctrine\DBAL\Types\Type;
26
use Doctrine\DBAL\Types\Types;
27
use Exception;
28
29
/**
30
 * Definitions for the webtrees database.
31
 */
32
class WebtreesSchema
33
{
34
    public function foo(): void
35
    {
36
        switch ('webtrees_schema') {
37
            case 1: // webtrees 1.0.0 - 1.0.3
38
            case 2: // webtrees 1.0.4
39
            case 3:
40
            case 4: // webtrees 1.0.5
41
            case 5: // webtrees 1.0.6
42
            case 6:
43
            case 7:
44
            case 8:
45
            case 9: // webtrees 1.1.0 - 1.1.1
46
            case 10: // webtrees 1.1.2
47
            case 11: // webtrees 1.2.0
48
            case 12: // webtrees 1.2.1 - 1.2.3
49
            case 13:
50
            case 14:
51
            case 15: // webtrees 1.2.4 - 1.2.5
52
            case 16: // webtrees 1.2.7
53
            case 17:
54
            case 18: // webtrees 1.3.0
55
            case 19: // webtrees 1.3.1
56
            case 20: // webtrees 1.3.2
57
            case 21:
58
            case 22:
59
            case 23: // webtrees 1.4.0 - 1.4.1
60
            case 24:
61
            case 25: // webtrees 1.4.2 - 1.4.4, 1.5.0
62
            case 26: // webtrees 1.4.5 - 1.4.6
63
            case 27: // webtrees 1.5.1 - 1.6.0
64
            case 28:
65
            case 29: // webtrees 1.6.1 - 1.6.2
66
            case 30:
67
            case 31: // webtrees 1.7.0 - 1.7.1
68
            case 32: // webtrees 1.7.2
69
            case 33:
70
            case 34: // webtrees 1.7.3 - 1.7.4
71
            case 35:
72
            case 36: // webtrees 1.7.5 - 1.7.7
73
            case 37: // webtrees 1.7.8 - 2.0.0
74
            case 38:
75
            case 39:
76
            case 40: // webtrees 2.0.1 - 2.1.7
77
        }
78
    }
79
80
    /**
81
     * @param Connection $connection
82
     * @param string     $prefix
83
     *
84
     * @return void
85
     *
86
     * @throws SchemaException
87
     * @throws \Doctrine\DBAL\Exception
88
     */
89
    public static function migrate(Connection $connection, string $prefix): void
90
    {
91
        $platform = $connection->getDatabasePlatform();
92
93
        // Existing databases may have enum columns.
94
        $platform->registerDoctrineTypeMapping('enum', 'string');
95
96
        // Timestamp
97
        if (!Type::hasType('timestamp')) {
98
            Type::addType('timestamp', Timestamp::class);
99
        }
100
101
        $schema = new Schema();
102
103
        $table_gedcom = $schema->createTable($prefix . 'gedcom');
104
        $table_gedcom->addColumn('gedcom_id', Types::INTEGER, ['autoincrement' => true]);
105
        $table_gedcom->addColumn('gedcom_name', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
106
        $table_gedcom->addColumn('sort_order', Types::INTEGER, ['default' => 0]);
107
        $table_gedcom->setPrimaryKey(['gedcom_id']);
108
        $table_gedcom->addUniqueIndex(['gedcom_name']);
109
        $table_gedcom->addIndex(['sort_order']);
110
111
        $table_user = $schema->createTable($prefix . 'user');
112
        $table_user->addColumn('user_id', Types::INTEGER, ['autoincrement' => true]);
113
        $table_user->addColumn('user_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
114
        $table_user->addColumn('real_name', Types::STRING, ['length' => 64, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
115
        $table_user->addColumn('email', Types::STRING, ['length' => 64, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
116
        $table_user->addColumn('password', Types::STRING, ['length' => 128, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
117
        $table_user->setPrimaryKey(['user_id']);
118
        $table_user->addUniqueIndex(['user_name']);
119
        $table_user->addUniqueIndex(['email']);
120
121
        $table_module = $schema->createTable($prefix . 'module');
122
        $table_module->addColumn('module_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'utf8mb4_bin']]);
123
        $table_module->addColumn('status', Types::STRING, ['length' => 8, 'platformOptions' => ['collation' => 'ascii_bin']]);
124
        $table_module->addColumn('tab_order', Types::INTEGER, ['notnull' => false]);
125
        $table_module->addColumn('menu_order', Types::INTEGER, ['notnull' => false]);
126
        $table_module->addColumn('sidebar_order', Types::INTEGER, ['notnull' => false]);
127
        $table_module->addColumn('footer_order', Types::INTEGER, ['notnull' => false]);
128
        $table_module->setPrimaryKey(['module_name']);
129
130
        $table_block = $schema->createTable($prefix . 'block');
131
        $table_block->addColumn('block_id', Types::INTEGER, ['autoincrement' => true]);
132
        $table_block->addColumn('gedcom_id', Types::INTEGER, ['notnull' => false]);
133
        $table_block->addColumn('user_id', Types::INTEGER, ['notnull' => false]);
134
        $table_block->addColumn('xref', Types::STRING, ['length' => 20, 'notnull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
135
        $table_block->addColumn('location', Types::STRING, ['length' => 4, 'notnull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
136
        $table_block->addColumn('block_order', Types::INTEGER);
137
        $table_block->addColumn('module_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'utf8mb4_bin']]);
138
        $table_block->setPrimaryKey(['block_id']);
139
        $table_block->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
140
        $table_block->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
141
        $table_block->addForeignKeyConstraint($table_module->getName(), ['module_name'], ['module_name'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
142
143
        $table_block_setting = $schema->createTable($prefix . 'block_setting');
144
        $table_block_setting->addColumn('block_id', Types::INTEGER);
145
        $table_block_setting->addColumn('setting_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
146
        $table_block_setting->addColumn('setting_value', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
147
        $table_block_setting->setPrimaryKey(['block_id', 'setting_name']);
148
        $table_block_setting->addForeignKeyConstraint($table_block->getName(), ['block_id'], ['block_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
149
150
        $table_change = $schema->createTable($prefix . 'change');
151
        $table_change->addColumn('change_id', Types::INTEGER, ['autoincrement' => true]);
152
        $table_change->addColumn('change_time', Types::DATETIME_MUTABLE, ['default' => 'CURRENT_TIMESTAMP']);
153
        $table_change->addColumn('status', Types::STRING, ['length' => 8, 'default' => 'pending', 'platformOptions' => ['collation' => 'ascii_bin']]);
154
        $table_change->addColumn('gedcom_id', Types::INTEGER);
155
        $table_change->addColumn('xref', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
156
        $table_change->addColumn('old_gedcom', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
157
        $table_change->addColumn('new_gedcom', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
158
        $table_change->addColumn('user_id', Types::INTEGER);
159
        $table_change->setPrimaryKey(['change_id']);
160
        $table_change->addIndex(['gedcom_id', 'status', 'xref']);
161
        $table_change->addIndex(['user_id']);
162
        $table_change->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
163
        $table_change->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
164
165
        $table_dates = $schema->createTable($prefix . 'dates');
166
        $table_dates->addColumn('d_day', Types::SMALLINT);
167
        $table_dates->addColumn('d_month', Types::STRING, ['length' => 5, 'fixed' => true, 'platformOptions' => ['collation' => 'ascii_bin']]);
168
        $table_dates->addColumn('d_mon', Types::SMALLINT);
169
        $table_dates->addColumn('d_year', Types::SMALLINT);
170
        $table_dates->addColumn('d_julianday1', Types::INTEGER);
171
        $table_dates->addColumn('d_julianday2', Types::INTEGER);
172
        $table_dates->addColumn('d_fact', Types::STRING, ['length' => 15, 'platformOptions' => ['collation' => 'ascii_bin']]);
173
        $table_dates->addColumn('d_gid', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
174
        $table_dates->addColumn('d_file', Types::INTEGER);
175
        $table_dates->addColumn('d_type', Types::STRING, ['length' => 13, 'platformOptions' => ['collation' => 'ascii_bin']]);
176
        $table_dates->addIndex(['d_day']);
177
        $table_dates->addIndex(['d_month']);
178
        $table_dates->addIndex(['d_mon']);
179
        $table_dates->addIndex(['d_year']);
180
        $table_dates->addIndex(['d_julianday1']);
181
        $table_dates->addIndex(['d_julianday2']);
182
        $table_dates->addIndex(['d_gid']);
183
        $table_dates->addIndex(['d_file']);
184
        $table_dates->addIndex(['d_type']);
185
        $table_dates->addIndex(['d_fact', 'd_gid']);
186
187
        $table_default_resn = $schema->createTable($prefix . 'default_resn');
188
        $table_default_resn->addColumn('default_resn_id', Types::INTEGER, ['autoincrement' => true]);
189
        $table_default_resn->addColumn('gedcom_id', Types::INTEGER);
190
        $table_default_resn->addColumn('xref', Types::STRING, ['length' => 20, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
191
        $table_default_resn->addColumn('tag_type', Types::STRING, ['length' => 15, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
192
        $table_default_resn->addColumn('resn', Types::STRING, ['length' => 12, 'platformOptions' => ['collation' => 'ascii_bin']]);
193
        $table_default_resn->addColumn('comment', Types::STRING, ['length' => 255, 'notNull' => false, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
194
        $table_default_resn->addColumn('updated', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'precision' => 0]);
195
        $table_default_resn->setPrimaryKey(['default_resn_id']);
196
        $table_default_resn->addIndex(['gedcom_id', 'xref', 'tag_type']);
197
        $table_default_resn->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
198
199
        $table_families = $schema->createTable($prefix . 'families');
200
        $table_families->addColumn('f_id', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
201
        $table_families->addColumn('f_file', Types::INTEGER);
202
        $table_families->addColumn('f_husb', Types::STRING, ['length' => 20, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
203
        $table_families->addColumn('f_wife', Types::STRING, ['length' => 20, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
204
        $table_families->addColumn('f_gedcom', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
205
        $table_families->addColumn('f_numchil', Types::INTEGER);
206
        $table_families->setPrimaryKey(['f_id', 'f_file']);
207
        $table_families->addUniqueIndex(['f_file', 'f_id']);
208
        $table_families->addIndex(['f_husb']);
209
        $table_families->addIndex(['f_wife']);
210
211
        $table_favorite = $schema->createTable($prefix . 'favorite');
212
        $table_favorite->addColumn('favorite_id', Types::INTEGER, ['autoincrement' => true]);
213
        $table_favorite->addColumn('user_id', Types::INTEGER, ['notNull' => false]);
214
        $table_favorite->addColumn('xref', Types::STRING, ['length' => 20, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
215
        $table_favorite->addColumn('favorite_type', Types::STRING, ['length' => 4, 'platformOptions' => ['collation' => 'ascii_bin']]);
216
        $table_favorite->addColumn('url', Types::STRING, ['length' => 255, 'notNull' => false, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
217
        $table_favorite->addColumn('title', Types::STRING, ['length' => 255, 'notNull' => false, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
218
        $table_favorite->addColumn('note', Types::STRING, ['length' => 1000, 'notNull' => false, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
219
        $table_favorite->addColumn('gedcom_id', Types::INTEGER);
220
        $table_favorite->setPrimaryKey(['favorite_id']);
221
        $table_favorite->addIndex(['user_id']);
222
        $table_favorite->addIndex(['gedcom_id', 'user_id']);
223
        $table_favorite->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
224
        $table_favorite->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
225
226
        $table_gedcom_chunk = $schema->createTable($prefix . 'gedcom_chunk');
227
        $table_gedcom_chunk->addColumn('gedcom_chunk_id', Types::INTEGER, ['autoincrement' => true]);
228
        $table_gedcom_chunk->addColumn('gedcom_id', Types::INTEGER);
229
        $table_gedcom_chunk->addColumn('chunk_data', Types::BLOB);
230
        $table_gedcom_chunk->addColumn('imported', Types::INTEGER, ['default' => 0]);
231
        $table_gedcom_chunk->setPrimaryKey(['gedcom_chunk_id']);
232
        $table_gedcom_chunk->addIndex(['gedcom_id', 'imported']);
233
        $table_gedcom_chunk->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
234
235
        $table_gedcom_setting = $schema->createTable($prefix . 'gedcom_setting');
236
        $table_gedcom_setting->addColumn('gedcom_id', Types::INTEGER);
237
        $table_gedcom_setting->addColumn('setting_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
238
        $table_gedcom_setting->addColumn('setting_value', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
239
        $table_gedcom_setting->setPrimaryKey(['gedcom_id', 'setting_name']);
240
        $table_gedcom_setting->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
241
242
        $table_hit_counter = $schema->createTable($prefix . 'hit_counter');
243
        $table_hit_counter->addColumn('gedcom_id', Types::INTEGER);
244
        $table_hit_counter->addColumn('page_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
245
        $table_hit_counter->addColumn('page_parameter', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
246
        $table_hit_counter->addColumn('page_count', Types::INTEGER);
247
        $table_hit_counter->setPrimaryKey(['gedcom_id', 'page_name', 'page_parameter']);
248
        $table_hit_counter->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
249
250
        $table_individuals = $schema->createTable($prefix . 'individuals');
251
        $table_individuals->addColumn('i_id', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
252
        $table_individuals->addColumn('i_file', Types::INTEGER);
253
        $table_individuals->addColumn('i_rin', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
254
        $table_individuals->addColumn('i_sex', Types::STRING, ['length' => 1, 'platformOptions' => ['collation' => 'ascii_bin']]);
255
        $table_individuals->addColumn('i_gedcom', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
256
        $table_individuals->setPrimaryKey(['i_id', 'i_file']);
257
        $table_individuals->addUniqueIndex(['i_file', 'i_id']);
258
259
        $table_link = $schema->createTable($prefix . 'link');
260
        $table_link->addColumn('l_file', Types::INTEGER);
261
        $table_link->addColumn('l_from', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
262
        $table_link->addColumn('l_type', Types::STRING, ['length' => 15, 'platformOptions' => ['collation' => 'ascii_bin']]);
263
        $table_link->addColumn('l_to', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
264
        $table_link->setPrimaryKey(['l_from', 'l_file', 'l_type', 'l_to']);
265
        $table_link->addUniqueIndex(['l_to', 'l_file', 'l_type', 'l_from']);
266
267
        $table_log = $schema->createTable($prefix . 'log');
268
        $table_log->addColumn('log_id', Types::INTEGER, ['autoincrement' => true]);
269
        $table_log->addColumn('log_time', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'precision' => 0]);
270
        $table_log->addColumn('log_type', Types::STRING, ['length' => 6, 'platformOptions' => ['collation' => 'ascii_bin']]);
271
        $table_log->addColumn('log_message', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
272
        $table_log->addColumn('ip_address', Types::STRING, ['length' => 45]);
273
        $table_log->addColumn('user_id', Types::INTEGER, ['notNull' => false]);
274
        $table_log->addColumn('gedcom_id', Types::INTEGER, ['notNull' => false]);
275
        $table_log->setPrimaryKey(['log_id']);
276
        $table_log->addIndex(['log_time']);
277
        $table_log->addIndex(['log_type']);
278
        $table_log->addIndex(['ip_address']);
279
        $table_log->addIndex(['user_id']);
280
        $table_log->addIndex(['gedcom_id']);
281
        $table_log->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
282
        $table_log->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
283
284
        $table_media = $schema->createTable($prefix . 'media');
285
        $table_media->addColumn('m_id', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
286
        $table_media->addColumn('m_file', Types::INTEGER);
287
        $table_media->addColumn('m_gedcom', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
288
        $table_media->setPrimaryKey(['m_file', 'm_id']);
289
        $table_media->addUniqueIndex(['m_id', 'm_file']);
290
291
        $table_media_file = $schema->createTable($prefix . 'media_file');
292
        $table_media_file->addColumn('id', Types::INTEGER, ['autoincrement' => true]);
293
        $table_media_file->addColumn('m_id', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
294
        $table_media_file->addColumn('m_file', Types::INTEGER);
295
        $table_media_file->addColumn('multimedia_file_refn', Types::STRING, ['length' => 246, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
296
        $table_media_file->addColumn('multimedia_format', Types::STRING, ['length' => 4, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
297
        $table_media_file->addColumn('source_media_type', Types::STRING, ['length' => 15, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
298
        $table_media_file->addColumn('descriptive_title', Types::STRING, ['length' => 248, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
299
        $table_media_file->setPrimaryKey(['id']);
300
        $table_media_file->addIndex(['m_id', 'm_file']);
301
        $table_media_file->addIndex(['m_file', 'm_id']);
302
        $table_media_file->addIndex(['m_file', 'multimedia_file_refn']);
303
        $table_media_file->addIndex(['m_file', 'multimedia_format']);
304
        $table_media_file->addIndex(['m_file', 'source_media_type']);
305
        $table_media_file->addIndex(['m_file', 'descriptive_title']);
306
307
        $table_message = $schema->createTable($prefix . 'message');
308
        $table_message->addColumn('message_id', Types::INTEGER, ['autoincrement' => true]);
309
        $table_message->addColumn('sender', Types::STRING, ['length' => 64, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
310
        $table_message->addColumn('ip_address', Types::STRING, ['length' => 45, 'platformOptions' => ['collation' => 'ascii_bin']]);
311
        $table_message->addColumn('user_id', Types::INTEGER);
312
        $table_message->addColumn('subject', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
313
        $table_message->addColumn('body', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
314
        $table_message->addColumn('created', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'precision' => 0]);
315
        $table_message->addIndex(['user_id']);
316
        $table_message->setPrimaryKey(['message_id']);
317
        $table_message->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
318
319
        $table_module_privacy = $schema->createTable($prefix . 'module_privacy');
320
        $table_module_privacy->addColumn('id', Types::INTEGER, ['autoincrement' => true]);
321
        $table_module_privacy->addColumn('module_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'utf8mb4_bin']]);
322
        $table_module_privacy->addColumn('gedcom_id', Types::INTEGER);
323
        $table_module_privacy->addColumn('interface', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'ascii_bin']]);
324
        $table_module_privacy->addColumn('access_level', Types::SMALLINT);
325
        $table_module_privacy->addUniqueIndex(['gedcom_id', 'module_name', 'interface']);
326
        $table_module_privacy->addUniqueIndex(['module_name', 'gedcom_id', 'interface']);
327
        $table_module_privacy->setPrimaryKey(['id']);
328
        $table_module_privacy->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
329
        $table_module_privacy->addForeignKeyConstraint($table_module->getName(), ['module_name'], ['module_name'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
330
331
        $table_module_setting = $schema->createTable($prefix . 'module_setting');
332
        $table_module_setting->addColumn('module_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'utf8mb4_bin']]);
333
        $table_module_setting->addColumn('setting_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
334
        $table_module_setting->addColumn('setting_value', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
335
        $table_module_setting->setPrimaryKey(['module_name', 'setting_name']);
336
        $table_module_setting->addForeignKeyConstraint($table_module->getName(), ['module_name'], ['module_name'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
337
338
        $table_name = $schema->createTable($prefix . 'name');
339
        $table_name->addColumn('n_file', Types::INTEGER);
340
        $table_name->addColumn('n_id', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
341
        $table_name->addColumn('n_num', Types::INTEGER);
342
        $table_name->addColumn('n_type', Types::STRING, ['length' => 15, 'platformOptions' => ['collation' => 'ascii_bin']]);
343
        $table_name->addColumn('n_sort', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
344
        $table_name->addColumn('n_full', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
345
        $table_name->addColumn('n_surname', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
346
        $table_name->addColumn('n_surn', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
347
        $table_name->addColumn('n_givn', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
348
        $table_name->addColumn('n_soundex_givn_std', Types::STRING, ['length' => 255, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
349
        $table_name->addColumn('n_soundex_surn_std', Types::STRING, ['length' => 255, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
350
        $table_name->addColumn('n_soundex_givn_dm', Types::STRING, ['length' => 255, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
351
        $table_name->addColumn('n_soundex_surn_dm', Types::STRING, ['length' => 255, 'notNull' => false, 'platformOptions' => ['collation' => 'ascii_bin']]);
352
        $table_name->setPrimaryKey(['n_id', 'n_file', 'n_num']);
353
        $table_name->addIndex(['n_full', 'n_id', 'n_file']);
354
        $table_name->addIndex(['n_surn', 'n_file', 'n_type', 'n_id']);
355
        $table_name->addIndex(['n_givn', 'n_file', 'n_type', 'n_id']);
356
357
        $table_news = $schema->createTable($prefix . 'news');
358
        $table_news->addColumn('news_id', Types::INTEGER, ['autoincrement' => true]);
359
        $table_news->addColumn('user_id', Types::INTEGER, ['notNull' => false]);
360
        $table_news->addColumn('gedcom_id', Types::INTEGER, ['notNull' => false]);
361
        $table_news->addColumn('subject', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
362
        $table_news->addColumn('body', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
363
        $table_news->addColumn('updated', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'precision' => 0]);
364
        $table_news->setPrimaryKey(['news_id']);
365
        $table_news->addIndex(['user_id', 'updated']);
366
        $table_news->addIndex(['gedcom_id', 'updated']);
367
        $table_news->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
368
        $table_news->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
369
370
        $table_other = $schema->createTable($prefix . 'other');
371
        $table_other->addColumn('o_id', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
372
        $table_other->addColumn('o_file', Types::INTEGER);
373
        $table_other->addColumn('o_type', Types::STRING, ['length' => 15, 'platformOptions' => ['collation' => 'ascii_bin']]);
374
        $table_other->addColumn('o_gedcom', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
375
        $table_other->setPrimaryKey(['o_id', 'o_file']);
376
        $table_other->addUniqueIndex(['o_file', 'o_id']);
377
378
        $table_places = $schema->createTable($prefix . 'places');
379
        $table_places->addColumn('p_id', Types::INTEGER, ['autoincrement' => true]);
380
        $table_places->addColumn('p_place', Types::STRING, ['length' => 150, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
381
        $table_places->addColumn('p_parent_id', Types::INTEGER, ['notNull' => false]);
382
        $table_places->addColumn('p_file', Types::INTEGER);
383
        $table_places->addColumn('p_std_soundex', Types::TEXT, ['platformOptions' => ['collation' => 'ascii_bin']]);
384
        $table_places->addColumn('p_dm_soundex', Types::TEXT, ['platformOptions' => ['collation' => 'ascii_bin']]);
385
        $table_places->setPrimaryKey(['p_id']);
386
        $table_places->addUniqueIndex(['p_parent_id', 'p_file', 'p_place']);
387
        $table_places->addIndex(['p_file', 'p_place']);
388
389
        $table_placelinks = $schema->createTable($prefix . 'placelinks');
390
        $table_placelinks->addColumn('pl_p_id', Types::INTEGER);
391
        $table_placelinks->addColumn('pl_gid', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
392
        $table_placelinks->addColumn('pl_file', Types::INTEGER);
393
        $table_placelinks->setPrimaryKey(['pl_p_id', 'pl_gid', 'pl_file']);
394
        $table_placelinks->addIndex(['pl_p_id']);
395
        $table_placelinks->addIndex(['pl_gid']);
396
        $table_placelinks->addIndex(['pl_file']);
397
398
        $table_place_location = $schema->createTable($prefix . 'place_location');
399
        $table_place_location->addColumn('id', Types::INTEGER, ['autoincrement' => true]);
400
        $table_place_location->addColumn('parent_id', Types::INTEGER, ['notNull' => false]);
401
        $table_place_location->addColumn('place', Types::STRING, ['length' => 120, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
402
        $table_place_location->addColumn('latitude', Types::FLOAT, ['notNull' => false]);
403
        $table_place_location->addColumn('longitude', Types::FLOAT, ['notNull' => false]);
404
        $table_place_location->setPrimaryKey(['id']);
405
        $table_place_location->addUniqueIndex(['parent_id', 'place']);
406
        $table_place_location->addUniqueIndex(['place', 'parent_id']);
407
        $table_place_location->addIndex(['latitude']);
408
        $table_place_location->addIndex(['longitude']);
409
        $table_place_location->addForeignKeyConstraint($table_place_location->getName(), ['parent_id'], ['id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
410
411
        $table_sources = $schema->createTable($prefix . 'session');
412
        $table_sources->addColumn('session_id', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
413
        $table_sources->addColumn('session_time', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'precision' => 0]);
414
        $table_sources->addColumn('user_id', Types::INTEGER);
415
        $table_sources->addColumn('ip_address', Types::STRING, ['length' => 45, 'platformOptions' => ['collation' => 'ascii_bin']]);
416
        $table_sources->addColumn('session_data', Types::BLOB);
417
        $table_sources->setPrimaryKey(['session_id']);
418
        $table_sources->addIndex(['session_time']);
419
        $table_sources->addIndex(['user_id', 'ip_address']);
420
421
        $table_site_setting = $schema->createTable($prefix . 'site_setting');
422
        $table_site_setting->addColumn('setting_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
423
        $table_site_setting->addColumn('setting_value', Types::STRING, ['length' => 2000, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
424
        $table_site_setting->setPrimaryKey(['setting_name']);
425
426
        $table_sources = $schema->createTable($prefix . 'sources');
427
        $table_sources->addColumn('s_id', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
428
        $table_sources->addColumn('s_file', Types::INTEGER);
429
        $table_sources->addColumn('s_name', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
430
        $table_sources->addColumn('s_gedcom', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
431
        $table_sources->setPrimaryKey(['s_id', 's_file']);
432
        $table_sources->addUniqueIndex(['s_file', 's_id']);
433
        $table_sources->addIndex(['s_name']);
434
435
        $table_user_gedcom_setting = $schema->createTable($prefix . 'user_gedcom_setting');
436
        $table_user_gedcom_setting->addColumn('user_id', Types::INTEGER);
437
        $table_user_gedcom_setting->addColumn('gedcom_id', Types::INTEGER);
438
        $table_user_gedcom_setting->addColumn('setting_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
439
        $table_user_gedcom_setting->addColumn('setting_value', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
440
        $table_user_gedcom_setting->setPrimaryKey(['user_id', 'gedcom_id', 'setting_name']);
441
        $table_user_gedcom_setting->addIndex(['gedcom_id']);
442
        $table_user_gedcom_setting->addForeignKeyConstraint($table_gedcom->getName(), ['gedcom_id'], ['gedcom_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
443
        $table_user_gedcom_setting->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
444
445
        $table_user_setting = $schema->createTable($prefix . 'user_setting');
446
        $table_user_setting->addColumn('user_id', Types::INTEGER);
447
        $table_user_setting->addColumn('setting_name', Types::STRING, ['length' => 32, 'platformOptions' => ['collation' => 'ascii_bin']]);
448
        $table_user_setting->addColumn('setting_value', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
449
        $table_user_setting->setPrimaryKey(['user_id', 'setting_name']);
450
        $table_user_setting->addForeignKeyConstraint($table_user->getName(), ['user_id'], ['user_id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
451
452
        /*
453
        $site = $schema->createTable($prefix . 'site');
454
        $site->addColumn('uuid', Types::STRING, ['length' => 36, 'platformOptions' => ['collation' => 'ascii_bin']]);
455
        $site->addColumn('db_schema', Types::STRING, ['length' => 20, 'platformOptions' => ['collation' => 'ascii_bin']]);
456
        $site->addColumn('created_at', Types::TIME_MUTABLE);
457
        $site->addColumn('updated_at', Types::TIME_MUTABLE);
458
        $site->setPrimaryKey(['uuid']);
459
460
        $job = $schema->createTable($prefix . 'job');
461
        $job->addColumn('uuid', Types::STRING, ['length' => 36, 'platformOptions' => ['collation' => 'ascii_bin']]);
462
        $job->addColumn('failures', Types::INTEGER, ['default' => 0]);
463
        $job->addColumn('job', Types::STRING, ['length' => 255, 'platformOptions' => ['collation' => 'ascii_bin']]);
464
        $job->addColumn('parameters', Types::TEXT, ['platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
465
        $job->addColumn('error', Types::TEXT, ['notnull' => false, 'platformOptions' => ['collation' => 'utf8mb4_unicode_ci']]);
466
        $job->addColumn('created_at', Types::TIME_MUTABLE);
467
        $job->addColumn('updated_at', Types::TIME_MUTABLE);
468
        $job->setPrimaryKey(['uuid']);
469
470
        $job_dependency = $schema->createTable($prefix . 'job_dependency');
471
        $job_dependency->addColumn('uuid1', Types::STRING, ['length' => 36, 'platformOptions' => ['collation' => 'ascii_bin']]);
472
        $job_dependency->addColumn('uuid2', Types::STRING, ['length' => 36, 'platformOptions' => ['collation' => 'ascii_bin']]);
473
        $job_dependency->addUniqueIndex(['uuid1', 'uuid2']);
474
        $job_dependency->addUniqueIndex(['uuid2', 'uuid1']);
475
        $job_dependency->addForeignKeyConstraint($job->getName(), ['uuid1'], ['uuid'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
476
        $job_dependency->addForeignKeyConstraint($job->getName(), ['uuid2'], ['uuid'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE']);
477
        */
478
479
        $current_schema = $connection
480
            ->createSchemaManager()
481
            ->introspectSchema();
482
483
        $schema_diff = $connection
484
            ->createSchemaManager()
485
            ->createComparator()
486
            ->compareSchemas($current_schema, $schema);
487
488
        $queries = $connection
489
            ->getDatabasePlatform()
490
            ->getAlterSchemaSQL($schema_diff);
491
492
        /*
493
         function f(string $query): int {
494
            if (str_contains($query, 'DROP FOREIGN KEY')) {
495
                return 1;
496
            }
497
            if (str_contains($query, 'ADD CONSTRAINT FK_')) {
498
                return 3;
499
            }
500
            return 2;
501
        };
502
503
        usort($queries, fn($x, $y) => f($x) <=> f($y));
504
*/
505
506
        foreach ($queries as $query) {
507
            echo '<p>', $query, '</p>';
508
            try {
509
                $connection->executeStatement($query);
510
            } catch (Exception $ex) {
511
                echo '<p>', $ex->getMessage(), '</p>';
512
            }
513
        }
514
        exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
515
    }
516
}
517