WebtreesSchema::tableLog()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

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