]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Update.php
Using Locks for Updating and writing last success to config
[friendica.git] / src / Core / Update.php
index 350c2572e246306ee774b82b2acb6d25da0592b8..8b11d8dcff3ab1d537e403078c86983056f21ea3 100644 (file)
@@ -27,39 +27,38 @@ class Update
                                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;
+                               if (Lock::acquire('dbupdate')) {
+
+                                       // 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');
-                               }
+                                       // update the structure in one call
+                                       $retval = DBStructure::update(false, true);
+                                       if ($retval) {
+                                               DBStructure::updateFail(
+                                                       DB_UPDATE_VERSION,
+                                                       $retval
+                                               );
+                                               Lock::release('dbupdate');
+                                               return;
+                                       } else {
+                                               Config::set('database', 'last_successful_update', time());
+                                       }
 
-                               // run the update_nnnn functions in update.php
-                               for ($x = $stored + 1; $x <= $current; $x++) {
-                                       $r = self::runUpdateFunction($x, 'update');
-                                       if (!$r) {
-                                               break;
+                                       // run the update_nnnn functions in update.php
+                                       for ($x = $stored + 1; $x <= $current; $x++) {
+                                               $r = self::runUpdateFunction($x, 'update');
+                                               if (!$r) {
+                                                       break;
+                                               }
                                        }
+
+                                       Lock::release('dbupdate');
                                }
                        }
                }
@@ -85,33 +84,36 @@ class Update
                        // 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);
-                               }
+                       if (Lock::acquire('dbupdate_function')) {
+
+                               // call the specific update
+                               $retval = $funcname();
 
-                               return true;
+                               if ($retval) {
+                                       //send the administrator an e-mail
+                                       DBStructure::updateFail(
+                                               $x,
+                                               L10n::t('Update %s failed. See error logs.', $x)
+                                       );
+                                       Lock::release('dbupdate_function');
+                                       return false;
+                               } else {
+                                       Config::set('database', 'last_successful_update_function', $funcname);
+                                       Config::set('database', 'last_successful_update_function_time', time());
+
+                                       if ($prefix == 'update') {
+                                               Config::set('system', 'build', $x);
+                                       }
+
+                                       Lock::release('dbupdate_function');
+                                       return true;
+                               }
                        }
                } else {
-                       Config::set('database', $funcname, 'success');
+                       logger('Skipping \'' . $funcname . '\' without executing', LOGGER_DEBUG);
+
+                       Config::set('database', 'last_successful_update_function', $funcname);
+                       Config::set('database', 'last_successful_update_function_time', time());
 
                        if ($prefix == 'update') {
                                Config::set('system', 'build', $x);
@@ -120,4 +122,4 @@ class Update
                        return true;
                }
        }
-}
\ No newline at end of file
+}