Commit 5926980b authored by webchick's avatar webchick

#895176 by ksenzee, dereine, mongolito404, Berdir, moshe weitzman, chx: Fixed...

#895176 by ksenzee, dereine, mongolito404, Berdir, moshe weitzman, chx: Fixed upgrade fails because of integrity constraint violation in system_update_7060.
parent f1a6b0e9
...@@ -42,3 +42,4 @@ files[] = tests/upgrade/upgrade.test ...@@ -42,3 +42,4 @@ files[] = tests/upgrade/upgrade.test
files[] = tests/upgrade/upgrade.comment.test files[] = tests/upgrade/upgrade.comment.test
files[] = tests/upgrade/upgrade.node.test files[] = tests/upgrade/upgrade.node.test
files[] = tests/upgrade/upgrade.taxonomy.test files[] = tests/upgrade/upgrade.taxonomy.test
files[] = tests/upgrade/upgrade.upload.test
<?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();
<?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.');
}
}
}
...@@ -2586,132 +2586,169 @@ function system_update_7059() { ...@@ -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')) { if (!db_table_exists('upload')) {
return; return;
} }
if (!isset($sandbox['progress'])) { // Check which node types have upload.module attachments enabled.
// Initialize batch update information. $context['types'] = array();
$sandbox['progress'] = 0; foreach (_update_7000_node_get_types() as $node_type) {
$sandbox['last_vid_processed'] = -1; if (variable_get('upload_' . $node_type->type, 0)) {
$sandbox['max'] = db_query("SELECT COUNT(DISTINCT u.vid) FROM {upload} u")->fetchField(); $context['types'][$node_type->type] = $node_type->type;
// 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);
} }
}
// The {upload} table will be deleted when this update is complete so we // 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 // 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 // may have had attachments disabled after files were uploaded. Look for
// any other node types referenced by the upload records and add those to // any other node types referenced by the upload records and add those to
// the list. The admin can always remove the field later. // 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'); $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) { foreach ($results as $row) {
if (!isset($context['types'][$row->type])) { 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))); 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; $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 $upload_size = variable_get('upload_uploadsize_default', 1);
// uploads enabled, then add an instance to each enabled type. $instance = array(
if (count($context['types']) > 0) { 'field_name' => 'upload',
module_enable(array('file')); 'entity_type' => 'node',
module_load_include('inc', 'field', 'field.crud'); 'bundle' => NULL,
'label' => 'File attachments',
$field = array( 'required' => 0,
'field_name' => 'file', 'description' => '',
'type' => 'file', 'widget' => array(
'locked' => FALSE, 'weight' => '1',
'cardinality' => FIELD_CARDINALITY_UNLIMITED,
'translatable' => FALSE,
'settings' => array( 'settings' => array(
'display_field' => 1, 'progress_indicator' => 'throbber',
'display_default' => variable_get('upload_list_default', 1),
'uri_scheme' => file_default_scheme(),
'default_file' => 0,
), ),
); 'type' => 'file_generic',
),
$upload_size = variable_get('upload_uploadsize_default', 1); 'settings' => array(
$instance = array( 'max_filesize' => $upload_size ? ($upload_size . ' MB') : '',
'field_name' => 'file', 'file_extensions' => variable_get('upload_extensions_default', 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp'),
'entity_type' => 'node', 'file_directory' => '',
'bundle' => NULL, 'description_field' => 1,
'label' => 'File attachments', ),
'widget_type' => 'file_generic', 'display' => array(
'required' => 0, 'default' => array(
'description' => '', 'label' => 'hidden',
'widget' => array( 'type' => 'file_table',
'weight' => '1', 'settings' => array(),
'settings' => array( 'weight' => 0,
'progress_indicator' => 'throbber', 'module' => 'file',
),
'type' => 'file_generic',
), ),
'settings' => array( 'full' => array(
'max_filesize' => $upload_size ? ($upload_size . ' MB') : '', 'label' => 'hidden',
'file_extensions' => variable_get('upload_extensions_default', 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp'), 'type' => 'file_table',
'file_directory' => '', 'settings' => array(),
'description_field' => 1, 'weight' => 0,
'module' => 'file',
), ),
'display' => array( 'teaser' => array(
'full' => array( 'label' => 'hidden',
'label' => 'hidden', 'type' => 'hidden',
'type' => 'file_table', 'settings' => array(),
'settings' => array(), 'weight' => 0,
'weight' => 0, 'module' => NULL,
'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',
),
), ),
); '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. // Create the field.
$field = field_create_field($field);