From bc41e4054b12fb63a263068a5a5641ab6db67d8d Mon Sep 17 00:00:00 2001 From: Angie Byron Date: Sat, 2 Oct 2010 02:56:19 +0000 Subject: #864464 by heyrocker, Beanjammin: Ensure people using Drupal < 6.16 that they must upgrade to latest version, rather than showing them a WSOD. --- includes/update.inc | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++- update.php | 10 ++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/includes/update.inc b/includes/update.inc index 60eadfbc2..ecb2e6921 100644 --- a/includes/update.inc +++ b/includes/update.inc @@ -120,6 +120,21 @@ function update_prepare_d7_bootstrap() { // created yet. drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE); + // Check to make sure that the user is running an up to date version of + // Drupal 6 before proceeding. Note this has to happen AFTER the database + // bootstraps because of drupal_get_installed_schema_version(). + $system_schema = drupal_get_installed_schema_version('system'); + $has_required_schema = $system_schema >= REQUIRED_D6_SCHEMA_VERSION; + $requirements = array( + 'drupal 6 version' => array( + 'title' => 'Drupal 6 version', + 'value' => $has_required_schema ? 'You are running a current version of Drupal 6.' : 'You are not running a current version of Drupal 6', + 'severity' => $has_required_schema ? REQUIREMENT_OK : REQUIREMENT_ERROR, + 'description' => $has_required_schema ? '' : 'Please update your Drupal 6 installation to the most recent version before attempting to upgrade to Drupal 7', + ), + ); + update_extra_requirements($requirements); + // Create the registry tables. if (!db_table_exists('registry')) { $schema['registry'] = array( @@ -148,6 +163,43 @@ function update_prepare_d7_bootstrap() { db_create_table('registry_file', $schema['registry_file']); } + // Older versions of Drupal 6 do not include the semaphore table, which is + // required to bootstrap, so we add it now so that we can bootstrap and provide + // a reasonable error message. + if (!db_table_exists('semaphore')) { + $semaphore = array( + 'description' => 'Table for holding semaphores, locks, flags, etc. that cannot be stored as Drupal variables since they must not be cached.', + 'fields' => array( + 'name' => array( + 'description' => 'Primary Key: Unique name.', + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '' + ), + 'value' => array( + 'description' => 'A value for the semaphore.', + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '' + ), + 'expire' => array( + 'description' => 'A Unix timestamp with microseconds indicating when the semaphore should expire.', + 'type' => 'float', + 'size' => 'big', + 'not null' => TRUE + ), + ), + 'indexes' => array( + 'value' => array('value'), + 'expire' => array('expire'), + ), + 'primary key' => array('name'), + ); + db_create_table('semaphore', $semaphore); + } + // The new cache_bootstrap bin is required to bootstrap to // DRUPAL_BOOTSTRAP_SESSION, so create it here rather than in // update_fix_d7_requirements(). @@ -436,7 +488,7 @@ function update_fix_d7_requirements() { db_create_table('role_permission', $schema['role_permission']); // Drops and recreates semaphore value index. - db_drop_index('semaphore', 'expire'); + db_drop_index('semaphore', 'value'); db_add_index('semaphore', 'value', array('value')); $schema['date_format_type'] = array( diff --git a/update.php b/update.php index a9bc48b8d..0ade03cc2 100644 --- a/update.php +++ b/update.php @@ -28,6 +28,16 @@ define('DRUPAL_ROOT', getcwd()); */ define('MAINTENANCE_MODE', 'update'); +/** + * Minimum schema version of Drupal 6 required for upgrade to Drupal 7. + * + * Upgrades from Drupal 6 to Drupal 7 require that Drupal 6 be running + * the most recent version, or the upgrade could fail. We can't easily + * check the Drupal 6 version once the update process has begun, so instead + * we check the schema version of system.module in the system table. + */ +define('REQUIRED_D6_SCHEMA_VERSION', '6055'); + function update_selection_page() { drupal_set_title('Drupal database update'); $elements = drupal_get_form('update_script_selection_form'); -- cgit v1.2.3