From a895a366c56fc3a03303e5341e222b7ad097952b Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Sat, 9 Jan 2010 22:07:57 +0000
Subject: [PATCH] #563106 by quicksketch, scor, andypost, ctmattice1, catch,
 yched, adrian: Fix critical upgrade path bugs from Drupal 6 to Drupal 7

---
 includes/update.inc               | 26 +++++++++++++++++++
 modules/filter/filter.install     | 12 ++++-----
 modules/locale/locale.install     |  3 +--
 modules/node/node.install         | 13 +++++++++-
 modules/system/system.install     | 25 +-----------------
 modules/taxonomy/taxonomy.install | 42 +++++++++++++++++--------------
 modules/user/user.install         |  8 +++---
 7 files changed, 73 insertions(+), 56 deletions(-)

diff --git a/includes/update.inc b/includes/update.inc
index 28b4cbb8180f..97a878480415 100644
--- a/includes/update.inc
+++ b/includes/update.inc
@@ -178,6 +178,7 @@ function update_fix_d7_requirements() {
     // Add the cache_path table.
     $schema['cache_path'] = drupal_get_schema_unprocessed('system', 'cache');
     $schema['cache_path']['description'] = 'Cache table used for path alias lookups.';
+    db_create_table('cache_path', $schema['cache_path']);
 
     // system_update_7042() renames columns, but these are needed to bootstrap.
     // Add empty columns for now.
@@ -250,6 +251,31 @@ function update_fix_d7_requirements() {
     );
     db_create_table('semaphore', $schema['semaphore']);
 
+    // Add registry tables since these are required during an update.
+    $schema['registry'] = array(
+      'fields' => array(
+        'name'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+        'type'   => array('type' => 'varchar', 'length' => 9, 'not null' => TRUE, 'default' => ''),
+        'filename'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+        'module'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+        'weight'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      ),
+      'primary key' => array('name', 'type'),
+      'indexes' => array(
+        'hook' => array('type', 'weight', 'module'),
+      ),
+    );
+    $schema['registry_file'] = array(
+      'fields' => array(
+        'filename'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
+        'filectime'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+        'filemtime'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      ),
+      'primary key' => array('filename'),
+    );
+    db_create_table('registry', $schema['registry']);
+    db_create_table('registry_file', $schema['registry_file']);
+
     $schema['date_format_type'] = array(
       'description' => 'Stores configured date format types.',
       'fields' => array(
diff --git a/modules/filter/filter.install b/modules/filter/filter.install
index e73149bca025..6fd3701daab3 100644
--- a/modules/filter/filter.install
+++ b/modules/filter/filter.install
@@ -234,7 +234,7 @@ function filter_update_7004() {
 
   // Enable all existing filters ({filter} contained only enabled previously).
   db_update('filter')
-    ->fields('status', '1')
+    ->fields(array('status' => '1'))
     ->execute();
 
   // Move filter settings from system variables into {filter}.settings.
@@ -262,11 +262,11 @@ function filter_update_7004() {
       }
     }
     if (!empty($settings)) {
-    	db_upddate('filter')
-    	  ->fields(array('settings' => serialize($settings)))
-    	  ->condition('format', $filter->format)
-    	  ->condition('name', $filter->name)
-    	  ->execute();
+      db_update('filter')
+        ->fields(array('settings' => serialize($settings)))
+        ->condition('format', $filter->format)
+        ->condition('name', $filter->name)
+        ->execute();
     }
   }
 }
diff --git a/modules/locale/locale.install b/modules/locale/locale.install
index fc8307ad9caf..93c0eb6dcded 100644
--- a/modules/locale/locale.install
+++ b/modules/locale/locale.install
@@ -33,10 +33,9 @@ function locale_install() {
  */
 
 /**
- * Add context field and allow longer location.
+ * Add context field index and allow longer location.
  */
 function locale_update_7000() {
-  db_add_field('locales_source', 'context', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
   db_drop_index('locales_source', 'source');
   db_add_index('locales_source', 'source_context', array(array('source', 30), 'context'));
   db_change_field('locales_source', 'location', 'location', array('type' => 'text', 'size' => 'big', 'not null' => FALSE));
diff --git a/modules/node/node.install b/modules/node/node.install
index 9aee19f056ce..9f6599078d08 100644
--- a/modules/node/node.install
+++ b/modules/node/node.install
@@ -369,6 +369,9 @@ function node_update_7000() {
     ->fields(array('module' => 'node_content'))
     ->condition('module', 'node')
     ->execute();
+
+  // Rename the module column to base.
+  db_change_field('node_type', 'module', 'base', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE));
 }
 
 /**
@@ -434,6 +437,8 @@ function node_update_7005() {
  * Convert body and teaser from node properties to fields, and migrate status/comment/promote and sticky columns to the {node_revision} table.
  */
 function node_update_7006(&$context) {
+  taxonomy_update_7002();
+
   $context['#finished'] = 0;
 
   // Get node type info for every invocation.
@@ -461,6 +466,12 @@ function node_update_7006(&$context) {
   else {
     // Subsequent invocations.
 
+    // Save the field IDs for field_sql_storage_field_storage_write().
+    $title_field = field_info_field('title');
+    $title_field_id = $title_field['id'];
+    $body_field = field_info_field('body');
+    $body_field_id = $body_field['id'];
+
     $found = FALSE;
     if ($context['total']) {
       // Operate on every revision of every node (whee!), in batches.
@@ -507,7 +518,7 @@ function node_update_7006(&$context) {
           $node->body[LANGUAGE_NONE][0]['format'] = !empty($revision->format) ? $revision->format : variable_get('filter_default_format', 1);
           // This is a core update and no contrib modules are enabled yet, so
           // we can assume default field storage for a faster update.
-          field_sql_storage_field_storage_write('node', $node, FIELD_STORAGE_INSERT, array());
+          field_sql_storage_field_storage_write('node', $node, FIELD_STORAGE_INSERT, array($title_field_id, $body_field_id));
         }
 
         // Migrate the status columns to the {node_revision} table.
diff --git a/modules/system/system.install b/modules/system/system.install
index 9b155b702a6d..a272b4142a37 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -1853,30 +1853,7 @@ function system_update_7005() {
  * longer needed.
  */
 function system_update_7006() {
-  $schema['registry'] = array(
-    'fields' => array(
-      'name'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
-      'type'   => array('type' => 'varchar', 'length' => 9, 'not null' => TRUE, 'default' => ''),
-      'filename'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
-      'module'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
-      'weight'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
-    ),
-    'primary key' => array('name', 'type'),
-    'indexes' => array(
-      'hook' => array('type', 'weight', 'module'),
-    ),
-  );
-  $schema['registry_file'] = array(
-    'fields' => array(
-      'filename'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
-      'filectime'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
-      'filemtime'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
-    ),
-    'primary key' => array('filename'),
-  );
-  db_create_table('registry', $schema['registry']);
-  db_create_table('registry_file', $schema['registry_file']);
-  registry_rebuild();
+  // Update moved to update_fix_d7_requirements().
 }
 
 /**
diff --git a/modules/taxonomy/taxonomy.install b/modules/taxonomy/taxonomy.install
index 22d1587c04ff..3f2a656398b3 100644
--- a/modules/taxonomy/taxonomy.install
+++ b/modules/taxonomy/taxonomy.install
@@ -208,26 +208,30 @@ function taxonomy_schema() {
 }
 
 /**
- * Add vocabulary machine_name column.
+ * Add {vocabulary}.machine_name column.
  */
 function taxonomy_update_7002() {
-  $field = array(
-    'type' => 'varchar',
-    'length' => 255,
-    'not null' => TRUE,
-    'default' => '',
-    'description' => 'The vocabulary machine name.',
-  );
+  if (!variable_get('taxonomy_update_7002_done', FALSE)) {
+    $field = array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+      'description' => 'The vocabulary machine name.',
+    );
 
-  db_add_field('taxonomy_vocabulary', 'machine_name', $field);
+    db_add_field('taxonomy_vocabulary', 'machine_name', $field);
+
+    foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
+      $machine_name = 'vocabulary_' . $vid;
+      db_update('taxonomy_vocabulary')
+        ->fields(array('machine_name' => 'vocabulary_' . $vid))
+        ->condition('vid', $vid)
+        ->execute();
+      field_attach_create_bundle('taxonomy_term', $machine_name);
+    }
 
-  foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
-    $machine_name = 'vocabulary_' . $vid;
-    db_update('taxonomy_vocabulary')
-      ->fields(array('machine_name' => 'vocabulary_' . $vid))
-      ->condition('vid', $vid)
-      ->execute();
-    field_attach_create_bundle('taxonomy_term', $machine_name);
+    variable_set('taxonomy_update_7002_done', TRUE);
   }
 }
 
@@ -309,7 +313,7 @@ function taxonomy_update_7004() {
     $field_name = 'taxonomy_' . $vocabulary->machine_name;
     $field = array(
       'field_name' => $field_name,
-      'type' => 'taxonomy_term',
+      'type' => 'taxonomy_term_reference',
       'cardinality' => $vocabulary->multiple || $vocabulary->tags ? FIELD_CARDINALITY_UNLIMITED : 1,
       'settings' => array(
         'required' => $vocabulary->required ? TRUE : FALSE,
@@ -410,7 +414,7 @@ function taxonomy_update_7005(&$sandbox) {
 }
 
 /**
- * Add vocabulary machine_name column.
+ * Add {taxonomy_term_data}.format column.
  */
 function taxonomy_update_7006() {
   db_add_field('taxonomy_term_data', 'format', array(
@@ -423,7 +427,7 @@ function taxonomy_update_7006() {
 }
 
 /**
- * Add index on taxonomy_term_data.name column to speed up taxonomy_get_term_by_name().
+ * Add index on {taxonomy_term_data}.name column to speed up taxonomy_get_term_by_name().
  */
 function taxonomy_update_7007() {
   db_add_index('taxonomy_term_data', 'name', array('name'));
diff --git a/modules/user/user.install b/modules/user/user.install
index 1f57dac91524..76c376c8635f 100644
--- a/modules/user/user.install
+++ b/modules/user/user.install
@@ -427,13 +427,13 @@ function user_update_7004(&$sandbox) {
     // Initialize batch update information.
     $sandbox['progress'] = 0;
     $sandbox['last_user_processed'] = -1;
-    $sandbox['max'] = db_query("SELECT COUNT(*) FROM {user} WHERE picture <> ''")->fetchField();
+    $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} WHERE picture <> ''")->fetchField();
   }
 
   // As a batch operation move the photos into the {file} table and update the
   // {users} records.
   $limit = 500;
-  $result = db_query_range("SELECT uid, picture FROM {user} WHERE picture <> '' AND uid > :uid ORDER BY uid", 0, $limit, array(':uid' => $sandbox['last_user_processed']));
+  $result = db_query_range("SELECT uid, picture FROM {users} WHERE picture <> '' AND uid > :uid ORDER BY uid", 0, $limit, array(':uid' => $sandbox['last_user_processed']));
   foreach ($result as $user) {
     // Don't bother adding files that don't exist.
     if (!file_exists($user->picture)) {
@@ -473,8 +473,8 @@ function user_update_7004(&$sandbox) {
   // When we're finished, drop the old picture field and rename the new one to
   // replace it.
   if (isset($sandbox['#finished']) && $sandbox['#finished'] == 1) {
-    db_drop_field('user', 'picture');
-    db_change_field('user', 'picture_fid', 'picture', $picture_field);
+    db_drop_field('users', 'picture');
+    db_change_field('users', 'picture_fid', 'picture', $picture_field);
   }
 }
 
-- 
GitLab