Moved the functions update_db and run_update_function to a Friendica\Core\Update class

This commit is contained in:
Philipp Holzer 2018-10-06 00:53:13 +02:00
parent c6ce9ddaa4
commit e876adef8f
No known key found for this signature in database
GPG key ID: 517BE60E2CE5C8A5
4 changed files with 130 additions and 7 deletions

View file

@ -28,9 +28,9 @@ use Friendica\Core\L10n;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Update;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Model\Conversation; use Friendica\Model\Conversation;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
@ -454,7 +454,7 @@ function check_db($via_worker)
if ($build < DB_UPDATE_VERSION) { if ($build < DB_UPDATE_VERSION) {
// When we cannot execute the database update via the worker, we will do it directly // When we cannot execute the database update via the worker, we will do it directly
if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) { if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) {
update_db(); Update::run();
} }
} }
} }

View file

@ -3,6 +3,7 @@
namespace Friendica\Core\Console; namespace Friendica\Core\Console;
use Friendica\Core; use Friendica\Core;
use Friendica\Core\Update;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure; use Friendica\Database\DBStructure;
use RuntimeException; use RuntimeException;
@ -80,7 +81,7 @@ HELP;
// run the pre_update_nnnn functions in update.php // run the pre_update_nnnn functions in update.php
for ($x = $stored; $x < $current; $x ++) { for ($x = $stored; $x < $current; $x ++) {
$r = run_update_function($x, 'pre_update'); $r = Update::runUpdateFunction($x, 'pre_update');
if (!$r) { if (!$r) {
break; break;
} }
@ -90,7 +91,7 @@ HELP;
// run the update_nnnn functions in update.php // run the update_nnnn functions in update.php
for ($x = $stored; $x < $current; $x ++) { for ($x = $stored; $x < $current; $x ++) {
$r = run_update_function($x, 'update'); $r = Update::runUpdateFunction($x, 'update');
if (!$r) { if (!$r) {
break; break;
} }

123
src/Core/Update.php Normal file
View file

@ -0,0 +1,123 @@
<?php
namespace Friendica\Core;
use Friendica\Database\DBStructure;
class Update
{
/**
* Automatic database updates
*/
public static function run()
{
$build = Config::get('system', 'build');
if (empty($build) || ($build > DB_UPDATE_VERSION)) {
$build = DB_UPDATE_VERSION - 1;
Config::set('system', 'build', $build);
}
if ($build != DB_UPDATE_VERSION) {
require_once 'update.php';
$stored = intval($build);
$current = intval(DB_UPDATE_VERSION);
if ($stored < $current) {
Config::load('database');
// Compare the current structure with the defined structure
$t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION);
if (!is_null($t)) {
return;
}
// run the pre_update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) {
$r = self::runUpdateFunction($x, 'pre_update');
if (!$r) {
break;
}
}
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time());
// update the structure in one call
$retval = DBStructure::update(false, true);
if ($retval) {
DBStructure::updateFail(
DB_UPDATE_VERSION,
$retval
);
return;
} else {
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success');
}
// run the update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) {
$r = self::runUpdateFunction($x, 'update');
if (!$r) {
break;
}
}
}
}
}
/**
* Executes a specific update function
*
* @param int $x the DB version number of the function
* @param string $prefix the prefix of the function (update, pre_update)
*
* @return bool true, if the update function worked
*/
public static function runUpdateFunction($x, $prefix)
{
$funcname = $prefix . '_' . $x;
if (function_exists($funcname)) {
// There could be a lot of processes running or about to run.
// We want exactly one process to run the update command.
// So store the fact that we're taking responsibility
// after first checking to see if somebody else already has.
// If the update fails or times-out completely you may need to
// delete the config entry to try again.
$t = Config::get('database', $funcname);
if (!is_null($t)) {
return false;
}
Config::set('database', $funcname, time());
// call the specific update
$retval = $funcname();
if ($retval) {
//send the administrator an e-mail
DBStructure::updateFail(
$x,
L10n::t('Update %s failed. See error logs.', $x)
);
return false;
} else {
Config::set('database', $funcname, 'success');
if ($prefix == 'update') {
Config::set('system', 'build', $x);
}
return true;
}
} else {
Config::set('database', $funcname, 'success');
if ($prefix == 'update') {
Config::set('system', 'build', $x);
}
return true;
}
}
}

View file

@ -6,17 +6,16 @@
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Update;
class DBUpdate class DBUpdate
{ {
public static function execute() public static function execute()
{ {
$a = \Friendica\BaseObject::getApp();
// We are deleting the latest dbupdate entry. // We are deleting the latest dbupdate entry.
// This is done to avoid endless loops because the update was interupted. // This is done to avoid endless loops because the update was interupted.
Config::delete('database', 'dbupdate_'.DB_UPDATE_VERSION); Config::delete('database', 'dbupdate_'.DB_UPDATE_VERSION);
update_db($a); Update::run();
} }
} }