Issue #1943494 by swentel: Use batch in field_sql_storage_update_8000().

8.0.x
webchick 2013-03-26 22:59:14 -07:00
parent 0a65061eee
commit 20c925a32e
1 changed files with 40 additions and 30 deletions

View File

@ -82,44 +82,52 @@ function _update_8000_field_sql_storage_write($entity_type, $bundle, $entity_id,
* Changes field language into langcode.
*/
function field_sql_storage_update_8000(&$sandbox) {
// Prepare updated schema data structures.
$primary_key_data = array (
'entity_type',
'entity_id',
'deleted',
'delta',
'langcode',
);
$primary_key_revision = array (
'entity_type',
'entity_id',
'revision_id',
'deleted',
'delta',
'langcode',
);
$langcode_index = array(
'langcode',
);
$field_langcode = array(
'type' => 'varchar',
'length' => 32,
'not null' => true,
'default' => '',
);
if (!isset($sandbox['progress'])) {
$sandbox['progress'] = 0;
$sandbox['last'] = 0;
$sandbox['max'] = db_query("SELECT COUNT(id) FROM {field_config} WHERE storage_type = 'field_sql_storage'")->fetchField();
}
// Retrieve field data.
$fields = _update_7000_field_read_fields(array('storage_type' => 'field_sql_storage'));
$field = db_query("SELECT id, field_name, deleted FROM {field_config} WHERE id > :id AND storage_type = 'field_sql_storage'", array(':id' => $sandbox['last']))->fetchAssoc();
if ($field) {
$sandbox['progress']++;
$sandbox['last'] = $field['id'];
// Prepare updated schema data structures.
$primary_key_data = array (
'entity_type',
'entity_id',
'deleted',
'delta',
'langcode',
);
$primary_key_revision = array (
'entity_type',
'entity_id',
'revision_id',
'deleted',
'delta',
'langcode',
);
$langcode_index = array(
'langcode',
);
$field_langcode = array(
'type' => 'varchar',
'length' => 32,
'not null' => true,
'default' => '',
);
// Update schema.
foreach ($fields as $field) {
$data_table = _field_sql_storage_tablename($field);
$revision_table = _field_sql_storage_revision_tablename($field);
$table_info = array($data_table => $primary_key_data, $revision_table => $primary_key_revision);
foreach ($table_info as $table => $primary_key) {
// Do not attempt to rename the 'language' column for fields that already
// contain it (created during the upgrade before this update function).
// Do not update tables which already have the langcode column,
// created during the upgrade before this update function.
if (db_field_exists($table, 'language')) {
db_drop_primary_key($table);
db_drop_index($table, 'language');
@ -129,4 +137,6 @@ function field_sql_storage_update_8000(&$sandbox) {
}
}
}
$sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
}