summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorAngie Byron <webchick@24967.no-reply.drupal.org>2009-08-03 19:37:38 +0000
committerAngie Byron <webchick@24967.no-reply.drupal.org>2009-08-03 19:37:38 +0000
commit3b5d0565c63aaf75c35f5a7a52d77ee2d9113c17 (patch)
treed23cfd649e0f68487afbca8255e1e71e807892bb /includes
parent8fece7ff189e91152a09698b63ba07544da062e1 (diff)
downloadbrdo-3b5d0565c63aaf75c35f5a7a52d77ee2d9113c17.tar.gz
brdo-3b5d0565c63aaf75c35f5a7a52d77ee2d9113c17.tar.bz2
#536150 follow-up by gordonh and dww: Move more update.php functions to update.inc.
Diffstat (limited to 'includes')
-rw-r--r--includes/update.inc80
1 files changed, 80 insertions, 0 deletions
diff --git a/includes/update.inc b/includes/update.inc
index 3258f805e..181bd712e 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']);
+ }
+}
+