10c1c7615SGreg Roach<?php 23976b470SGreg Roach 30c1c7615SGreg Roach/** 40c1c7615SGreg Roach * webtrees: online genealogy 5d11be702SGreg Roach * Copyright (C) 2023 webtrees development team 60c1c7615SGreg Roach * This program is free software: you can redistribute it and/or modify 70c1c7615SGreg Roach * it under the terms of the GNU General Public License as published by 80c1c7615SGreg Roach * the Free Software Foundation, either version 3 of the License, or 90c1c7615SGreg Roach * (at your option) any later version. 100c1c7615SGreg Roach * This program is distributed in the hope that it will be useful, 110c1c7615SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 120c1c7615SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 130c1c7615SGreg Roach * GNU General Public License for more details. 140c1c7615SGreg Roach * You should have received a copy of the GNU General Public License 1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>. 160c1c7615SGreg Roach */ 17fcfa147eSGreg Roach 180c1c7615SGreg Roachdeclare(strict_types=1); 190c1c7615SGreg Roach 200c1c7615SGreg Roachnamespace Fisharebest\Webtrees\Services; 210c1c7615SGreg Roach 22*6f4ec3caSGreg Roachuse Fisharebest\Webtrees\DB; 230c1c7615SGreg Roachuse Fisharebest\Webtrees\Schema\MigrationInterface; 240c1c7615SGreg Roachuse Fisharebest\Webtrees\Schema\SeedDefaultResnTable; 250c1c7615SGreg Roachuse Fisharebest\Webtrees\Schema\SeedGedcomTable; 260c1c7615SGreg Roachuse Fisharebest\Webtrees\Schema\SeedUserTable; 270c1c7615SGreg Roachuse Fisharebest\Webtrees\Site; 280c1c7615SGreg Roachuse PDOException; 290c1c7615SGreg Roach 300c1c7615SGreg Roach/** 310c1c7615SGreg Roach * Update the database schema. 320c1c7615SGreg Roach */ 330c1c7615SGreg Roachclass MigrationService 340c1c7615SGreg Roach{ 350c1c7615SGreg Roach /** 360c1c7615SGreg Roach * Run a series of scripts to bring the database schema up to date. 370c1c7615SGreg Roach * 380c1c7615SGreg Roach * @param string $namespace Where to find our MigrationXXX classes 390c1c7615SGreg Roach * @param string $schema_name Which schema to update. 40415cca73SGreg Roach * @param int $target_version Upgrade to this version 410c1c7615SGreg Roach * 420c1c7615SGreg Roach * @return bool Were any updates applied 4324f2a3afSGreg Roach * @throws PDOException 440c1c7615SGreg Roach */ 4524f2a3afSGreg Roach public function updateSchema(string $namespace, string $schema_name, int $target_version): bool 460c1c7615SGreg Roach { 470c1c7615SGreg Roach try { 480c1c7615SGreg Roach $current_version = (int) Site::getPreference($schema_name); 4928d026adSGreg Roach } catch (PDOException) { 500c1c7615SGreg Roach // During initial installation, the site_preference table won’t exist. 510c1c7615SGreg Roach $current_version = 0; 520c1c7615SGreg Roach } 530c1c7615SGreg Roach 540c1c7615SGreg Roach $updates_applied = false; 550c1c7615SGreg Roach 560c1c7615SGreg Roach // Update the schema, one version at a time. 570c1c7615SGreg Roach while ($current_version < $target_version) { 580c1c7615SGreg Roach $class = $namespace . '\\Migration' . $current_version; 590c1c7615SGreg Roach /** @var MigrationInterface $migration */ 600c1c7615SGreg Roach $migration = new $class(); 610c1c7615SGreg Roach $migration->upgrade(); 620c1c7615SGreg Roach $current_version++; 630c1c7615SGreg Roach Site::setPreference($schema_name, (string) $current_version); 640c1c7615SGreg Roach $updates_applied = true; 650c1c7615SGreg Roach } 660c1c7615SGreg Roach 670c1c7615SGreg Roach return $updates_applied; 680c1c7615SGreg Roach } 690c1c7615SGreg Roach 700c1c7615SGreg Roach /** 710c1c7615SGreg Roach * Write default data to the database. 720c1c7615SGreg Roach * 730c1c7615SGreg Roach * @return void 740c1c7615SGreg Roach */ 750c1c7615SGreg Roach public function seedDatabase(): void 760c1c7615SGreg Roach { 770c1c7615SGreg Roach (new SeedUserTable())->run(); 780c1c7615SGreg Roach (new SeedGedcomTable())->run(); 790c1c7615SGreg Roach (new SeedDefaultResnTable())->run(); 800c1c7615SGreg Roach } 810c1c7615SGreg Roach} 82