Index: modules/field/field.crud.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.crud.inc,v retrieving revision 1.71 diff -u -p -r1.71 field.crud.inc --- modules/field/field.crud.inc 29 Sep 2010 01:37:02 -0000 1.71 +++ modules/field/field.crud.inc 15 Oct 2010 00:14:46 -0000 @@ -459,23 +459,28 @@ function field_update_field($field) { $storage_type = field_info_storage_types($field['storage']['type']); module_invoke($storage_type['module'], 'field_storage_update_field', $field, $prior_field, $has_data); - // Save the new field definition. @todo: refactor with - // field_create_field. + // Save the new field definition. + // Only $field['settings'] gets special treatment. All other field + // configuration data has to exist in $field['data'] already. + $field['data']['settings'] = $field['settings']; + $field['data'] = serialize($field['data']); - // The serialized 'data' column contains everything from $field that does not - // have its own column and is not automatically populated when the field is - // read. - $data = $field; - unset($data['columns'], $data['field_name'], $data['type'], $data['locked'], $data['module'], $data['cardinality'], $data['active'], $data['deleted']); - // Additionally, do not save the 'bundles' property populated by - // field_info_field(). - unset($data['bundles']); - - $field['data'] = $data; - - // Store the field and create the id. - $primary_key = array('id'); - drupal_write_record('field_config', $field, $primary_key); + db_update('field_config') + ->fields(array( + 'field_name' => $field['field_name'], + 'type' => $field['type'], + 'module' => $field['module'], + 'active' => $field['active'], + 'storage_type' => $field['storage']['type'], + 'storage_module' => $field['storage']['module'], + 'storage_active' => $field['storage']['active'], + 'locked' => $field['locked'], + 'cardinality' => $field['cardinality'], + 'translatable' => $field['translatable'], + 'data' => serialize($field['data']), + )) + ->condition('id', $field['id']) + ->execute(); // Clear caches field_cache_clear(TRUE); @@ -544,19 +549,16 @@ function field_read_fields($params = arr $fields = array(); $results = $query->execute(); foreach ($results as $record) { - $field = unserialize($record['data']); - $field['id'] = $record['id']; - $field['field_name'] = $record['field_name']; - $field['type'] = $record['type']; - $field['module'] = $record['module']; - $field['active'] = $record['active']; + $field = $record; + // Note that only $field['data'] and $field['settings'] is serialized back + // into 'data' upon save/update. + $field['data'] = unserialize($record['data']); + $field += $field['data']; + $field['storage']['type'] = $record['storage_type']; $field['storage']['module'] = $record['storage_module']; $field['storage']['active'] = $record['storage_active']; - $field['locked'] = $record['locked']; - $field['cardinality'] = $record['cardinality']; - $field['translatable'] = $record['translatable']; - $field['deleted'] = $record['deleted']; + unset($field['storage_type'], $field['storage_module'], $field['storage_active']); module_invoke_all('field_read_field', $field); Index: modules/field/field.info.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.info.inc,v retrieving revision 1.53 diff -u -p -r1.53 field.info.inc --- modules/field/field.info.inc 11 Sep 2010 00:03:42 -0000 1.53 +++ modules/field/field.info.inc 14 Oct 2010 23:38:34 -0000 @@ -255,7 +255,9 @@ function _field_info_collate_fields($res */ function _field_info_prepare_field($field) { // Make sure all expected field settings are present. + $field += array('settings' => array()); $field['settings'] += field_info_field_settings($field['type']); + $field['storage'] += array('settings' => array()); $field['storage']['settings'] += field_info_storage_settings($field['storage']['type']); // Add storage details.