diff --git a/libraries/relation.lib.php b/libraries/relation.lib.php index 4f8efb13d5..2ad83906b6 100644 --- a/libraries/relation.lib.php +++ b/libraries/relation.lib.php @@ -1530,4 +1530,76 @@ function PMA_REL_createPage($newpage, $cfgRelation, $db) isset($GLOBALS['controllink']) ? $GLOBALS['controllink'] : '' ); } + +/** + * Get child table references for a table column. + * + * @param string $db name of master table db. + * @param string $table name of master table. + * @param string $column name of master table column. + * + * @return array $child_references + */ +function PMA_getChildReferences($db, $table, $column) +{ + $child_references = array(); + $i=0; + $rel_query = 'SELECT `column_name`,' + . ' `table_name`,' + . '`table_schema`' + . ' FROM `information_schema`.`key_column_usage`' + . ' WHERE `referenced_column_name` = \'' + . PMA_Util::sqlAddSlashes($column) . '\'' + . ' AND `referenced_table_name` = \'' + . PMA_Util::sqlAddSlashes($table) . '\'' + . ' AND `referenced_table_schema` = \'' + . PMA_Util::sqlAddSlashes($db) . '\''; + + $result = $GLOBALS['dbi']->tryQuery($rel_query, $GLOBALS['controllink']); + if ($result == true) { + while(($row = $GLOBALS['dbi']->fetchAssoc($result))) { + $child_references[$i++] = $row; + } + } + return $child_references; +} + +/** + * Check child table references and foreign key for a table column. + * + * @param string $db name of master table db. + * @param string $table name of master table. + * @param string $column name of master table column. + * + * @return array $column_status telling about references if foreign key. + */ +function PMA_checkChildForeignReferences($db, $table, $column) +{ + $column_status = array(); + $column_status['isEditable'] = false; + $column_status['isReferenced'] = false; + $column_status['isForeignKey'] = false; + $column_status['references'] = array(); + $foreigners = PMA_getForeigners($db, $table, $column); + $child_references = PMA_getChildReferences($db, $table, $column); + + if (sizeof($child_references, 0) > 0 || sizeof($foreigners[$column], 0) > 0) { + if (sizeof($child_references, 0) > 0) { + $column_status['isReferenced'] = true; + foreach ($child_references as $row => $columns) { + array_push($column_status['references'], + PMA_Util::backquote($columns['table_schema']) + . '.' . PMA_Util::backquote($columns['table_name'])); + } + } + + if (sizeof($foreigners[$column], 0) > 0) { + $column_status['isForeignKey'] = true; + } + } else { + $column_status['isEditable'] = true; + } + + return $column_status; +} ?> diff --git a/libraries/tbl_columns_definition_form.inc.php b/libraries/tbl_columns_definition_form.inc.php index a911ca6dba..c92341d25f 100644 --- a/libraries/tbl_columns_definition_form.inc.php +++ b/libraries/tbl_columns_definition_form.inc.php @@ -79,6 +79,7 @@ if (isset($_REQUEST['submit_num_fields'])) { //if adding new fields, set regenerate to keep the original values $regenerate = 1; } + for ($columnNumber = 0; $columnNumber < $num_fields; $columnNumber++) { if (! empty($regenerate)) { list($columnMeta, $submit_length, $submit_attribute, @@ -133,6 +134,10 @@ for ($columnNumber = 0; $columnNumber < $num_fields; $columnNumber++) { $columnMeta, $length, $_form_params, $columnNumber ); } + // Variable tell if current column is bound in a foreign key constraint or not. + $columnMeta['column_status'] = PMA_checkChildForeignReferences($_form_params['db'], + $_form_params['table'], + isset($columnMeta) ? $columnMeta['Field'] : null); $content_cells[$columnNumber] = PMA_getHtmlForColumnAttributes( $columnNumber, isset($columnMeta) ? $columnMeta : null, strtoupper($type), @@ -148,7 +153,6 @@ for ($columnNumber = 0; $columnNumber < $num_fields; $columnNumber++) { $mime_map ); } // end for - $html = PMA_getHtmlForTableCreateOrAddField( $action, $_form_params, $content_cells, $header_cells ); diff --git a/libraries/tbl_columns_definition_form.lib.php b/libraries/tbl_columns_definition_form.lib.php index f0889bb56d..21e3832a88 100644 --- a/libraries/tbl_columns_definition_form.lib.php +++ b/libraries/tbl_columns_definition_form.lib.php @@ -562,9 +562,20 @@ function PMA_getColumnMetaForDefault($columnMeta, $isDefault) */ function PMA_getHtmlForColumnName($columnNumber, $ci, $ci_offset, $columnMeta) { - $html = ''; + $html = ''; $html .= PMA_Util::getSupportedDatatypes(true, $type_upper); $html .= ' '; @@ -1165,7 +1179,7 @@ function PMA_getHtmlForColumnAttributes($columnNumber, $columnMeta, $type_upper, // column type $content_cell[$ci] = PMA_getHtmlForColumnType( - $columnNumber, $ci, $ci_offset, $type_upper + $columnNumber, $ci, $ci_offset, $type_upper, isset($columnMeta) ? $columnMeta : null ); $ci++; diff --git a/test/libraries/PMA_tbl_columns_definition_form_test.php b/test/libraries/PMA_tbl_columns_definition_form_test.php index 35c1b2ce77..686b57b93b 100644 --- a/test/libraries/PMA_tbl_columns_definition_form_test.php +++ b/test/libraries/PMA_tbl_columns_definition_form_test.php @@ -617,7 +617,9 @@ class PMA_TblColumnsDefinitionFormTest extends PHPUnit_Framework_TestCase public function testGetHtmlForColumnName() { $result = PMA_getHtmlForColumnName( - 2, 4, 4, array('Field' => "fieldname") + 2, 4, 4, array('Field' => "fieldname", + 'column_status' => array('isReferenced' => false, + 'isForeignKey' => false, 'isEditable' => true)) ); $this->assertTag( @@ -639,7 +641,8 @@ class PMA_TblColumnsDefinitionFormTest extends PHPUnit_Framework_TestCase { $GLOBALS['PMA_Types'] = new PMA_Types; $result = PMA_getHtmlForColumnType( - 1, 4, 3, false + 1, 4, 3, false, array('column_status' => array('isReferenced' => false, + 'isForeignKey' => false, 'isEditable' => true)) ); $this->assertTag(