WebtreesSchema::tableBlock()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 32
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 28
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 32
rs 9.472
1
<?php
2
3
/**
4
 * webtrees: online genealogy
5
 * Copyright (C) 2025 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\Schema;
21
22
use Doctrine\DBAL\Schema\DefaultExpression\CurrentTimestamp;
0 ignored issues
show
Bug introduced by
The type Doctrine\DBAL\Schema\Def...ession\CurrentTimestamp was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
23
use Doctrine\DBAL\Schema\ForeignKeyConstraint\ReferentialAction;
24
use Doctrine\DBAL\Schema\Schema;
25
use Doctrine\DBAL\Schema\Table;
26
use Fisharebest\Webtrees\DB;
0 ignored issues
show
Bug introduced by
The type Fisharebest\Webtrees\DB was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
27
28
/**
29
 * Definitions for the webtrees database.
30
 */
31
class WebtreesSchema
32
{
33
    /**
34
     * @return void
35
     */
36
    public function historicSchemaVersions(): void
37
    {
38
        switch ('webtrees_schema') {
39
            case 1: // webtrees 1.0.0 - 1.0.3
40
            case 2: // webtrees 1.0.4
41
            case 3:
42
            case 4: // webtrees 1.0.5
43
            case 5: // webtrees 1.0.6
44
            case 6:
45
            case 7:
46
            case 8:
47
            case 9: // webtrees 1.1.0 - 1.1.1
48
            case 10: // webtrees 1.1.2
49
            case 11: // webtrees 1.2.0
50
            case 12: // webtrees 1.2.1 - 1.2.3
51
            case 13:
52
            case 14:
53
            case 15: // webtrees 1.2.4 - 1.2.5
54
            case 16: // webtrees 1.2.7
55
            case 17:
56
            case 18: // webtrees 1.3.0
57
            case 19: // webtrees 1.3.1
58
            case 20: // webtrees 1.3.2
59
            case 21:
60
            case 22:
61
            case 23: // webtrees 1.4.0 - 1.4.1
62
            case 24:
63
            case 25: // webtrees 1.4.2 - 1.4.4, 1.5.0
64
            case 26: // webtrees 1.4.5 - 1.4.6
65
            case 27: // webtrees 1.5.1 - 1.6.0
66
            case 28:
67
            case 29: // webtrees 1.6.1 - 1.6.2
68
            case 30:
69
            case 31: // webtrees 1.7.0 - 1.7.1
70
            case 32: // webtrees 1.7.2
71
            case 33:
72
            case 34: // webtrees 1.7.3 - 1.7.4
73
            case 35:
74
            case 36: // webtrees 1.7.5 - 1.7.7
75
            case 37: // webtrees 1.7.8 - 2.0.0
76
            case 38:
77
            case 39:
78
            case 40: // webtrees 2.0.1 - 2.1.15
79
        }
80
    }
81
82
    public static function tableBlock(): Table
83
    {
84
        return Table::editor()
85
            ->setOptions(options: [DB::tableOptions()])
86
            ->setUnquotedName(unqualifiedName: DB::prefix('block'))
87
            ->addColumn(column: DB::integer(name: 'block_id', autoincrement: true))
88
            ->addColumn(column: DB::integer(name: 'gedcom_id', nullable: true))
89
            ->addColumn(column: DB::integer(name: 'user_id', nullable: true))
90
            ->addColumn(column: DB::varchar(name: 'xref', length: 20, nullable: true))
91
            ->addColumn(column: DB::char(name: 'location', length: 4, nullable: true))
92
            ->addColumn(column: DB::integer(name: 'block_order'))
93
            ->addColumn(column: DB::varchar(name: 'module_name', length: 32))
94
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['block_id']))
95
            ->addIndex(index: DB::index(name: 'block_ix1', columns: ['gedcom_id']))
96
            ->addIndex(index: DB::index(name: 'block_ix2', columns: ['user_id']))
97
            ->addIndex(index: DB::index(name: 'block_ix3', columns: ['module_name']))
98
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(
99
                name: 'block_fk1',
100
                local_columns: ['gedcom_id'],
101
                foreign_table: 'gedcom',
102
                on_delete: ReferentialAction::CASCADE,
103
                on_update: ReferentialAction::CASCADE
104
            ))
105
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(
106
                name: 'block_fk2',
107
                local_columns: ['module_name'],
108
                foreign_table: 'module',
109
                on_delete: ReferentialAction::CASCADE,
110
                on_update: ReferentialAction::CASCADE
111
            ))
112
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'block_fk3', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
113
            ->create();
114
    }
115
116
    public static function tableBlockSetting(): Table
117
    {
118
        return Table::editor()
119
            ->setOptions(options: [DB::tableOptions()])
120
            ->setUnquotedName(unqualifiedName: DB::prefix('block_setting'))
121
            ->addColumn(column: DB::integer(name: 'block_id'))
122
            ->addColumn(column: DB::varchar(name: 'setting_name', length: 32))
123
            ->addColumn(column: DB::text('setting_value'))
124
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['block_id', 'setting_name']))
125
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'block_setting_fk1', local_columns: ['block_id'], foreign_table: 'block', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
126
            ->create();
127
    }
128
129
    public static function tableChange(): Table
130
    {
131
        return Table::editor()
132
            ->setOptions(options: [DB::tableOptions()])
133
            ->setUnquotedName(unqualifiedName: DB::prefix('change'))
134
            ->addColumn(column: DB::integer(name: 'change_id', autoincrement: true))
135
            ->addColumn(column: DB::timestamp(name: 'change_time', default: new CurrentTimestamp()))
136
            ->addColumn(column: DB::char(name: 'status', length: 8))
137
            ->addColumn(column: DB::integer(name: 'gedcom_id'))
138
            ->addColumn(column: DB::varchar(name: 'xref', length: 20))
139
            ->addColumn(column: DB::text(name: 'old_gedcom'))
140
            ->addColumn(column: DB::text(name: 'new_gedcom'))
141
            ->addColumn(column: DB::integer(name: 'user_id'))
142
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['change_id']))
143
            ->addIndex(index: DB::index(name: 'change_ix1', columns: ['gedcom_id', 'status', 'xref']))
144
            ->addIndex(index: DB::index(name: 'change_ix2', columns: ['user_id']))
145
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'change_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
146
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'change_fk2', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
147
            ->create();
148
    }
149
150
    public static function tableDates(): Table
151
    {
152
        return Table::editor()
153
            ->setOptions(options: [DB::tableOptions()])
154
            ->setUnquotedName(unqualifiedName: DB::prefix('dates'))
155
            ->addColumn(column: DB::integer(name: 'd_day'))
156
            ->addColumn(column: DB::char(name: 'd_month', length: 5))
157
            ->addColumn(column: DB::integer(name: 'd_mon'))
158
            ->addColumn(column: DB::integer(name: 'd_year'))
159
            ->addColumn(column: DB::integer(name: 'd_julianday1'))
160
            ->addColumn(column: DB::integer(name: 'd_julianday2'))
161
            ->addColumn(column: DB::varchar(name: 'd_fact', length: 15))
162
            ->addColumn(column: DB::varchar(name: 'd_gid', length: 20))
163
            ->addColumn(column: DB::integer(name: 'd_file'))
164
            ->addColumn(column: DB::varchar(name: 'd_type', length: 13))
165
            ->addIndex(index: DB::index(name: 'dates_ix1', columns: ['d_day']))
166
            ->addIndex(index: DB::index(name: 'dates_ix2', columns: ['d_month']))
167
            ->addIndex(index: DB::index(name: 'dates_ix3', columns: ['d_mon']))
168
            ->addIndex(index: DB::index(name: 'dates_ix4', columns: ['d_year']))
169
            ->addIndex(index: DB::index(name: 'dates_ix5', columns: ['d_julianday1']))
170
            ->addIndex(index: DB::index(name: 'dates_ix6', columns: ['d_julianday2']))
171
            ->addIndex(index: DB::index(name: 'dates_ix7', columns: ['d_gid']))
172
            ->addIndex(index: DB::index(name: 'dates_ix8', columns: ['d_file']))
173
            ->addIndex(index: DB::index(name: 'dates_ix9', columns: ['d_type']))
174
            ->addIndex(index: DB::index(name: 'dates_ix10', columns: ['d_fact', 'd_gid']))
175
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'dates_fk1', local_columns: ['d_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
176
            ->create();
177
    }
178
179
    public static function tableDefaultResn(): Table
180
    {
181
        return Table::editor()
182
            ->setOptions(options: [DB::tableOptions()])
183
            ->setUnquotedName(unqualifiedName: DB::prefix('default_resn'))
184
            ->addColumn(column: DB::integer(name: 'default_resn_id', autoincrement: true))
185
            ->addColumn(column: DB::integer(name: 'gedcom_id'))
186
            ->addColumn(column: DB::varchar(name: 'xref', length: 20, nullable: true))
187
            ->addColumn(column: DB::varchar(name: 'tag_type', length: 15, nullable: true))
188
            ->addColumn(column: DB::varchar(name: 'resn', length: 12))
189
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['default_resn_id']))
190
            ->addIndex(index: DB::uniqueIndex(name: 'default_resn_ux1', columns: ['gedcom_id', 'xref', 'tag_type']))
191
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'default_resn_fk1', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
192
            ->create();
193
    }
194
195
    public static function tableFamilies(): Table
196
    {
197
        return Table::editor()
198
            ->setOptions(options: [DB::tableOptions()])
199
            ->setUnquotedName(unqualifiedName: DB::prefix('families'))
200
            ->addColumn(column: DB::varchar(name: 'f_id', length: 20))
201
            ->addColumn(column: DB::integer(name: 'f_file'))
202
            ->addColumn(column: DB::varchar(name: 'f_husb', length: 20, nullable: true))
203
            ->addColumn(column: DB::varchar(name: 'f_wife', length: 20, nullable: true))
204
            ->addColumn(column: DB::text(name: 'f_gedcom'))
205
            ->addColumn(column: DB::integer(name: 'f_numchil'))
206
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['f_file', 'f_id']))
207
            ->addIndex(index: DB::uniqueIndex(name: 'families_ux1', columns: ['f_id', 'f_file']))
208
            ->addIndex(index: DB::index(name: 'families_ix1', columns: ['f_file', 'f_husb']))
209
            ->addIndex(index: DB::index(name: 'families_ix2', columns: ['f_file', 'f_wife']))
210
            ->addIndex(index: DB::index(name: 'families_ix3', columns: ['f_file', 'f_numchil']))
211
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'families_fk1', local_columns: ['f_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
212
            ->create();
213
    }
214
215
    public static function tableFavorite(): Table
216
    {
217
        return Table::editor()
218
            ->setOptions(options: [DB::tableOptions()])
219
            ->setUnquotedName(unqualifiedName: DB::prefix('favorite'))
220
            ->addColumn(column: DB::integer(name: 'favorite_id', autoincrement: true))
221
            ->addColumn(column: DB::integer(name: 'user_id', nullable: true))
222
            ->addColumn(column: DB::integer(name: 'gedcom_id'))
223
            ->addColumn(column: DB::varchar(name: 'xref', length: 20, nullable: true))
224
            ->addColumn(column: DB::char(name: 'favorite_type', length: 4))
225
            ->addColumn(column: DB::varchar(name: 'url', length: 255, nullable: true))
226
            ->addColumn(column: DB::varchar(name: 'title', length: 255, nullable: true))
227
            ->addColumn(column: DB::varchar(name: 'note', length: 1000, nullable: true))
228
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['favorite_id']))
229
            ->addIndex(index: DB::index(name: 'favorite_ix1', columns: ['user_id']))
230
            ->addIndex(index: DB::index(name: 'favorite_ix2', columns: ['gedcom_id', 'user_id']))
231
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'favorite_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
232
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'favorite_fk2', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
233
            ->create();
234
    }
235
236
    public static function tableGedcom(): Table
237
    {
238
        return Table::editor()
239
            ->setOptions(options: [DB::tableOptions()])
240
            ->setUnquotedName(unqualifiedName: DB::prefix('gedcom'))
241
            ->addColumn(column: DB::integer(name: 'gedcom_id', autoincrement: true))
242
            ->addColumn(column: DB::nvarchar(name: 'gedcom_name', length: 255))
243
            ->addColumn(column: DB::integer(name: 'sort_order', default: 0))
244
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['gedcom_id']))
245
            ->addIndex(index: DB::uniqueIndex(name: 'gedcom_ux1', columns: ['gedcom_name']))
246
            ->addIndex(index: DB::index(name: 'gedcom_ix1', columns: ['sort_order']))
247
            ->create();
248
    }
249
250
    public static function tableGedcomChunk(): Table
251
    {
252
        return Table::editor()
253
            ->setOptions(options: [DB::tableOptions()])
254
            ->setUnquotedName(unqualifiedName: DB::prefix('gedcom_chunk'))
255
            ->addColumn(column: DB::integer(name: 'gedcom_chunk_id', autoincrement: true))
256
            ->addColumn(column: DB::integer(name: 'gedcom_id'))
257
            ->addColumn(column: DB::text(name: 'chunk_data'))
258
            ->addColumn(column: DB::integer(name: 'imported', default: 0))
259
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['gedcom_chunk_id']))
260
            ->addIndex(index: DB::index(name: 'gedcom_chunk_ix1', columns: ['gedcom_id', 'imported']))
261
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'gedcom_chunk_fk1', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
262
            ->create();
263
    }
264
265
    public static function tableGedcomSetting(): Table
266
    {
267
        return Table::editor()
268
            ->setOptions(options: [DB::tableOptions()])
269
            ->setUnquotedName(unqualifiedName: DB::prefix('gedcom_setting'))
270
            ->addColumn(column: DB::integer('gedcom_id'))
271
            ->addColumn(column: DB::varchar('setting_name', length: 32))
272
            ->addColumn(column: DB::nvarchar('setting_value', length: 255))
273
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['gedcom_id', 'setting_name']))
274
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'gedcom_setting_fk1', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
275
            ->create();
276
    }
277
278
    public static function tableHitCounter(): Table
279
    {
280
        return Table::editor()
281
            ->setOptions(options: [DB::tableOptions()])
282
            ->setUnquotedName(unqualifiedName: DB::prefix('hit_counter'))
283
            ->addColumn(column: DB::integer('gedcom_id'))
284
            ->addColumn(column: DB::varchar('page_name', length: 32))
285
            ->addColumn(column: DB::varchar('page_parameter', length: 32))
286
            ->addColumn(column: DB::integer('page_count'))
287
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['gedcom_id', 'page_name', 'page_parameter']))
288
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'hit_counter_fk1', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
289
            ->create();
290
    }
291
292
    public static function tableIndividuals(): Table
293
    {
294
        return Table::editor()
295
            ->setOptions(options: [DB::tableOptions()])
296
            ->setUnquotedName(unqualifiedName: DB::prefix('individuals'))
297
            ->addColumn(column: DB::varchar(name: 'i_id', length: 20))
298
            ->addColumn(column: DB::integer(name: 'i_file'))
299
            ->addColumn(column: DB::varchar(name: 'i_rin', length: 20))
300
            ->addColumn(column: DB::char(name: 'i_sex', length: 1))
301
            ->addColumn(column: DB::text(name: 'i_gedcom'))
302
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['i_id', 'i_file']))
303
            ->addIndex(index: DB::uniqueIndex(name: 'individuals_ux1', columns: ['i_file', 'i_id']))
304
            ->addIndex(index: DB::index(name: 'individuals_ix1', columns: ['i_file', 'i_sex']))
305
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'individuals_fk1', local_columns: ['i_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
306
            ->create();
307
    }
308
309
    public static function tableLink(): Table
310
    {
311
        return Table::editor()
312
            ->setOptions(options: [DB::tableOptions()])
313
            ->setUnquotedName(unqualifiedName: DB::prefix('link'))
314
            ->addColumn(column: DB::integer(name: 'l_file'))
315
            ->addColumn(column: DB::varchar(name: 'l_from', length: 20))
316
            ->addColumn(column: DB::varchar(name: 'l_type', length: 15))
317
            ->addColumn(column: DB::varchar(name: 'l_to', length: 20))
318
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['l_from', 'l_file', 'l_type', 'l_to']))
319
            ->addIndex(index: DB::uniqueIndex(name: 'link_ux1', columns: ['l_from', 'l_file', 'l_type', 'l_to']))
320
            ->addIndex(index: DB::uniqueIndex(name: 'link_ux2', columns: ['l_to', 'l_file', 'l_type', 'l_from']))
321
            ->addIndex(index: DB::index(name: 'link_ix1', columns: ['l_file']))
322
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'link_fk1', local_columns: ['l_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
323
            ->create();
324
    }
325
326
    public static function tableLog(): Table
327
    {
328
        return Table::editor()
329
            ->setOptions(options: [DB::tableOptions()])
330
            ->setUnquotedName(unqualifiedName: DB::prefix('log'))
331
            ->addColumn(column: DB::integer(name: 'log_id', autoincrement: true))
332
            ->addColumn(column: DB::timestamp(name: 'log_time', default: new CurrentTimestamp()))
333
            ->addColumn(column: DB::varchar(name: 'log_type', length: 6))
334
            ->addColumn(column: DB::text(name: 'log_message'))
335
            ->addColumn(column: DB::varchar(name: 'ip_address', length: 45))
336
            ->addColumn(column: DB::integer(name: 'user_id', nullable: true))
337
            ->addColumn(column: DB::integer(name: 'gedcom_id', nullable: true))
338
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['log_id']))
339
            ->addIndex(index: DB::index(name: 'log_ix1', columns: ['gedcom_id']))
340
            ->addIndex(index: DB::index(name: 'log_ix2', columns: ['user_id']))
341
            ->addIndex(index: DB::index(name: 'log_ix3', columns: ['log_time']))
342
            ->addIndex(index: DB::index(name: 'log_ix4', columns: ['log_type']))
343
            ->addIndex(index: DB::index(name: 'log_ix5', columns: ['ip_address']))
344
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'log_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::SET_NULL, on_update: ReferentialAction::CASCADE))
345
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'log_fk2', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::SET_NULL, on_update: ReferentialAction::CASCADE))
346
            ->create();
347
    }
348
349
    public static function tableMedia(): Table
350
    {
351
        return Table::editor()
352
            ->setOptions(options: [DB::tableOptions()])
353
            ->setUnquotedName(unqualifiedName: DB::prefix('media'))
354
            ->addColumn(column: DB::varchar(name: 'm_id', length: 20))
355
            ->addColumn(column: DB::integer(name: 'm_file'))
356
            ->addColumn(column: DB::text(name: 'm_gedcom'))
357
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['m_file', 'm_id']))
358
            ->addIndex(index: DB::uniqueIndex(name: 'media_ux1', columns: ['m_id', 'm_file']))
359
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'media_fk1', local_columns: ['m_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
360
            ->create();
361
    }
362
363
    public static function tableMediaFile(): Table
364
    {
365
        return Table::editor()
366
            ->setOptions(options: [DB::tableOptions()])
367
            ->setUnquotedName(unqualifiedName: DB::prefix('media_file'))
368
            ->addColumn(column: DB::integer(name: 'id', autoincrement: true))
369
            ->addColumn(column: DB::varchar(name: 'm_id', length: 20))
370
            ->addColumn(column: DB::integer(name: 'm_file'))
371
            ->addColumn(column: DB::nvarchar(name: 'multimedia_file_refn', length: 248))
372
            ->addColumn(column: DB::nvarchar(name: 'multimedia_format', length: 4))
373
            ->addColumn(column: DB::nvarchar(name: 'source_media_type', length: 15))
374
            ->addColumn(column: DB::nvarchar(name: 'descriptive_title', length: 248))
375
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['id']))
376
            ->addIndex(index: DB::index(name: 'media_file_ix1', columns: ['m_id', 'm_file']))
377
            ->addIndex(index: DB::index(name: 'media_file_ix2', columns: ['m_file', 'm_id']))
378
            ->addIndex(index: DB::index(name: 'media_file_ix3', columns: ['m_file', 'multimedia_file_refn']))
379
            ->addIndex(index: DB::index(name: 'media_file_ix4', columns: ['m_file', 'multimedia_format']))
380
            ->addIndex(index: DB::index(name: 'media_file_ix5', columns: ['m_file', 'source_media_type']))
381
            ->addIndex(index: DB::index(name: 'media_file_ix6', columns: ['m_file', 'descriptive_title']))
382
            ->create();
383
    }
384
385
    public static function tableMessage(): Table
386
    {
387
        return Table::editor()
388
            ->setOptions(options: [DB::tableOptions()])
389
            ->setUnquotedName(unqualifiedName: DB::prefix('message'))
390
            ->addColumn(column: DB::integer(name: 'message_id', autoincrement: true))
391
            ->addColumn(column: DB::nvarchar(name: 'sender', length: 64))
392
            ->addColumn(column: DB::varchar(name: 'ip_address', length: 45))
393
            ->addColumn(column: DB::integer(name: 'user_id'))
394
            ->addColumn(column: DB::nvarchar(name: 'subject', length: 255))
395
            ->addColumn(column: DB::text(name: 'body'))
396
            ->addColumn(column: DB::timestamp(name: 'created', default: new CurrentTimestamp()))
397
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['message_id']))
398
            ->addIndex(index: DB::index(name: 'message_ix1', columns: ['user_id']))
399
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'message_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
400
            ->create();
401
    }
402
403
    public static function tableModule(): Table
404
    {
405
        return Table::editor()
406
            ->setOptions(options: [DB::tableOptions()])
407
            ->setUnquotedName(unqualifiedName: DB::prefix('module'))
408
            ->addColumn(column: DB::varchar(name: 'module_name', length: 32))
409
            ->addColumn(column: DB::char(name: 'status', length: 8, default: 'enabled'))
410
            ->addColumn(column: DB::integer(name: 'tab_order', nullable: true))
411
            ->addColumn(column: DB::integer(name: 'menu_order', nullable: true))
412
            ->addColumn(column: DB::integer(name: 'sidebar_order', nullable: true))
413
            ->addColumn(column: DB::integer(name: 'footer_order', nullable: true))
414
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['module_name']))
415
            ->create();
416
    }
417
418
    public static function tableModulePrivacy(): Table
419
    {
420
        return Table::editor()
421
            ->setOptions(options: [DB::tableOptions()])
422
            ->setUnquotedName(unqualifiedName: DB::prefix('module_privacy'))
423
            ->addColumn(column: DB::integer(name: 'id', autoincrement: true))
424
            ->addColumn(column: DB::varchar(name: 'module_name', length: 32))
425
            ->addColumn(column: DB::integer(name: 'gedcom_id'))
426
            ->addColumn(column: DB::varchar(name: 'interface', length: 255))
427
            ->addColumn(column: DB::integer(name: 'access_level'))
428
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['id']))
429
            ->addIndex(index: DB::uniqueIndex(name: 'module_privacy_ux1', columns: ['gedcom_id', 'module_name', 'interface']))
430
            ->addIndex(index: DB::uniqueIndex(name: 'module_privacy_ux2', columns: ['module_name', 'gedcom_id', 'interface']))
431
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'module_privacy_fk1', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
432
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'module_privacy_fk2', local_columns: ['module_name'], foreign_table: 'module', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
433
            ->create();
434
    }
435
436
    public static function tableModuleSetting(): Table
437
    {
438
        return Table::editor()
439
            ->setOptions(options: [DB::tableOptions()])
440
            ->setUnquotedName(unqualifiedName: DB::prefix('module_setting'))
441
            ->addColumn(column: DB::varchar(name: 'module_name', length: 32))
442
            ->addColumn(column: DB::varchar(name: 'setting_name', length: 32))
443
            ->addColumn(column: DB::text(name: 'setting_value'))
444
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['module_name', 'setting_name']))
445
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'module_setting_fk1', local_columns: ['module_name'], foreign_table: 'module', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
446
            ->create();
447
    }
448
449
    public static function tableName(): Table
450
    {
451
        return Table::editor()
452
            ->setOptions(options: [DB::tableOptions()])
453
            ->setUnquotedName(unqualifiedName: DB::prefix('name'))
454
            ->addColumn(column: DB::integer(name: 'n_file'))
455
            ->addColumn(column: DB::varchar(name: 'n_id', length: 20))
456
            ->addColumn(column: DB::integer(name: 'n_num'))
457
            ->addColumn(column: DB::varchar(name: 'n_type', length: 15))
458
            ->addColumn(column: DB::nvarchar(name: 'n_sort', length: 255))
459
            ->addColumn(column: DB::nvarchar(name: 'n_full', length: 255))
460
            ->addColumn(column: DB::nvarchar(name: 'n_surname', length: 255, nullable: true))
461
            ->addColumn(column: DB::nvarchar(name: 'n_surn', length: 255, nullable: true))
462
            ->addColumn(column: DB::nvarchar(name: 'n_givn', length: 255, nullable: true))
463
            ->addColumn(column: DB::varchar(name: 'n_soundex_givn_std', length: 255, nullable: true))
464
            ->addColumn(column: DB::varchar(name: 'n_soundex_surn_std', length: 255, nullable: true))
465
            ->addColumn(column: DB::varchar(name: 'n_soundex_givn_dm', length: 255, nullable: true))
466
            ->addColumn(column: DB::varchar(name: 'n_soundex_surn_dm', length: 255, nullable: true))
467
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['n_id', 'n_file', 'n_num']))
468
            ->addIndex(index: DB::index(name: 'name_ix1', columns: ['n_full', 'n_id', 'n_file']))
469
            ->addIndex(index: DB::index(name: 'name_ix2', columns: ['n_givn', 'n_file', 'n_type', 'n_id']))
470
            ->addIndex(index: DB::index(name: 'name_ix3', columns: ['n_surn', 'n_file', 'n_type', 'n_id']))
471
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'name_fk1', local_columns: ['n_file', 'n_id'], foreign_table: 'individuals', foreign_columns: ['i_file', 'i_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
472
            ->create();
473
    }
474
475
    public static function tableNews(): Table
476
    {
477
        return Table::editor()
478
            ->setOptions(options: [DB::tableOptions()])
479
            ->setUnquotedName(unqualifiedName: DB::prefix('news'))
480
            ->addColumn(column: DB::integer(name: 'news_id', autoincrement: true))
481
            ->addColumn(column: DB::integer(name: 'user_id', nullable: true))
482
            ->addColumn(column: DB::integer(name: 'gedcom_id', nullable: true))
483
            ->addColumn(column: DB::nvarchar(name: 'subject', length: 255))
484
            ->addColumn(column: DB::text(name: 'body'))
485
            ->addColumn(column: DB::timestamp(name: 'updated', default: new CurrentTimestamp()))
486
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['news_id']))
487
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'news_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
488
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'news_fk2', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
489
            ->create();
490
    }
491
492
    public static function tableOther(): Table
493
    {
494
        return Table::editor()
495
            ->setOptions(options: [DB::tableOptions()])
496
            ->setUnquotedName(unqualifiedName: DB::prefix('other'))
497
            ->addColumn(column: DB::varchar(name: 'o_id', length: 20))
498
            ->addColumn(column: DB::integer(name: 'o_file'))
499
            ->addColumn(column: DB::varchar(name: 'o_type', length: 15))
500
            ->addColumn(column: DB::text(name: 'o_gedcom'))
501
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['o_file', 'o_id']))
502
            ->addIndex(index: DB::uniqueIndex(name: 'other_ux1', columns: ['o_id', 'o_file']))
503
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'other_fk1', local_columns: ['o_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
504
            ->create();
505
    }
506
507
    public static function tablePlaceLocation(): Table
508
    {
509
        return Table::editor()
510
            ->setOptions(options: [DB::tableOptions()])
511
            ->setUnquotedName(unqualifiedName: DB::prefix('place_location'))
512
            ->addColumn(column: DB::integer(name: 'id', autoincrement: true))
513
            ->addColumn(column: DB::integer(name: 'parent_id', nullable: true))
514
            ->addColumn(column: DB::nvarchar(name: 'place', length: 120))
515
            ->addColumn(column: DB::float(name: 'latitude', nullable: true))
516
            ->addColumn(column: DB::float(name: 'longitude', nullable: true))
517
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['id']))
518
            ->addIndex(index: DB::uniqueIndex(name: 'place_location_ux1', columns: ['parent_id', 'place']))
519
            ->addIndex(index: DB::uniqueIndex(name: 'place_location_ux2', columns: ['place', 'parent_id']))
520
            ->addIndex(index: DB::index(name: 'place_location_ix1', columns: ['latitude']))
521
            ->addIndex(index: DB::index(name: 'place_location_ix2', columns: ['longitude']))
522
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'place_location_fk1', local_columns: ['parent_id'], foreign_table:  'place_location', foreign_columns: ['id']))
523
            ->create();
524
    }
525
526
    public static function tablePlaceLinks(): Table
527
    {
528
        return Table::editor()
529
            ->setOptions(options: [DB::tableOptions()])
530
            ->setUnquotedName(unqualifiedName: DB::prefix('placelinks'))
531
            ->addColumn(column: DB::integer(name: 'pl_p_id'))
532
            ->addColumn(column: DB::varchar(name: 'pl_gid', length: 20))
533
            ->addColumn(column: DB::integer(name: 'pl_file'))
534
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['pl_p_id', 'pl_gid', 'pl_file']))
535
            ->addIndex(index: DB::index(name: 'placelinks_ix1', columns: ['pl_p_id']))
536
            ->addIndex(index: DB::index(name: 'placelinks_ix2', columns: ['pl_gid']))
537
            ->addIndex(index: DB::index(name: 'placelinks_ix3', columns: ['pl_file']))
538
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'placelinks_fk1', local_columns: ['pl_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
539
            ->create();
540
    }
541
542
    public static function tablePlaces(): Table
543
    {
544
        return Table::editor()
545
            ->setOptions(options: [DB::tableOptions()])
546
            ->setUnquotedName(unqualifiedName: DB::prefix('places'))
547
            ->addColumn(column: DB::integer(name: 'p_id', autoincrement: true))
548
            ->addColumn(column: DB::nvarchar(name: 'p_place', length: 150))
549
            ->addColumn(column: DB::integer(name: 'p_parent_id', nullable: true))
550
            ->addColumn(column: DB::integer(name: 'p_file'))
551
            ->addColumn(column: DB::text(name: 'p_std_soundex'))
552
            ->addColumn(column: DB::text(name: 'p_dm_soundex'))
553
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['p_id']))
554
            ->addIndex(index: DB::uniqueIndex(name: 'places_ux1', columns: ['p_parent_id', 'p_file', 'p_place']))
555
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'places_fk1', local_columns: ['p_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
556
            ->create();
557
    }
558
559
    public static function tableSession(): Table
560
    {
561
        return Table::editor()
562
            ->setOptions(options: [DB::tableOptions()])
563
            ->setUnquotedName(unqualifiedName: DB::prefix('session'))
564
            ->addColumn(column: DB::varchar(name: 'session_id', length: 32))
565
            ->addColumn(column: DB::timestamp(name: 'session_time', default: new CurrentTimestamp()))
566
            ->addColumn(column: DB::integer(name: 'user_id', nullable: true))
567
            ->addColumn(column: DB::varchar(name: 'ip_address', length: 45))
568
            ->addColumn(column: DB::text(name: 'session_data'))
569
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['session_id']))
570
            ->addIndex(index: DB::index(name: 'session_ix1', columns: ['session_time']))
571
            ->addIndex(index: DB::index(name: 'session_ix2', columns: ['user_id', 'ip_address']))
572
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'session_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
573
            ->create();
574
    }
575
576
    public static function tableSiteSetting(): Table
577
    {
578
        return Table::editor()
579
            ->setOptions(options: [DB::tableOptions()])
580
            ->setUnquotedName(unqualifiedName: DB::prefix('site_setting'))
581
            ->addColumn(column: DB::varchar(name: 'setting_name', length: 32))
582
            ->addColumn(column: DB::nvarchar(name: 'setting_value', length: 2000))
583
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['setting_name']))
584
            ->create();
585
    }
586
587
    public static function tableSources(): Table
588
    {
589
        return Table::editor()
590
            ->setOptions(options: [DB::tableOptions()])
591
            ->setUnquotedName(unqualifiedName: DB::prefix('sources'))
592
            ->addColumn(column: DB::varchar(name: 's_id', length: 20))
593
            ->addColumn(column: DB::integer(name: 's_file'))
594
            ->addColumn(column: DB::nvarchar(name: 's_name', length: 255))
595
            ->addColumn(column: DB::text(name: 's_gedcom'))
596
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['s_file', 's_id']))
597
            ->addIndex(index: DB::uniqueIndex(name: 'sources_ux1', columns: ['s_id', 's_file']))
598
            ->addIndex(index: DB::index(name: 'sources_ix1', columns: ['s_file', 's_name']))
599
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'sources_fk1', local_columns: ['s_file'], foreign_table: 'gedcom', foreign_columns: ['gedcom_id'], on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
600
            ->create();
601
    }
602
603
    public static function tableUser(): Table
604
    {
605
        return Table::editor()
606
            ->setOptions(options: [DB::tableOptions()])
607
            ->setUnquotedName(unqualifiedName: DB::prefix('user'))
608
            ->addColumn(column: DB::integer('user_id', autoincrement: true))
609
            ->addColumn(column: DB::nvarchar('user_name', length: 32))
610
            ->addColumn(column: DB::nvarchar('real_name', length: 64))
611
            ->addColumn(column: DB::nvarchar('email', length: 64))
612
            ->addColumn(column: DB::varchar('password', length: 128))
613
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['user_id']))
614
            ->addIndex(index: DB::uniqueIndex(name: 'user_ux1', columns: ['user_name']))
615
            ->addIndex(index: DB::uniqueIndex(name: 'user_ux2', columns: ['email']))
616
            ->create();
617
    }
618
619
    public static function tableUserGedcomSetting(): Table
620
    {
621
        return Table::editor()
622
            ->setOptions(options: [DB::tableOptions()])
623
            ->setUnquotedName(unqualifiedName: DB::prefix('user_gedcom_setting'))
624
            ->addColumn(column: DB::integer(name: 'user_id'))
625
            ->addColumn(column: DB::integer(name: 'gedcom_id'))
626
            ->addColumn(column: DB::varchar(name: 'setting_name', length: 32))
627
            ->addColumn(column: DB::nvarchar(name: 'setting_value', length: 255))
628
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['user_id', 'gedcom_id', 'setting_name']))
629
            ->addIndex(index: DB::index(name: 'user_gedcom_setting_ix1', columns: ['gedcom_id']))
630
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'user_gedcom_setting_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
631
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'user_gedcom_setting_fk2', local_columns: ['gedcom_id'], foreign_table: 'gedcom', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
632
            ->create();
633
    }
634
635
    public static function tableUserSetting(): Table
636
    {
637
        return Table::editor()
638
            ->setOptions(options: [DB::tableOptions()])
639
            ->setUnquotedName(unqualifiedName: DB::prefix('user_setting'))
640
            ->addColumn(column: DB::integer(name: 'user_id'))
641
            ->addColumn(column: DB::varchar(name: 'setting_name', length: 32))
642
            ->addColumn(column: DB::nvarchar(name: 'setting_value', length: 255))
643
            ->setPrimaryKeyConstraint(primaryKeyConstraint: DB::primaryKey(columns: ['user_id', 'setting_name']))
644
            ->addForeignKeyConstraint(foreignKeyConstraint: DB::foreignKey(name: 'user_setting_fk1', local_columns: ['user_id'], foreign_table: 'user', on_delete: ReferentialAction::CASCADE, on_update: ReferentialAction::CASCADE))
645
            ->create();
646
    }
647
648
    public static function schema(): Schema
649
    {
650
        return new Schema(tables: [
651
            self::tableBlock(),
652
            self::tableBlockSetting(),
653
            self::tableChange(),
654
            self::tableDates(),
655
            self::tableDefaultResn(),
656
            self::tableFamilies(),
657
            self::tableFavorite(),
658
            self::tableGedcom(),
659
            self::tableGedcomChunk(),
660
            self::tableGedcomSetting(),
661
            self::tableHitCounter(),
662
            self::tableIndividuals(),
663
            self::tableLink(),
664
            self::tableLog(),
665
            self::tableMedia(),
666
            self::tableMediaFile(),
667
            self::tableMessage(),
668
            self::tableModule(),
669
            self::tableModulePrivacy(),
670
            self::tableModuleSetting(),
671
            self::tableName(),
672
            self::tableNews(),
673
            self::tableOther(),
674
            self::tablePlaceLocation(),
675
            self::tablePlaceLinks(),
676
            self::tablePlaces(),
677
            self::tableSession(),
678
            self::tableSiteSetting(),
679
            self::tableSources(),
680
            self::tableUser(),
681
            self::tableUserGedcomSetting(),
682
            self::tableUserSetting(),
683
        ]);
684
    }
685
}
686