summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorDavid Rothstein <drothstein@gmail.com>2013-08-04 23:13:28 -0400
committerDavid Rothstein <drothstein@gmail.com>2013-08-04 23:13:28 -0400
commit9988e47d6d4f0c0f858af424d23bc6825c550b19 (patch)
tree34d8354807efd58680d3aaef29e189e70e6b58b5 /modules
parent2865cfc6cd6af3e1e1262ae69d912b00dd2b6f3b (diff)
downloadbrdo-9988e47d6d4f0c0f858af424d23bc6825c550b19.tar.gz
brdo-9988e47d6d4f0c0f858af424d23bc6825c550b19.tar.bz2
Issue #1416506 by yched, Damien Tournoud, swentel: Fixed Field schema foreign keys support is broken.
Diffstat (limited to 'modules')
-rw-r--r--modules/field/field.crud.inc4
-rw-r--r--modules/field/modules/field_sql_storage/field_sql_storage.module2
-rw-r--r--modules/field/modules/field_sql_storage/field_sql_storage.test38
-rw-r--r--modules/field/tests/field_test.field.inc4
-rw-r--r--modules/field/tests/field_test.install14
5 files changed, 46 insertions, 16 deletions
diff --git a/modules/field/field.crud.inc b/modules/field/field.crud.inc
index c4c79d79f..83863d6eb 100644
--- a/modules/field/field.crud.inc
+++ b/modules/field/field.crud.inc
@@ -244,9 +244,11 @@ function field_update_field($field) {
// $prior_field may no longer be right.
module_load_install($field['module']);
$schema = (array) module_invoke($field['module'], 'field_schema', $field);
- $schema += array('columns' => array(), 'indexes' => array());
+ $schema += array('columns' => array(), 'indexes' => array(), 'foreign keys' => array());
// 'columns' are hardcoded in the field type.
$field['columns'] = $schema['columns'];
+ // 'foreign keys' are hardcoded in the field type.
+ $field['foreign keys'] = $schema['foreign keys'];
// 'indexes' can be both hardcoded in the field type, and specified in the
// incoming $field definition.
$field += array(
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module
index c639f38f2..93f207710 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.module
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -188,7 +188,7 @@ function _field_sql_storage_schema($field) {
foreach ($field['foreign keys'] as $specifier => $specification) {
$real_name = _field_sql_storage_indexname($field['field_name'], $specifier);
$current['foreign keys'][$real_name]['table'] = $specification['table'];
- foreach ($specification['columns'] as $column => $referenced) {
+ foreach ($specification['columns'] as $column_name => $referenced) {
$sql_storage_column = _field_sql_storage_columnname($field['field_name'], $column_name);
$current['foreign keys'][$real_name]['columns'][$sql_storage_column] = $referenced;
}
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.test b/modules/field/modules/field_sql_storage/field_sql_storage.test
index 583a37764..12c54ba29 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.test
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.test
@@ -407,21 +407,35 @@ class FieldSqlStorageTestCase extends DrupalWebTestCase {
* Test foreign key support.
*/
function testFieldSqlStorageForeignKeys() {
- // Create a decimal field.
+ // Create a 'shape' field, with a configurable foreign key (see
+ // field_test_field_schema()).
$field_name = 'testfield';
- $field = array('field_name' => $field_name, 'type' => 'text');
- $field = field_create_field($field);
- // Retrieve the field and instance with field_info and verify the foreign
- // keys are in place.
+ $foreign_key_name = 'shape';
+ $field = array('field_name' => $field_name, 'type' => 'shape', 'settings' => array('foreign_key_name' => $foreign_key_name));
+ field_create_field($field);
+
+ // Retrieve the field definition and check that the foreign key is in place.
$field = field_info_field($field_name);
- $this->assertEqual($field['foreign keys']['format']['table'], 'filter_format', 'Foreign key table name preserved through CRUD');
- $this->assertEqual($field['foreign keys']['format']['columns']['format'], 'format', 'Foreign key column name preserved through CRUD');
+ $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, 'Foreign key table name preserved through CRUD');
+ $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', 'Foreign key column name preserved through CRUD');
+
+ // Update the field settings, it should update the foreign key definition
+ // too.
+ $foreign_key_name = 'color';
+ $field['settings']['foreign_key_name'] = $foreign_key_name;
+ field_update_field($field);
+
+ // Retrieve the field definition and check that the foreign key is in place.
+ $field = field_info_field($field_name);
+ $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, 'Foreign key table name modified after update');
+ $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', 'Foreign key column name modified after update');
+
// Now grab the SQL schema and verify that too.
- $schema = drupal_get_schema(_field_sql_storage_tablename($field));
- $this->assertEqual(count($schema['foreign keys']), 1, "There is 1 foreign key in the schema");
+ $schema = drupal_get_schema(_field_sql_storage_tablename($field), TRUE);
+ $this->assertEqual(count($schema['foreign keys']), 1, 'There is 1 foreign key in the schema');
$foreign_key = reset($schema['foreign keys']);
- $filter_column = _field_sql_storage_columnname($field['field_name'], 'format');
- $this->assertEqual($foreign_key['table'], 'filter_format', 'Foreign key table name preserved in the schema');
- $this->assertEqual($foreign_key['columns'][$filter_column], 'format', 'Foreign key column name preserved in the schema');
+ $foreign_key_column = _field_sql_storage_columnname($field['field_name'], $foreign_key_name);
+ $this->assertEqual($foreign_key['table'], $foreign_key_name, 'Foreign key table name preserved in the schema');
+ $this->assertEqual($foreign_key['columns'][$foreign_key_column], 'id', 'Foreign key column name preserved in the schema');
}
}
diff --git a/modules/field/tests/field_test.field.inc b/modules/field/tests/field_test.field.inc
index cc76a998d..1cab7739e 100644
--- a/modules/field/tests/field_test.field.inc
+++ b/modules/field/tests/field_test.field.inc
@@ -28,7 +28,9 @@ function field_test_field_info() {
'shape' => array(
'label' => t('Shape'),
'description' => t('Another dummy field type.'),
- 'settings' => array(),
+ 'settings' => array(
+ 'foreign_key_name' => 'shape',
+ ),
'instance_settings' => array(),
'default_widget' => 'test_field_widget',
'default_formatter' => 'field_test_default',
diff --git a/modules/field/tests/field_test.install b/modules/field/tests/field_test.install
index 595756110..a224520be 100644
--- a/modules/field/tests/field_test.install
+++ b/modules/field/tests/field_test.install
@@ -132,6 +132,18 @@ function field_test_field_schema($field) {
);
}
else {
+ $foreign_keys = array();
+ // The 'foreign keys' key is not always used in tests.
+ if (!empty($field['settings']['foreign_key_name'])) {
+ $foreign_keys['foreign keys'] = array(
+ // This is a dummy foreign key definition, references a table that
+ // doesn't exist, but that's not a problem.
+ $field['settings']['foreign_key_name'] => array(
+ 'table' => $field['settings']['foreign_key_name'],
+ 'columns' => array($field['settings']['foreign_key_name'] => 'id'),
+ ),
+ );
+ }
return array(
'columns' => array(
'shape' => array(
@@ -145,6 +157,6 @@ function field_test_field_schema($field) {
'not null' => FALSE,
),
),
- );
+ ) + $foreign_keys;
}
}