]> git.mxchange.org Git - friendica.git/commitdiff
Moved the functions update_db and run_update_function to a Friendica\Core\Update...
authorPhilipp Holzer <admin@philipp.info>
Fri, 5 Oct 2018 22:53:13 +0000 (00:53 +0200)
committerPhilipp Holzer <admin@philipp.info>
Wed, 31 Oct 2018 13:44:21 +0000 (14:44 +0100)
boot.php
src/Core/Console/DatabaseStructure.php
src/Core/Update.php [new file with mode: 0644]
src/Worker/DBUpdate.php

index 3efd065f3edf207baa8c952c83b37c2706686257..5973156ecd4ac7c41b8a38c09d53e3756cc253e3 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -28,9 +28,9 @@ use Friendica\Core\L10n;
 use Friendica\Core\PConfig;
 use Friendica\Core\Protocol;
 use Friendica\Core\System;
+use Friendica\Core\Update;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
-use Friendica\Database\DBStructure;
 use Friendica\Model\Contact;
 use Friendica\Model\Conversation;
 use Friendica\Util\DateTimeFormat;
@@ -454,7 +454,7 @@ function check_db($via_worker)
        if ($build < DB_UPDATE_VERSION) {
                // When we cannot execute the database update via the worker, we will do it directly
                if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) {
-                       update_db();
+                       Update::run();
                }
        }
 }
index 4b607c1e6a36918c07d1957536c9c1da36dedd37..7b4c4c6cf127101982cf204d9a3497ed78dfb8a3 100644 (file)
@@ -3,6 +3,7 @@
 namespace Friendica\Core\Console;
 
 use Friendica\Core;
+use Friendica\Core\Update;
 use Friendica\Database\DBA;
 use Friendica\Database\DBStructure;
 use RuntimeException;
@@ -80,7 +81,7 @@ HELP;
 
                                // run the pre_update_nnnn functions in update.php
                                for ($x = $stored; $x < $current; $x ++) {
-                                       $r = run_update_function($x, 'pre_update');
+                                       $r = Update::runUpdateFunction($x, 'pre_update');
                                        if (!$r) {
                                                break;
                                        }
@@ -90,7 +91,7 @@ HELP;
 
                                // run the update_nnnn functions in update.php
                                for ($x = $stored; $x < $current; $x ++) {
-                                       $r = run_update_function($x, 'update');
+                                       $r = Update::runUpdateFunction($x, 'update');
                                        if (!$r) {
                                                break;
                                        }
diff --git a/src/Core/Update.php b/src/Core/Update.php
new file mode 100644 (file)
index 0000000..350c257
--- /dev/null
@@ -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;
+               }
+       }
+}
\ No newline at end of file
index ed8e409e987ab0a6c942328b9448051e81f58747..fcf07c0b6506aee0823eb150abc61f72a8ae4b56 100644 (file)
@@ -6,17 +6,16 @@
 namespace Friendica\Worker;
 
 use Friendica\Core\Config;
+use Friendica\Core\Update;
 
 class DBUpdate
 {
        public static function execute()
        {
-               $a = \Friendica\BaseObject::getApp();
-
                // We are deleting the latest dbupdate entry.
                // This is done to avoid endless loops because the update was interupted.
                Config::delete('database', 'dbupdate_'.DB_UPDATE_VERSION);
 
-               update_db($a);
+               Update::run();
        }
 }