diff options
author | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-10-03 23:19:52 +0000 |
---|---|---|
committer | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-10-03 23:19:52 +0000 |
commit | 5926980b961164edc9a2d152e4d24e045d70fd47 (patch) | |
tree | 3caed3f8dc16df8d3e23dee450ec85e1f6a5684f | |
parent | f1a6b0e926b2eec90929496fd0380025cc558bcb (diff) | |
download | brdo-5926980b961164edc9a2d152e4d24e045d70fd47.tar.gz brdo-5926980b961164edc9a2d152e4d24e045d70fd47.tar.bz2 |
#895176 by ksenzee, dereine, mongolito404, Berdir, moshe weitzman, chx: Fixed upgrade fails because of integrity constraint violation in system_update_7060.
-rw-r--r-- | modules/simpletest/simpletest.info | 1 | ||||
-rw-r--r-- | modules/simpletest/tests/upgrade/drupal-6.upload.database.php | 358 | ||||
-rw-r--r-- | modules/simpletest/tests/upgrade/upgrade.upload.test | 66 | ||||
-rw-r--r-- | modules/system/system.install | 290 |
4 files changed, 590 insertions, 125 deletions
diff --git a/modules/simpletest/simpletest.info b/modules/simpletest/simpletest.info index 139e49cd0..c7e113ac9 100644 --- a/modules/simpletest/simpletest.info +++ b/modules/simpletest/simpletest.info @@ -42,3 +42,4 @@ files[] = tests/upgrade/upgrade.test files[] = tests/upgrade/upgrade.comment.test files[] = tests/upgrade/upgrade.node.test files[] = tests/upgrade/upgrade.taxonomy.test +files[] = tests/upgrade/upgrade.upload.test diff --git a/modules/simpletest/tests/upgrade/drupal-6.upload.database.php b/modules/simpletest/tests/upgrade/drupal-6.upload.database.php new file mode 100644 index 000000000..048aee0c4 --- /dev/null +++ b/modules/simpletest/tests/upgrade/drupal-6.upload.database.php @@ -0,0 +1,358 @@ +<?php +// $Id$ + +db_insert('files')->fields(array( + 'fid', + 'uid', + 'filename', + 'filepath', + 'filemime', + 'filesize', + 'status', + 'timestamp', +)) +->values(array( + 'fid' => '1', + 'uid' => '1', + 'filename' => 'powered-blue-80x15.png', + 'filepath' => 'sites/default/files/powered-blue-80x15.png', + 'filemime' => 'image/png', + 'filesize' => '1011', + 'status' => '1', + 'timestamp' => '1285700240', +)) +->values(array( + 'fid' => '2', + 'uid' => '1', + 'filename' => 'powered-blue-80x15.png', + 'filepath' => 'sites/default/files/powered-blue-80x15_0.png', + 'filemime' => 'image/png', + 'filesize' => '1011', + 'status' => '1', + 'timestamp' => '1285700317', +)) +->values(array( + 'fid' => '3', + 'uid' => '1', + 'filename' => 'powered-blue-88x31.png', + 'filepath' => 'sites/default/files/powered-blue-88x31.png', + 'filemime' => 'image/png', + 'filesize' => '2113', + 'status' => '1', + 'timestamp' => '1285700343', +)) +->values(array( + 'fid' => '4', + 'uid' => '1', + 'filename' => 'powered-blue-135x42.png', + 'filepath' => 'sites/default/files/powered-blue-135x42.png', + 'filemime' => 'image/png', + 'filesize' => '3027', + 'status' => '1', + 'timestamp' => '1285700366', +)) +->values(array( + 'fid' => '5', + 'uid' => '1', + 'filename' => 'powered-black-80x15.png', + 'filepath' => 'sites/default/files/powered-black-80x15.png', + 'filemime' => 'image/png', + 'filesize' => '1467', + 'status' => '1', + 'timestamp' => '1285700529', +)) +->values(array( + 'fid' => '6', + 'uid' => '1', + 'filename' => 'powered-black-135x42.png', + 'filepath' => 'sites/default/files/powered-black-135x42.png', + 'filemime' => 'image/png', + 'filesize' => '2817', + 'status' => '1', + 'timestamp' => '1285700552', +)) +->values(array( + 'fid' => '7', + 'uid' => '1', + 'filename' => 'forum-hot-new.png', + 'filepath' => 'sites/default/files/forum-hot-new.png', + 'filemime' => 'image/png', + 'filesize' => '237', + 'status' => '1', + 'timestamp' => '1285708937', +)) +->values(array( + 'fid' => '8', + 'uid' => '1', + 'filename' => 'forum-hot.png', + 'filepath' => 'sites/default/files/forum-hot.png', + 'filemime' => 'image/png', + 'filesize' => '229', + 'status' => '1', + 'timestamp' => '1285708944', +)) +->values(array( + 'fid' => '9', + 'uid' => '1', + 'filename' => 'forum-new.png', + 'filepath' => 'sites/default/files/forum-new.png', + 'filemime' => 'image/png', + 'filesize' => '175', + 'status' => '1', + 'timestamp' => '1285708950', +)) +->values(array( + 'fid' => '10', + 'uid' => '1', + 'filename' => 'forum-sticky.png', + 'filepath' => 'sites/default/files/forum-sticky.png', + 'filemime' => 'image/png', + 'filesize' => '329', + 'status' => '1', + 'timestamp' => '1285708957', +)) +->execute(); + +db_insert('node')->fields(array( + 'nid', + 'vid', + 'type', + 'language', + 'title', + 'uid', + 'status', + 'created', + 'changed', + 'comment', + 'promote', + 'moderate', + 'sticky', + 'tnid', + 'translate', +)) +->values(array( + 'nid' => '38', + 'vid' => '51', + 'type' => 'page', + 'language' => '', + 'title' => 'node title 38 revision 51', + 'uid' => '1', + 'status' => '1', + 'created' => '1285700317', + 'changed' => '1285700600', + 'comment' => '0', + 'promote' => '0', + 'moderate' => '0', + 'sticky' => '0', + 'tnid' => '0', + 'translate' => '0', +)) +->values(array( + 'nid' => '39', + 'vid' => '52', + 'type' => 'page', + 'language' => '', + 'title' => 'node title 39 revision 53', + 'uid' => '1', + 'status' => '1', + 'created' => '1285709012', + 'changed' => '1285709012', + 'comment' => '0', + 'promote' => '0', + 'moderate' => '0', + 'sticky' => '0', + 'tnid' => '0', + 'translate' => '0', +)) + ->execute(); + +db_insert('node_revisions')->fields(array( + 'nid', + 'vid', + 'uid', + 'title', + 'body', + 'teaser', + 'log', + 'timestamp', + 'format', +)) +->values(array( + 'nid' => '38', + 'vid' => '50', + 'uid' => '1', + 'title' => 'node title 38 revision 50', + 'body' => "Attachments:\r\npowered-blue-80x15.png\r\npowered-blue-88x31.png\r\npowered-blue-135x42.png", + 'teaser' => "Attachments:\r\npowered-blue-80x15.png\r\npowered-blue-88x31.png\r\npowered-blue-135x42.png", + 'log' => '', + 'timestamp' => '1285700487', + 'format' => '1', +)) +->values(array( + 'nid' => '38', + 'vid' => '51', + 'uid' => '1', + 'title' => 'node title 38 revision 51', + 'body' => "Attachments:\r\npowered-blue-88x31.png\r\npowered-black-80x15.png\r\npowered-black-135x42.png", + 'teaser' => "Attachments:\r\npowered-blue-88x31.png\r\npowered-black-80x15.png\r\npowered-black-135x42.png", + 'log' => '', + 'timestamp' => '1285700600', + 'format' => '1', +)) +->values(array( + 'nid' => '39', + 'vid' => '52', + 'uid' => '1', + 'title' => 'node title 39 revision 53', + 'body' => "Attachments:\r\nforum-hot-new.png\r\nforum-hot.png\r\nforum-sticky.png\r\nforum-new.png", + 'teaser' => "Attachments:\r\nforum-hot-new.png\r\nforum-hot.png\r\nforum-sticky.png\r\nforum-new.png", + 'log' => '', + 'timestamp' => '1285709012', + 'format' => '1', +)) + ->execute(); + +db_create_table('upload', array( + 'fields' => array( + 'fid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'nid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'vid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'description' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'list' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'size' => 'tiny', + ), + 'weight' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'size' => 'tiny', + ), + ), + 'primary key' => array( + 'vid', + 'fid', + ), + 'indexes' => array( + 'fid' => array( + 'fid', + ), + 'nid' => array( + 'nid', + ), + ), + 'module' => 'upload', + 'name' => 'upload', +)); +db_insert('upload')->fields(array( + 'fid', + 'nid', + 'vid', + 'description', + 'list', + 'weight', +)) +->values(array( + 'fid' => '2', + 'nid' => '38', + 'vid' => '50', + 'description' => 'powered-blue-80x15.png', + 'list' => '1', + 'weight' => '0', +)) +->values(array( + 'fid' => '3', + 'nid' => '38', + 'vid' => '50', + 'description' => 'powered-blue-88x31.png', + 'list' => '1', + 'weight' => '0', +)) +->values(array( + 'fid' => '4', + 'nid' => '38', + 'vid' => '50', + 'description' => 'powered-blue-135x42.png', + 'list' => '1', + 'weight' => '0', +)) +->values(array( + 'fid' => '3', + 'nid' => '38', + 'vid' => '51', + 'description' => 'powered-blue-88x31.png', + 'list' => '1', + 'weight' => '0', +)) +->values(array( + 'fid' => '5', + 'nid' => '38', + 'vid' => '51', + 'description' => 'powered-black-80x15.png', + 'list' => '1', + 'weight' => '0', +)) +->values(array( + 'fid' => '6', + 'nid' => '38', + 'vid' => '51', + 'description' => 'powered-black-135x42.png', + 'list' => '1', + 'weight' => '0', +)) +->values(array( + 'fid' => '7', + 'nid' => '39', + 'vid' => '52', + 'description' => 'forum-hot-new.png', + 'list' => '1', + 'weight' => '-4', +)) +->values(array( + 'fid' => '8', + 'nid' => '39', + 'vid' => '52', + 'description' => 'forum-hot.png', + 'list' => '1', + 'weight' => '-3', +)) +->values(array( + 'fid' => '10', + 'nid' => '39', + 'vid' => '52', + 'description' => 'forum-sticky.png', + 'list' => '1', + 'weight' => '-2', +)) +->values(array( + 'fid' => '9', + 'nid' => '39', + 'vid' => '52', + 'description' => 'forum-new.png', + 'list' => '1', + 'weight' => '-1', +)) +->execute(); diff --git a/modules/simpletest/tests/upgrade/upgrade.upload.test b/modules/simpletest/tests/upgrade/upgrade.upload.test new file mode 100644 index 000000000..efbff1114 --- /dev/null +++ b/modules/simpletest/tests/upgrade/upgrade.upload.test @@ -0,0 +1,66 @@ +<?php +// $Id$ + +/** + * Upgrade test for comment.module. + */ +class UploadUpgradePathTestCase extends UpgradePathTestCase { + public static function getInfo() { + return array( + 'name' => 'Upload upgrade path', + 'description' => 'Upload upgrade path tests.', + 'group' => 'Upgrade path', + ); + } + + public function setUp() { + // Path to the database dump files. + $this->databaseDumpFiles = array( + drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php', + drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.upload.database.php', + ); + parent::setUp(); + + $this->uninstallModulesExcept(array('upload')); + } + + /** + * Test a successful upgrade. + */ + public function testUploadUpgrade() { + $this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.')); + $query = new EntityFieldQuery(); + $query->entityCondition('entity_type', 'node'); + $query->entityCondition('bundle', 'page'); + $query->age(FIELD_LOAD_REVISION); + $query->fieldCondition('upload'); + $entities = $query->execute(); + $revisions = $entities['node']; + // Node revisions 50-52 should have uploaded files. + $this->assertTrue((isset($revisions[50]) && isset($revisions[51]) && isset($revisions[52])), 'Nodes with uploaded files now contain filefield data.'); + // The test database lists uploaded filenames in the body of each node with + // uploaded files attached. Make sure all files are there in the same order. + foreach ($revisions as $vid => $revision) { + $node = node_load($revision->nid, $vid); + + // Assemble a list of the filenames as recorded in the node body before + // the upgrade. + $recorded_filenames = preg_split('/\s+/', $node->body[LANGUAGE_NONE][0]['value']); + // The first line of the node body should be "Attachments:" + if (strstr($recorded_filenames[0], "Attachments:")) { + unset($recorded_filenames[0]); + } + $recorded_filenames = array_values($recorded_filenames); + + $files = $node->upload[LANGUAGE_NONE]; + // Assemble a list of the filenames as they exist after the upgrade. + $filenames = array(); + foreach ($files as $file) { + $filenames[] = $file['filename']; + } + + $diff = array_diff($filenames, $recorded_filenames); + $this->assertTrue(empty($diff), 'The uploaded files are present in the same order after the upgrade.'); + } + } +} diff --git a/modules/system/system.install b/modules/system/system.install index 4caeaa94e..97e058e86 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -2586,132 +2586,169 @@ function system_update_7059() { } /** - * Migrate upload.module to file.module. + * Create fields in preparation for migrating upload.module to file.module. */ -function system_update_7060(&$sandbox) { +function system_update_7060() { if (!db_table_exists('upload')) { return; } - if (!isset($sandbox['progress'])) { - // Initialize batch update information. - $sandbox['progress'] = 0; - $sandbox['last_vid_processed'] = -1; - $sandbox['max'] = db_query("SELECT COUNT(DISTINCT u.vid) FROM {upload} u")->fetchField(); - - // Check which node types have upload.module attachments enabled. - $context['types'] = array(); - foreach (node_type_get_types() as $node_type => $node_info) { - if (variable_get('upload_' . $node_type, 1)) { - $context['types'][$node_type] = $node_type; - } - variable_del('upload_' . $node_type); + // Check which node types have upload.module attachments enabled. + $context['types'] = array(); + foreach (_update_7000_node_get_types() as $node_type) { + if (variable_get('upload_' . $node_type->type, 0)) { + $context['types'][$node_type->type] = $node_type->type; } + } - // The {upload} table will be deleted when this update is complete so we - // want to be careful to migrate all the data, even for node types that - // may have had attachments disabled after files were uploaded. Look for - // any other node types referenced by the upload records and add those to - // the list. The admin can always remove the field later. - $results = db_query('SELECT DISTINCT type FROM {node} n INNER JOIN {upload} u ON n.vid = u.vid'); - foreach ($results as $row) { - if (!isset($context['types'][$row->type])) { - drupal_set_message(t('The content type %rowtype had uploads disabled but contained uploaded file data. Uploads have been re-enabled to migrate the existing data. You may delete the "File attachments" field in the %rowtype type if this data is not necessary.', array('%rowtype' => $row->type))); - $context['types'][$row->type] = $row->type; - } + // The {upload} table will be deleted when this update is complete so we + // want to be careful to migrate all the data, even for node types that + // may have had attachments disabled after files were uploaded. Look for + // any other node types referenced by the upload records and add those to + // the list. The admin can always remove the field later. + $results = db_query('SELECT DISTINCT type FROM {node} n INNER JOIN {node_revision} nr ON n.nid = nr.nid INNER JOIN {upload} u ON nr.vid = u.vid'); + foreach ($results as $row) { + if (!isset($context['types'][$row->type])) { + drupal_set_message(t('The content type %rowtype had uploads disabled but contained uploaded file data. Uploads have been re-enabled to migrate the existing data. You may delete the "File attachments" field in the %rowtype type if this data is not necessary.', array('%rowtype' => $row->type))); + $context['types'][$row->type] = $row->type; } + } + + // Create a single "upload" field on all the content types that have uploads + // enabled, then add an instance to each enabled type. + if (count($context['types']) > 0) { + module_enable(array('file')); + $field = array( + 'field_name' => 'upload', + 'type' => 'file', + 'module' => 'file', + 'locked' => FALSE, + 'cardinality' => FIELD_CARDINALITY_UNLIMITED, + 'translatable' => FALSE, + 'settings' => array( + 'display_field' => 1, + 'display_default' => variable_get('upload_list_default', 1), + 'uri_scheme' => file_default_scheme(), + 'default_file' => 0, + ), + ); - // Create a single "field_upload" field on all the content types that have - // uploads enabled, then add an instance to each enabled type. - if (count($context['types']) > 0) { - module_enable(array('file')); - module_load_include('inc', 'field', 'field.crud'); - - $field = array( - 'field_name' => 'file', - 'type' => 'file', - 'locked' => FALSE, - 'cardinality' => FIELD_CARDINALITY_UNLIMITED, - 'translatable' => FALSE, + $upload_size = variable_get('upload_uploadsize_default', 1); + $instance = array( + 'field_name' => 'upload', + 'entity_type' => 'node', + 'bundle' => NULL, + 'label' => 'File attachments', + 'required' => 0, + 'description' => '', + 'widget' => array( + 'weight' => '1', 'settings' => array( - 'display_field' => 1, - 'display_default' => variable_get('upload_list_default', 1), - 'uri_scheme' => file_default_scheme(), - 'default_file' => 0, + 'progress_indicator' => 'throbber', ), - ); - - $upload_size = variable_get('upload_uploadsize_default', 1); - $instance = array( - 'field_name' => 'file', - 'entity_type' => 'node', - 'bundle' => NULL, - 'label' => 'File attachments', - 'widget_type' => 'file_generic', - 'required' => 0, - 'description' => '', - 'widget' => array( - 'weight' => '1', - 'settings' => array( - 'progress_indicator' => 'throbber', - ), - 'type' => 'file_generic', + 'type' => 'file_generic', + ), + 'settings' => array( + 'max_filesize' => $upload_size ? ($upload_size . ' MB') : '', + 'file_extensions' => variable_get('upload_extensions_default', 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp'), + 'file_directory' => '', + 'description_field' => 1, + ), + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'type' => 'file_table', + 'settings' => array(), + 'weight' => 0, + 'module' => 'file', ), - 'settings' => array( - 'max_filesize' => $upload_size ? ($upload_size . ' MB') : '', - 'file_extensions' => variable_get('upload_extensions_default', 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp'), - 'file_directory' => '', - 'description_field' => 1, + 'full' => array( + 'label' => 'hidden', + 'type' => 'file_table', + 'settings' => array(), + 'weight' => 0, + 'module' => 'file', ), - 'display' => array( - 'full' => array( - 'label' => 'hidden', - 'type' => 'file_table', - 'settings' => array(), - 'weight' => 0, - 'module' => 'file', - ), - 'teaser' => array( - 'label' => 'hidden', - 'type' => 'hidden', - 'settings' => array(), - 'weight' => 0, - 'module' => NULL, - ), - 'rss' => array( - 'label' => 'hidden', - 'type' => 'file_table', - 'settings' => array(), - 'weight' => 0, - 'module' => 'file', - ), + 'teaser' => array( + 'label' => 'hidden', + 'type' => 'hidden', + 'settings' => array(), + 'weight' => 0, + 'module' => NULL, ), - ); + 'rss' => array( + 'label' => 'hidden', + 'type' => 'file_table', + 'settings' => array(), + 'weight' => 0, + 'module' => 'file', + ), + ), + ); - // Create the field. Save the field id for the data insertion later on. - $field = field_create_field($field); - $sandbox['field_id'] = $field['id']; + // Create the field. + _update_7000_field_create_field($field); - // Create the instances. - foreach ($context['types'] as $bundle) { - $instance['bundle'] = $bundle; - field_create_instance($instance); - } - } - else { - // No uploads or content types with uploads enabled. - db_drop_table('upload'); - // We're done: return without specifying a #progress. - return; + // Create the instances. + foreach ($context['types'] as $bundle) { + $instance['bundle'] = $bundle; + _update_7000_field_create_instance($field, $instance); + // Now that the instance is created, we can safely delete any legacy + // node type information. + variable_del('upload_' . $bundle); } } + else { + // No uploads or content types with uploads enabled. + db_drop_table('upload'); + } +} - // Migrate a batch of files from the upload table to the appropriate field. - $limit = 500; - $result = db_query_range('SELECT DISTINCT u.fid, u.vid, u.list, u.description, n.nid, n.type FROM {upload} u INNER JOIN {node_revision} nr ON u.vid = nr.vid INNER JOIN {node} n ON n.nid = nr.nid WHERE u.vid > :lastvid ORDER BY u.vid, u.weight', 0, $limit, array(':lastvid' => $sandbox['last_vid_processed'])); +/** + * Migrate upload.module data to the newly created file field. + */ +function system_update_7061(&$sandbox) { + if (!db_table_exists('upload')) { + return; + } + + if (!isset($sandbox['progress'])) { + // Retrieve a list of node revisions that have uploaded files attached. + // DISTINCT queries are expensive, especially when paged, so we store the + // data in its own table for the duration of the update. + $table = array( + 'description' => t('Stores temporary data for system_update_7061.'), + 'fields' => array('vid' => array('type' => 'int')), + 'primary key' => array('vid'), + ); + db_create_table('system_update_7061', $table); + $query = db_select('upload', 'u'); + $query->distinct(); + $query->addField('u','vid'); + db_insert('system_update_7061') + ->from($query) + ->execute(); + + // Initialize batch update information. + $sandbox['progress'] = 0; + $sandbox['last_vid_processed'] = -1; + $sandbox['max'] = db_query("SELECT COUNT(*) FROM {system_update_7061}")->fetchField(); + } + + $node_revisions = array(); + + // Determine vids for this batch. + // Process all files attached to a given revision during the same batch. + $limit = 100; + $vids = db_query_range('SELECT vid FROM {system_update_7061} WHERE vid > :lastvid ORDER BY vid', 0, $limit, array(':lastvid' => $sandbox['last_vid_processed'])) + ->fetchCol(); + + // Retrieve information on all the files attached to these revisions. + $result = db_query('SELECT u.fid, u.vid, u.list, u.description, n.nid, n.type, u.weight FROM {upload} u INNER JOIN {node_revision} nr ON u.vid = nr.vid INNER JOIN {node} n ON n.nid = nr.nid WHERE u.vid IN (:vids) ORDER BY u.vid, u.weight, u.fid', array(':vids' => $vids)); foreach ($result as $record) { - // Note that we still reference the old files table here, since upload will - // not know about the new FID in the new file_managed table. + // For each uploaded file, retrieve the corresponding data from the old + // files table (since upload doesn't know about the new entry in the + // file_managed table). $file = db_select('files', 'f') ->fields('f', array('fid', 'uid', 'filename', 'filepath', 'filemime', 'filesize', 'status', 'timestamp')) ->condition('f.fid', $record->fid) @@ -2721,35 +2758,30 @@ function system_update_7060(&$sandbox) { continue; } + // Add in the file information from the upload table. $file['description'] = $record->description; $file['display'] = $record->list; + // Create one record for each revision that contains all the uploaded files. $node_revisions[$record->vid]['nid'] = $record->nid; $node_revisions[$record->vid]['vid'] = $record->vid; $node_revisions[$record->vid]['type'] = $record->type; $node_revisions[$record->vid]['file'][LANGUAGE_NONE][] = $file; } - // To make sure we process an entire node all at once, toss the last node - // revision (which might be partial) unless it's the last one. - if ((count($node_revisions) > 1) && ($result->rowCount() == $limit)) { - array_pop($node_revisions); - } - else { - $finished = TRUE; - } - + // Now that we know which files belong to which revisions, update the files' + // database entries, and save a reference to each file in the upload field on + // their node revisions. $basename = variable_get('file_directory_path', conf_path() . '/files'); $scheme = file_default_scheme() . '://'; foreach ($node_revisions as $vid => $revision) { - // We will convert filepaths to uri using the default scheme - // and stripping off the existing file directory path. - $fids = array(); foreach ($revision['file'][LANGUAGE_NONE] as $delta => $file) { - // Insert into the file_managed table. + // We will convert filepaths to uri using the default scheme + // and stripping off the existing file directory path. $file['uri'] = $scheme . str_replace($basename, '', $file['filepath']); $file['uri'] = file_stream_wrapper_uri_normalize($file['uri']); unset($file['filepath']); + // Insert into the file_managed table. // Each fid should only be stored once in file_managed. db_merge('file_managed') ->key(array( @@ -2766,26 +2798,34 @@ function system_update_7060(&$sandbox) { )) ->execute(); - // Update the node field with the file URI. - $revision['file'][LANGUAGE_NONE][$delta] = $file; - // Add the usage entry for the file. $file = (object) $file; file_usage_add($file, 'file', 'node', $revision['nid']); + + // Update the node revision's upload file field with the file data. + $revision['file'][LANGUAGE_NONE][$delta] = array('fid' => $file->fid, 'display' => $file->display, 'description' => $file->description); } - // Insert the revision's files into the field_upload table. + // Write the revision's upload field data into the field_upload tables. $node = (object) $revision; - field_sql_storage_field_storage_write('node', $node, FIELD_STORAGE_INSERT, array($sandbox['field_id'])); + _update_7000_field_sql_storage_write('node', $node->type, $node->nid, $node->vid, 'upload', $node->file); // Update our progress information for the batch update. $sandbox['progress']++; $sandbox['last_vid_processed'] = $vid; } + // If less than limit node revisions were processed, the update process is + // finished. + if (count($node_revisions) < $limit) { + $finished = TRUE; + } + + // If there's no max value then there's nothing to update and we're finished. if (empty($sandbox['max']) || isset($finished)) { db_drop_table('upload'); + db_drop_table('system_update_7061'); return t('Upload module has been migrated to File module.'); } else { @@ -2797,7 +2837,7 @@ function system_update_7060(&$sandbox) { /** * Replace 'system_list' index with 'bootstrap' index on {system}. */ -function system_update_7061() { +function system_update_7062() { db_drop_index('system', 'bootstrap'); db_drop_index('system', 'system_list'); db_add_index('system', 'system_list', array('status', 'bootstrap', 'type', 'weight', 'name')); |