diff options
Diffstat (limited to 'modules/field')
-rw-r--r-- | modules/field/field.install | 23 | ||||
-rw-r--r-- | modules/field/modules/field_sql_storage/field_sql_storage.install | 80 |
2 files changed, 94 insertions, 9 deletions
diff --git a/modules/field/field.install b/modules/field/field.install index 8a57d0089..91b0d210f 100644 --- a/modules/field/field.install +++ b/modules/field/field.install @@ -171,7 +171,8 @@ function field_schema() { /** * Utility function: create a field by writing directly to the database. * - * This function is valid for a database schema version 7000. + * This function can be used for databases whose schema is at field module + * version 7000 or higher. * * @ingroup update-api-6.x-to-7.x */ @@ -240,14 +241,15 @@ function _update_7000_field_create_field(&$field) { } /** - * Utility function: delete a field stored in SQL Storage directly from the database. + * Utility function: delete a field stored in SQL storage directly from the database. * * To protect user data, this function can only be used to delete fields once * all information it stored is gone. Delete all data from the * field_data_$field_name table before calling by either manually issuing * delete queries against it or using _update_7000_field_delete_instance(). * - * This function is valid for a database schema version 7000. + * This function can be used for databases whose schema is at field module + * version 7000 or higher. * * @param $field_name * The field name to delete. @@ -332,9 +334,10 @@ function _update_7000_field_read_fields() { } /** - * Utility function: create a field instance directly to the database. + * Utility function: write a field instance directly to the database. * - * This function is valid for a database schema version 7000. + * This function can be used for databases whose schema is at field module + * version 7000 or higher. * * @ingroup update-api-6.x-to-7.x */ @@ -374,10 +377,12 @@ function _update_7000_field_create_instance($field, &$instance) { * Field update version placeholder. */ function field_update_7000() { - // _update_7000_field_create_field() is supposed to create fields according - // to the structure of fields after running field_update_7000(). So this - // function needs to exist but as field is a new module in Drupal 7, it - // does not need to do anything. + // Some update helper functions (such as _update_7000_field_create_field()) + // modify the database directly. They can be used safely only if the database + // schema matches the field module schema established for Drupal 7.0 (i.e. + // version 7000). This function exists solely to set the schema version to + // 7000, so that update functions calling those helpers can do so safely + // by declaring a dependency on field_update_7000(). } /** diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.install b/modules/field/modules/field_sql_storage/field_sql_storage.install index 81a1dcf6f..92692a7e5 100644 --- a/modules/field/modules/field_sql_storage/field_sql_storage.install +++ b/modules/field/modules/field_sql_storage/field_sql_storage.install @@ -44,3 +44,83 @@ function field_sql_storage_schema() { } return $schema; } + +/** + * Utility function: write field data directly to SQL storage. + * + * This function can be used for databases whose schema is at field module + * version 7000 or higher. + * + * @ingroup update-api-6.x-to-7.x + */ +function _update_7000_field_sql_storage_write($entity_type, $bundle, $entity_id, $revision_id, $field_name, $data) { + $etid = _field_sql_storage_etid($entity_type); + $table_name = "field_data_{$field_name}"; + $revision_name = "field_revision_{$field_name}"; + + db_delete($table_name) + ->condition('etid', $etid) + ->condition('entity_id', $entity_id) + ->execute(); + db_delete($revision_name) + ->condition('etid', $etid) + ->condition('entity_id', $entity_id) + ->condition('revision_id', $revision_id) + ->execute(); + + $columns = array(); + foreach ($data as $langcode => $items) { + foreach ($items as $delta => $item) { + $record = array( + 'etid' => $etid, + 'entity_id' => $entity_id, + 'revision_id' => $revision_id, + 'bundle' => $bundle, + 'delta' => $delta, + 'language' => $langcode, + ); + foreach ($item as $column => $value) { + $record[_field_sql_storage_columnname($field_name, $column)] = $value; + } + + $records[] = $record; + // Record the columns used. + $columns += $record; + } + } + + if ($columns) { + $query = db_insert($table_name)->fields(array_keys($columns)); + $revision_query = db_insert($revision_name)->fields(array_keys($columns)); + foreach ($records as $record) { + $query->values($record); + if ($revision_id) { + $revision_query->values($record); + } + } + $query->execute(); + $revision_query->execute(); + } +} + +/** + * @defgroup field-sql-storage-updates-6.x-to-7.x Field SQL storage updates from 6.x to 7.x + * @{ + */ + +/** + * Field SQL storage update version placeholder. + */ +function field_sql_storage_update_7000() { + // Some update helper functions (such as + // _update_7000_field_sql_storage_write()) modify the database directly. They + // can be used safely only if the database schema matches the field module + // schema established for Drupal 7.0 (i.e. version 7000). This function exists + // solely to set the schema version to 7000, so that update functions calling + // those helpers can do so safely by declaring a dependency on + // field_sql_storage_update_7000(). +} + +/** + * @} End of "defgroup field-updates-6.x-to-7.x" + */ |