From 3b5d0565c63aaf75c35f5a7a52d77ee2d9113c17 Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Mon, 3 Aug 2009 19:37:38 +0000
Subject: [PATCH] #536150 follow-up by gordonh and dww: Move more update.php
 functions to update.inc.

---
 includes/update.inc | 80 +++++++++++++++++++++++++++++++++++++++++++++
 update.php          | 52 +----------------------------
 2 files changed, 81 insertions(+), 51 deletions(-)

diff --git a/includes/update.inc b/includes/update.inc
index 3258f805e767..181bd712edb2 100644
--- a/includes/update.inc
+++ b/includes/update.inc
@@ -337,3 +337,83 @@ function update_do_one($module, $number, &$context) {
   $context['message'] = 'Updating ' . check_plain($module) . ' module';
 }
 
+/**
+ * Start the database update batch process.
+ *
+ * @param $start
+ *   An array of all the modules and which update to start at.
+ * @param $redirect
+ *   Path to redirect to when the batch has finished processing.
+ * @param $url
+ *   URL of the batch processing page (should only be used for separate
+ *   scripts like update.php).
+ * @param $batch
+ *   Optional parameters to pass into the batch API.
+ */
+function update_batch($start, $redirect = NULL, $url = NULL, $batch = array()) {
+  // During the update, bring the site offline so that schema changes do not
+  // affect visiting users.
+  $_SESSION['site_offline'] = variable_get('site_offline', FALSE);
+  if ($_SESSION['site_offline'] == FALSE) {
+    variable_set('site_offline', TRUE);
+  }
+
+  $operations = array();
+  // Set the installed version so updates start at the correct place.
+  foreach ($start as $module => $version) {
+    drupal_set_installed_schema_version($module, $version - 1);
+    $updates = drupal_get_schema_versions($module);
+    $max_version = max($updates);
+    if ($version <= $max_version) {
+      foreach ($updates as $update) {
+        if ($update >= $version) {
+          $operations[] = array('update_do_one', array($module, $update));
+        }
+      }
+    }
+  }
+  $batch['operations'] = $operations;
+  $batch += array(
+    'title' => 'Updating',
+    'init_message' => 'Starting updates',
+    'error_message' => 'An unrecoverable error has occurred. You can find the error message below. It is advised to copy it to the clipboard for reference.',
+    'finished' => 'update_finished',
+    'file' => 'includes/update.inc',
+  );
+  batch_set($batch);
+  batch_process($redirect, $url);
+}
+
+/**
+ * Finish the update process and store results for eventual display.
+ *
+ * After the updates run, all caches are flushed. The update results are
+ * stored into the session (for example, to be displayed on the update results
+ * page in update.php). Additionally, if the site was off-line, now that the
+ * update process is completed, the site is set back online.
+ *
+ * @param $success
+ *   Indicate that the batch API tasks were all completed successfully.
+ * @param $results
+ *   An array of all the results that were updated in update_do_one().
+ * @param $operations
+ *   A list of all the operations that had not been completed by the batch API.
+ *
+ * @see update_batch()
+ */
+function update_finished($success, $results, $operations) {
+  // Clear the caches in case the data has been updated.
+  drupal_flush_all_caches();
+
+  $_SESSION['update_results'] = $results;
+  $_SESSION['update_success'] = $success;
+  $_SESSION['updates_remaining'] = $operations;
+
+  // Now that the update is done, we can put the site back online if it was
+  // previously turned off.
+  if (isset($_SESSION['site_offline']) && $_SESSION['site_offline'] == FALSE) {
+    variable_set('site_offline', FALSE);
+    unset($_SESSION['site_offline']);
+  }
+}
+
diff --git a/update.php b/update.php
index 6c58ae7898b3..f37b9c2b37c4 100644
--- a/update.php
+++ b/update.php
@@ -120,56 +120,6 @@ function update_script_selection_form() {
   return $form;
 }
 
-function update_batch() {
-  global $base_url;
-
-  // During the update, bring the site offline so that schema changes do not
-  // affect visiting users.
-  $_SESSION['site_offline'] = variable_get('site_offline', FALSE);
-  if ($_SESSION['site_offline'] == FALSE) {
-    variable_set('site_offline', TRUE);
-  }
-
-  $operations = array();
-  // Set the installed version so updates start at the correct place.
-  foreach ($_POST['start'] as $module => $version) {
-    drupal_set_installed_schema_version($module, $version - 1);
-    $updates = drupal_get_schema_versions($module);
-    $max_version = max($updates);
-    if ($version <= $max_version) {
-      foreach ($updates as $update) {
-        if ($update >= $version) {
-          $operations[] = array('update_do_one', array($module, $update));
-        }
-      }
-    }
-  }
-  $batch = array(
-    'operations' => $operations,
-    'title' => 'Updating',
-    'init_message' => 'Starting updates',
-    'error_message' => 'An unrecoverable error has occurred. You can find the error message below. It is advised to copy it to the clipboard for reference.',
-    'finished' => 'update_finished',
-  );
-  batch_set($batch);
-  batch_process($base_url . '/update.php?op=results', $base_url . '/update.php');
-}
-
-function update_finished($success, $results, $operations) {
-  // clear the caches in case the data has been updated.
-  drupal_flush_all_caches();
-
-  $_SESSION['update_results'] = $results;
-  $_SESSION['update_success'] = $success;
-  $_SESSION['updates_remaining'] = $operations;
-
-  // Now that the update is done, we can put the site back online if it was
-  // previously turned off.
-  if (isset($_SESSION['site_offline']) && $_SESSION['site_offline'] == FALSE) {
-    variable_set('site_offline', FALSE);
-    unset($_SESSION['site_offline']);
-  }
-}
 
 function update_helpful_links() {
   // NOTE: we can't use l() here because the URL would point to 'update.php?q=admin'.
@@ -399,7 +349,7 @@ function update_check_requirements() {
 
     case 'Apply pending updates':
       if (isset($_GET['token']) && $_GET['token'] == drupal_get_token('update')) {
-        update_batch();
+        update_batch($_POST['start'], $base_url . '/update.php?op=results', $base_url . '/update.php');
         break;
       }
 
-- 
GitLab