95 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * SPDX-FileCopyrightText: 2024 Sascha Nitsch (grumpydeveloper) https://contentnation.net/@grumpydevelop
 | 
						|
 * SPDX-License-Identifier: GPL-3.0-or-later
 | 
						|
 *
 | 
						|
 * @author Sascha Nitsch (grumpydeveloper)
 | 
						|
 **/
 | 
						|
 | 
						|
function dbupgrade(\Federator\Main $main)
 | 
						|
{
 | 
						|
    $config = $main->getConfig();
 | 
						|
    $maintenance = $config['maintenance'];
 | 
						|
    $main->openDatabase($maintenance['username'], $maintenance['password']);
 | 
						|
    $dbh = $main->getDatabase();
 | 
						|
    if ($dbh === false) {
 | 
						|
        die();
 | 
						|
    }
 | 
						|
    $sql = 'select `value` from settings where `key`="database_version"';
 | 
						|
    try {
 | 
						|
        $sth = $dbh->query($sql);
 | 
						|
    } catch (mysqli_sql_exception) {
 | 
						|
        $sth = false;
 | 
						|
    }
 | 
						|
    $version = '0';
 | 
						|
    if ($sth instanceof mysqli_result) {
 | 
						|
        $row = $sth->fetch_row();
 | 
						|
        if (is_array($row)) {
 | 
						|
            $version = $row[0];
 | 
						|
        }
 | 
						|
    }
 | 
						|
    echo "current version: $version\n";
 | 
						|
    $updateFolder = opendir("sql");
 | 
						|
    if ($updateFolder === false) {
 | 
						|
        die();
 | 
						|
    }
 | 
						|
    $updates = [];
 | 
						|
    while (($file = readdir($updateFolder)) !== false) {
 | 
						|
        $matches = [];
 | 
						|
        if (preg_match('/^(\d{4}-\d{2}-\d{2}).sql$/', $file, $matches) == 1) {
 | 
						|
            if (strcmp($matches[1], $version) > 0) { // file is newer than our version
 | 
						|
                $updates[] = $file;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    closedir($updateFolder);
 | 
						|
    sort($updates);
 | 
						|
    foreach ($updates as $update) {
 | 
						|
        echo "applying update $update\n";
 | 
						|
        $u = fopen('sql/' . $update, 'r');
 | 
						|
        if ($u !== false) {
 | 
						|
            try {
 | 
						|
                $dbh->begin_transaction();
 | 
						|
                // apply updates line by line
 | 
						|
                while (($line = fgets($u)) !== false) {
 | 
						|
                    $line = trim($line);
 | 
						|
                    $dbh->query($line);
 | 
						|
                }
 | 
						|
                $dbh->commit();
 | 
						|
            } catch (mysqli_sql_exception $e) {
 | 
						|
                //print_r($e);
 | 
						|
                echo "error while applying update $update: " . $e->getMessage() . "\n";
 | 
						|
            }
 | 
						|
            fclose($u);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function printUsage()
 | 
						|
{
 | 
						|
    echo "usage php maintenance.php <command>\n";
 | 
						|
    echo "command can be one of:\n";
 | 
						|
    echo " dbupgrade - this upgrades the db to the most recent version. Run this after you updated the program files\n";
 | 
						|
    exit();
 | 
						|
}
 | 
						|
 | 
						|
date_default_timezone_set("Europe/Berlin");
 | 
						|
spl_autoload_register(static function (string $className) {
 | 
						|
    $root = array_key_exists('DOCUMENT_ROOT', $_SERVER) ? $_SERVER['DOCUMENT_ROOT'] : '';
 | 
						|
    // strip Federator from class path
 | 
						|
    $className = str_replace('Federator\\', '', $className);
 | 
						|
    include $root . 'php/' . str_replace("\\", "/", strtolower($className)) . '.php';
 | 
						|
});
 | 
						|
 | 
						|
if ($argc < 2) {
 | 
						|
    printUsage();
 | 
						|
}
 | 
						|
 | 
						|
$main = new \Federator\Main('');
 | 
						|
switch ($argv[1]) {
 | 
						|
    case 'dbupgrade':
 | 
						|
        dbupgrade($main);
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        printUsage();
 | 
						|
}
 |