Passed
Push — dbal ( 0d198d...ad0787 )
by Greg
06:19
created

WebtreesSchema   A

Complexity

Total Complexity 42

Size/Duplication

Total Lines 468
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 390
dl 0
loc 468
rs 9.0399
c 0
b 0
f 0
wmc 42

2 Methods

Rating   Name   Duplication   Size   Complexity  
D historicSchemaVersions() 0 43 41
B schema() 0 414 1

How to fix   Complexity   

Complex Class

Complex classes like WebtreesSchema 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.

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 WebtreesSchema, and based on these observations, apply Extract Interface, too.

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 Exception;
23
use Fisharebest\Webtrees\DB\Schema\ReferentialAction;
24
use Fisharebest\Webtrees\DB\Schema\Schema;
25
26
/**
27
 * Definitions for the webtrees database.
28
 */
29
class WebtreesSchema
30
{
31
    /**
32
     * @return void
33
     */
34
    public function historicSchemaVersions(): 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.15
77
        }
78
    }
79
80
    /**
81
     * @return Schema
82
     */
83
    public static function schema(): Schema
84
    {
85
        $block = Schema::table('block', [
86
            Schema::integer('block_id')->autoIncrement(),
87
            Schema::integer('gedcom_id')->nullable(),
88
            Schema::integer('user_id')->nullable(),
89
            Schema::varchar('xref', 20)->nullable(),
90
            Schema::enum('location', ['main', 'side'])->nullable(),
91
            Schema::integer('block_order'),
92
            Schema::nVarchar('module_name', 32),
93
            Schema::primaryKey('block_id'),
94
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
95
            Schema::foreignKey('user_id', 'user')->onDeleteCascade()->onUpdateCascade(),
96
            Schema::foreignKey('module_name', 'module')->onDeleteCascade()->onUpdateCascade(),
97
        ]);
98
99
        $block_setting = Schema::table('block_setting', [
100
           Schema::integer('block_id'),
101
           Schema::varchar('setting_name', 32),
102
           Schema::text('setting_value'),
103
           Schema::primaryKey(['block_id', 'setting_name']),
104
           Schema::foreignKey('block_id', 'block')->onDeleteCascade()->onUpdateCascade(),
105
        ]);
106
107
        $change = Schema::table('change', [
108
            Schema::integer('change_id')->autoIncrement(),
109
            Schema::timestamp('change_time')->defaultCurrentTimestamp(),
110
            Schema::varchar('status', 8)->default('pending'),
111
            Schema::integer('gedcom_id'),
112
            Schema::varchar('xref', 20),
113
            Schema::text('old_gedcom'),
114
            Schema::text('new_gedcom'),
115
            Schema::integer('user_id'),
116
            Schema::primaryKey('change_id'),
117
            Schema::index(['gedcom_id', 'status', 'xref']),
118
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
119
            Schema::foreignKey('user_id', 'user')->onDeleteSetNull()->onUpdateCascade(),
120
        ]);
121
122
        $dates = Schema::table('dates', [
123
            Schema::smallInteger('d_day'),
124
            Schema::char('d_month', 5),
125
            Schema::smallInteger('d_mon'),
126
            Schema::smallInteger('d_year'),
127
            Schema::mediumInteger('d_julianday1'),
128
            Schema::mediumInteger('d_julianday2'),
129
            Schema::varchar('d_fact', 15),
130
            Schema::varchar('d_gid', 20),
131
            Schema::integer('d_file'),
132
            Schema::varchar('d_type', 13),
133
            Schema::index(['d_day']),
134
            Schema::index(['d_month']),
135
            Schema::index(['d_mon']),
136
            Schema::index(['d_year']),
137
            Schema::index(['d_julianday1']),
138
            Schema::index(['d_julianday2']),
139
            Schema::index(['d_gid']),
140
            Schema::index(['d_file']),
141
            Schema::index(['d_type']),
142
            Schema::index(['d_fact', 'd_gid']),
143
        ]);
144
145
        $default_resn = Schema::table('default_resn', [
146
            Schema::integer('default_resn_id')->autoIncrement(),
147
            Schema::integer('gedcom_id'),
148
            Schema::varchar('xref', 20)->nullable(),
149
            Schema::varchar('tag_type', 15)->nullable(),
150
            Schema::varchar('resn', 12),
151
            Schema::nVarchar('comment', 255)->nullable(),
152
            Schema::timestamp('updated')->defaultCurrentTimestamp(),
153
            Schema::primaryKey('default_resn_id'),
154
            Schema::index(['gedcom_id', 'xref', 'tag_type']),
155
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
156
        ]);
157
158
        $families = Schema::table('families', [
159
            Schema::varchar('f_id', 20),
160
            Schema::integer('f_file'),
161
            Schema::varchar('f_husb', 20)->nullable(),
162
            Schema::varchar('f_wife', 20)->nullable(),
163
            Schema::text('f_gedcom'),
164
            Schema::integer('f_numchil'),
165
            Schema::primaryKey(['f_id', 'f_file']),
166
            Schema::uniqueIndex(['f_file', 'f_id']),
167
            Schema::index('f_husb'),
168
            Schema::index('f_wife'),
169
        ]);
170
171
        $favorite = Schema::table('favorite', [
172
            Schema::integer('favorite_id')->autoIncrement(),
173
            Schema::integer('user_id')->nullable(),
174
            Schema::integer('gedcom_id'),
175
            Schema::varchar('xref', 20)->nullable(),
176
            Schema::varchar('favorite_type', 4),
177
            Schema::nVarchar('url', 255)->nullable(),
178
            Schema::nVarchar('title', 255)->nullable(),
179
            Schema::nVarchar('note', 1000)->nullable(),
180
            Schema::primaryKey('favorite_id'),
181
            Schema::index(['user_id']),
182
            Schema::index(['gedcom_id', 'user_id']),
183
            Schema::foreignKey('user_id', 'user')->onDeleteCascade()->onUpdateCascade(),
184
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
185
        ]);
186
187
        $gedcom = Schema::table('gedcom', [
188
            Schema::integer('gedcom_id')->autoIncrement(),
189
            Schema::nVarchar('gedcom_name', 255),
190
            Schema::integer('sort_order')->default(0),
191
            Schema::primaryKey('gedcom_id'),
192
            Schema::uniqueIndex('gedcom_name'),
193
            Schema::index('sort_order'),
194
        ]);
195
196
        $gedcom_chunk = Schema::table('gedcom_chunk', [
197
            Schema::integer('gedcom_chunk_id')->autoIncrement(),
198
            Schema::integer('gedcom_id'),
199
            Schema::text('chunk_data'),
200
            Schema::tinyInteger('imported')->default(0),
201
            Schema::primaryKey('gedcom_chunk_id'),
202
            Schema::index(['gedcom_id', 'imported']),
203
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
204
        ]);
205
206
        $gedcom_setting = Schema::table('gedcom_setting', [
207
            Schema::integer('gedcom_id'),
208
            Schema::nVarchar('setting_name', 32),
209
            Schema::nVarchar('setting_value', 255),
210
            Schema::primaryKey(['gedcom_id', 'setting_name']),
211
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
212
        ]);
213
214
        $hit_counter = Schema::table('hit_counter', [
215
            Schema::integer('gedcom_id'),
216
            Schema::varchar('page_name', 32),
217
            Schema::varchar('page_parameter', 20),
218
            Schema::integer('page_count'),
219
            Schema::primaryKey(['gedcom_id', 'page_name', 'page_parameter']),
220
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
221
        ]);
222
223
        $individuals = Schema::table('individuals', [
224
            Schema::varchar('i_id', 20),
225
            Schema::integer('i_file'),
226
            Schema::nVarchar('i_rin', 20),
227
            Schema::varchar('i_sex', 1),
228
            Schema::text('i_gedcom'),
229
            Schema::primaryKey(['i_id', 'i_file']),
230
            Schema::uniqueIndex(['i_file', 'i_id']),
231
        ]);
232
233
        $link = Schema::table('link', [
234
            Schema::integer('l_file'),
235
            Schema::varchar('l_from', 20),
236
            Schema::varchar('l_type', 15),
237
            Schema::varchar('l_to', 20),
238
            Schema::primaryKey(['l_from', 'l_file', 'l_tyoe', 'l_to']),
239
            Schema::uniqueIndex(['l_to', 'l_file', 'l_type', 'l_from']),
240
        ]);
241
242
        $log = Schema::table('log', [
243
            Schema::integer('log_id')->autoIncrement(),
244
            Schema::timestamp('log_time')->defaultCurrentTimestamp(),
245
            Schema::varchar('log_type', 6),
246
            Schema::text('log_message'),
247
            Schema::varchar('ip_address', 45),
248
            Schema::integer('user_id')->nullable(),
249
            Schema::integer('gedcom_id')->nullable(),
250
            Schema::primaryKey('log_id'),
251
            Schema::index('log_time'),
252
            Schema::index('log_type'),
253
            Schema::index('ip_address'),
254
            Schema::index('user_id'),
255
            Schema::index('gedcom_id'),
256
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
257
            Schema::foreignKey('user_id', 'user')->onDeleteCascade()->onUpdateCascade(),
258
        ]);
259
260
        $media = Schema::table('media', [
261
            Schema::varchar('m_id', 20),
262
            Schema::integer('m_file'),
263
            Schema::text('m_gedcom'),
264
            Schema::primaryKey(['m_id', 'm_file']),
265
            Schema::uniqueIndex(['m_file', 'm_id']),
266
        ]);
267
268
        $media_file = Schema::table('media_file', [
269
            Schema::integer('id')->autoIncrement(),
270
            Schema::varchar('m_id', 20),
271
            Schema::integer('m_file'),
272
            Schema::nVarchar('multimedia_file_refn', 246),
273
            Schema::nVarchar('multimedia_format', 4),
274
            Schema::nVarchar('source_media_type', 15),
275
            Schema::nVarchar('descriptive_title', 248),
276
            Schema::primaryKey('id'),
277
            Schema::index(['m_id', 'm_file']),
278
            Schema::index(['m_file', 'm_id']),
279
            Schema::index(['m_file', 'multimedia_file_refn']),
280
            Schema::index(['m_file', 'multimedia_format']),
281
            Schema::index(['m_file', 'source_media_type']),
282
            Schema::index(['m_file', 'descriptive_title']),
283
        ]);
284
285
        $message = Schema::table('message', [
286
            Schema::integer('message_id')->autoIncrement(),
287
            Schema::nVarchar('sender', 64),
288
            Schema::varchar('ip_address', 45),
289
            Schema::integer('user_id'),
290
            Schema::nVarchar('subject', 255),
291
            Schema::text('body'),
292
            Schema::timestamp('created')->defaultCurrentTimestamp(),
293
            Schema::primaryKey('message_id'),
294
            Schema::index('user_id'),
295
            Schema::foreignKey('user_id', 'user')->onDeleteCascade()->onUpdateCascade(),
296
        ]);
297
298
        $module = Schema::table('module', [
299
            Schema::nVarchar('module_name', 32),
300
            Schema::varchar('status', 8),
301
            Schema::integer('tab_order')->nullable(),
302
            Schema::integer('menu_order')->nullable(),
303
            Schema::integer('sidebar_order')->nullable(),
304
            Schema::integer('footer_order')->nullable(),
305
            Schema::primaryKey('module_name'),
306
        ]);
307
308
        $module_privacy = Schema::table('module_privacy', [
309
            Schema::integer('id')->autoIncrement(),
310
            Schema::nVarchar('module_name', 32),
311
            Schema::integer('gedcom_id'),
312
            Schema::varchar('interface', 255),
313
            Schema::tinyInteger('access_level'),
314
            Schema::primaryKey('id'),
315
            Schema::uniqueIndex(['gedcom_id', 'module_name', 'interface']),
316
            Schema::uniqueIndex(['module_name', 'gedcom_id', 'interface']),
317
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
318
            Schema::foreignKey('module_name', 'module')->onDeleteCascade()->onUpdateCascade(),
319
        ]);
320
321
        $module_setting = Schema::table('module_setting', [
322
            Schema::nVarchar('module_name', 32),
323
            Schema::nVarchar('setting_name', 32),
324
            Schema::text('setting_value'),
325
            Schema::primaryKey(['module_name', 'setting_name']),
326
            Schema::foreignKey('module_name', 'module')->onDeleteCascade()->onUpdateCascade(),
327
        ]);
328
329
        $name = Schema::table('name', [
330
            Schema::integer('n_file'),
331
            Schema::varchar('n_id', 20),
332
            Schema::integer('n_num'),
333
            Schema::varchar('n_type', 15),
334
            Schema::nVarchar('n_sort', 255),
335
            Schema::nVarchar('n_full', 255),
336
            Schema::nVarchar('n_surname', 255),
337
            Schema::nVarchar('n_surn', 255),
338
            Schema::nVarchar('n_givn', 255),
339
            Schema::varchar('n_soundex_givn_std', 255),
340
            Schema::varchar('n_soundex_surn_std', 255),
341
            Schema::varchar('n_soundex_givn_dm', 255),
342
            Schema::varchar('n_soundex_surn_dm', 255),
343
            Schema::primaryKey(['n_id', 'n_file', 'n_num']),
344
            Schema::index(['n_full', 'n_id', 'n_file']),
345
            Schema::index(['n_surn', 'n_file', 'n_type', 'n_id']),
346
            Schema::index(['n_givn', 'n_file', 'n_type', 'n_id']),
347
        ]);
348
349
        $news = Schema::table('news', [
350
            Schema::integer('news_id')->autoIncrement(),
351
            Schema::integer('user_id')->nullable(),
352
            Schema::integer('gedcom_id')->nullable(),
353
            Schema::varchar('subject', 255),
354
            Schema::text('body'),
355
            Schema::timestamp('updated')->defaultCurrentTimestamp(),
356
            Schema::primaryKey('news_id'),
357
            Schema::index(['user_id', 'updated']),
358
            Schema::index(['gedcom_id', 'updated']),
359
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
360
            Schema::foreignKey('user_id', 'user')->onDeleteCascade()->onUpdateCascade(),
361
        ]);
362
363
        $other = Schema::table('other', [
364
            Schema::varchar('o_id', 20),
365
            Schema::integer('o_file'),
366
            Schema::varchar('o_type', 15),
367
            Schema::text('o_gedcom'),
368
            Schema::primaryKey(['o_id', 'o_file']),
369
            Schema::uniqueIndex(['o_file', 'o_id']),
370
        ]);
371
372
        $places = Schema::table('places', [
373
            Schema::integer('p_id')->autoIncrement(),
374
            Schema::nVarchar('p_place', 150),
375
            Schema::integer('p_parent_id')->nullable(),
376
            Schema::integer('p_file'),
377
            Schema::text('p_std_soundex'),
378
            Schema::text('p_dm_soundex'),
379
            Schema::primaryKey('p_id'),
380
            Schema::uniqueIndex(['p_parent_id', 'p_file', 'p_place']),
381
            Schema::index(['p_file', 'p_place']),
382
        ]);
383
384
        $placelinks = Schema::table('placelinks', [
385
            Schema::integer('pl_p_id'),
386
            Schema::varchar('pl_gid', 20),
387
            Schema::integer('pl_file'),
388
            Schema::primaryKey(['pl_p_id', 'pl_gid', 'pl_file']),
389
            Schema::index('pl_gid'),
390
            Schema::index('pl_file'),
391
        ]);
392
393
        $place_location = Schema::table('place_location', [
394
            Schema::integer('id')->autoIncrement(),
395
            Schema::integer('parent_id')->nullable(),
396
            Schema::nVarchar('place', 120),
397
            Schema::float('latitude')->nullable(),
398
            Schema::float('longitude')->nullable(),
399
            Schema::primaryKey('id'),
400
            Schema::uniqueIndex(['parent_id', 'place']),
401
            Schema::uniqueIndex(['place', 'parent_id']),
402
            Schema::index('latitude'),
403
            Schema::index('longitude'),
404
            Schema::foreignKey('parent_id', 'place_location', 'id')->onDeleteCascade()->onUpdateCascade(),
405
        ]);
406
407
        $session = Schema::table('session', [
408
            Schema::varchar('session_id', 32),
409
            Schema::timestamp('session_time')->defaultCurrentTimestamp(),
410
            Schema::integer('user_id'),
411
            Schema::varchar('ip_address', 45),
412
            Schema::text('session_data'),
413
            Schema::primaryKey('session_id'),
414
            Schema::index(['session_time']),
415
            Schema::index(['user_id', 'ip_address']),
416
        ]);
417
418
        $site_setting = Schema::table('site_setting', [
419
            Schema::nVarchar('setting_name', 32),
420
            Schema::nVarchar('setting_value', 2000),
421
            Schema::primaryKey('setting_name'),
422
        ]);
423
424
        $sources = Schema::table('sources', [
425
            Schema::varchar('s_id', 20),
426
            Schema::integer('s_file'),
427
            Schema::nVarchar('s_name', 255),
428
            Schema::text('s_gedcom'),
429
            Schema::primaryKey(['s_id', 's_file']),
430
            Schema::uniqueIndex(['s_file', 's_id']),
431
            Schema::index(['s_name', 's_file']),
432
        ]);
433
434
        $user_gedcom_setting = Schema::table('user_gedcom_setting', [
435
            Schema::integer('user_id'),
436
            Schema::integer('gedcom_id'),
437
            Schema::nVarchar('setting_name', 32),
438
            Schema::nVarchar('setting_value', 255),
439
            Schema::primaryKey(['user_id', 'gedcom_id', 'setting_name']),
440
            Schema::index('gedcom_id'),
441
            Schema::foreignKey('gedcom_id', 'gedcom')->onDeleteCascade()->onUpdateCascade(),
442
            Schema::foreignKey('user_id', 'user')->onDeleteCascade()->onUpdateCascade(),
443
        ]);
444
445
        $user = Schema::table('user', [
446
            Schema::integer('user_id')->autoIncrement(),
447
            Schema::nVarchar('user_name', 32),
448
            Schema::nVarchar('real_name', 64),
449
            Schema::nVarchar('email', 64),
450
            Schema::nVarchar('password', 128),
451
            Schema::primaryKey('user_id'),
452
            Schema::uniqueIndex('user_name'),
453
            Schema::uniqueIndex('email'),
454
        ]);
455
456
        $user_setting = Schema::table('user_setting', [
457
            Schema::integer('user_id'),
458
            Schema::nVarchar('setting_name', 32),
459
            Schema::nVarchar('setting_value', 255),
460
            Schema::primaryKey(['user_id', 'setting_name']),
461
            Schema::foreignKey('user_id', 'user')->onDeleteCascade()->onUpdateCascade(),
462
        ]);
463
464
        return new Schema([
465
            $block,
466
            $block_setting,
467
            $change,
468
            $dates,
469
            $default_resn,
470
            $families,
471
            $favorite,
472
            $gedcom,
473
            $gedcom_chunk,
474
            $gedcom_setting,
475
            $hit_counter,
476
            $individuals,
477
            $link,
478
            $log,
479
            $media,
480
            $media_file,
481
            $message,
482
            $module,
483
            $module_privacy,
484
            $module_setting,
485
            $name,
486
            $news,
487
            $other,
488
            $place_location,
489
            $placelinks,
490
            $places,
491
            $session,
492
            $site_setting,
493
            $sources,
494
            $user,
495
            $user_gedcom_setting,
496
            $user_setting,
497
        ]);
498
    }
499
}
500