summaryrefslogtreecommitdiff
path: root/modules/field
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2010-09-29 19:46:40 +0000
committerDries Buytaert <dries@buytaert.net>2010-09-29 19:46:40 +0000
commit0a8e9c5b20c09e896f7627a15b5cf817e9ed5f9e (patch)
tree1d2b9ace8b4387e78ccede842f4ab8a1a11f2ed4 /modules/field
parenta6a4073b808b6af1b6e60f7a82666a1ccfd405c2 (diff)
downloadbrdo-0a8e9c5b20c09e896f7627a15b5cf817e9ed5f9e.tar.gz
brdo-0a8e9c5b20c09e896f7627a15b5cf817e9ed5f9e.tar.bz2
- Patch #898558 by Damien Tournoud, chx, ksenzee: clean-up the upgrade path: node.
Diffstat (limited to 'modules/field')
-rw-r--r--modules/field/field.install23
-rw-r--r--modules/field/modules/field_sql_storage/field_sql_storage.install80
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"
+ */