From 011ec24ef55799aa6f38ed1a65ffc758b5e44e1f Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Wed, 28 Aug 2013 20:00:01 +0530 Subject: [PATCH 1/8] added methods PMA_handleUpdatesForInternalRelations, PMA_getQueryForInternalRelationUpdate --- libraries/tbl_relation.lib.php | 107 +++++++++++++++++++++++++++++++++ tbl_relation.php | 66 ++------------------ 2 files changed, 112 insertions(+), 61 deletions(-) diff --git a/libraries/tbl_relation.lib.php b/libraries/tbl_relation.lib.php index 1beed173d5..154903bda1 100644 --- a/libraries/tbl_relation.lib.php +++ b/libraries/tbl_relation.lib.php @@ -707,4 +707,111 @@ function PMA_getQueryForDisplayUpdate($disp, $display_field, $db, $table, return $upd_query; } + +/** + * Function to handle updates for internal relations + * + * @param string $destination_db destination database + * @param string $multi_edit_columns_name multi edit column name + * @param string $destination_table destination table + * @param string $destination_column destination column + * @param array $cfgRelation configuration relation + * @param string $db current database + * @param string $table current table + * @param array $existrel db, table, column + * + * @return void + */ +function PMA_handleUpdatesForInternalRelations($destination_db, + $multi_edit_columns_name, $destination_table, $destination_column, $cfgRelation, + $db, $table, $existrel +) { + foreach ($destination_db as $master_field_md5 => $foreign_db) { + $upd_query = PMA_getQueryForInternalRelationUpdate( + $multi_edit_columns_name, + $master_field_md5, $foreign_db, $destination_table, $destination_column, + $cfgRelation, $db, $table, isset($existrel) ? $existrel : null + ); + if ($upd_query) { + PMA_queryAsControlUser($upd_query); + } + } +} + +/** + * Function to get update query for updating internal relations + * + * @param string $multi_edit_columns_name multi edit column names + * @param string $master_field_md5 master field md5 + * @param string $foreign_db foreign database + * @param string $destination_table destination table + * @param string $destination_column destination column + * @param array $cfgRelation configuration relation + * @param string $db current database + * @param string $table current table + * @param array $existrel db, table, column + * + * @return string + */ +function PMA_getQueryForInternalRelationUpdate($multi_edit_columns_name, + $master_field_md5, $foreign_db, $destination_table, $destination_column, + $cfgRelation, $db, $table, $existrel +) { + $upd_query = false; + + // Map the fieldname's md5 back to its real name + $master_field = $multi_edit_columns_name[$master_field_md5]; + + $foreign_table = $destination_table[$master_field_md5]; + $foreign_field = $destination_column[$master_field_md5]; + if (! empty($foreign_db) + && ! empty($foreign_table) + && ! empty($foreign_field) + ) { + if (! isset($existrel[$master_field])) { + $upd_query = 'INSERT INTO ' + . PMA_Util::backquote($GLOBALS['cfgRelation']['db']) + . '.' . PMA_Util::backquote($cfgRelation['relation']) + . '(master_db, master_table, master_field, foreign_db,' + . ' foreign_table, foreign_field)' + . ' values(' + . '\'' . PMA_Util::sqlAddSlashes($db) . '\', ' + . '\'' . PMA_Util::sqlAddSlashes($table) . '\', ' + . '\'' . PMA_Util::sqlAddSlashes($master_field) . '\', ' + . '\'' . PMA_Util::sqlAddSlashes($foreign_db) . '\', ' + . '\'' . PMA_Util::sqlAddSlashes($foreign_table) . '\',' + . '\'' . PMA_Util::sqlAddSlashes($foreign_field) . '\')'; + + } elseif ($existrel[$master_field]['foreign_db'] != $foreign_db + || $existrel[$master_field]['foreign_table'] != $foreign_table + || $existrel[$master_field]['foreign_field'] != $foreign_field + ) { + $upd_query = 'UPDATE ' + . PMA_Util::backquote($GLOBALS['cfgRelation']['db']) + . '.' . PMA_Util::backquote($cfgRelation['relation']) . ' SET' + . ' foreign_db = \'' + . PMA_Util::sqlAddSlashes($foreign_db) . '\', ' + . ' foreign_table = \'' + . PMA_Util::sqlAddSlashes($foreign_table) . '\', ' + . ' foreign_field = \'' + . PMA_Util::sqlAddSlashes($foreign_field) . '\' ' + . ' WHERE master_db = \'' + . PMA_Util::sqlAddSlashes($db) . '\'' + . ' AND master_table = \'' + . PMA_Util::sqlAddSlashes($table) . '\'' + . ' AND master_field = \'' + . PMA_Util::sqlAddSlashes($master_field) . '\''; + } // end if... else.... + } elseif (isset($existrel[$master_field])) { + $upd_query = 'DELETE FROM ' + . PMA_Util::backquote($GLOBALS['cfgRelation']['db']) + . '.' . PMA_Util::backquote($cfgRelation['relation']) + . ' WHERE master_db = \'' . PMA_Util::sqlAddSlashes($db) . '\'' + . ' AND master_table = \'' . PMA_Util::sqlAddSlashes($table) . '\'' + . ' AND master_field = \'' . PMA_Util::sqlAddSlashes($master_field) + . '\''; + } // end if... else.... + + return $upd_query; +} ?> diff --git a/tbl_relation.php b/tbl_relation.php index a8a58defcc..9b6fe0a130 100644 --- a/tbl_relation.php +++ b/tbl_relation.php @@ -97,72 +97,16 @@ $html_output = ''; // u p d a t e s f o r I n t e r n a l r e l a t i o n s if (isset($destination_db) && $cfgRelation['relwork']) { - - foreach ($destination_db as $master_field_md5 => $foreign_db) { - $upd_query = false; - - // Map the fieldname's md5 back to its real name - $master_field = $multi_edit_columns_name[$master_field_md5]; - - $foreign_table = $destination_table[$master_field_md5]; - $foreign_field = $destination_column[$master_field_md5]; - if (! empty($foreign_db) - && ! empty($foreign_table) - && ! empty($foreign_field) - ) { - if (! isset($existrel[$master_field])) { - $upd_query = 'INSERT INTO ' - . PMA_Util::backquote($GLOBALS['cfgRelation']['db']) - . '.' . PMA_Util::backquote($cfgRelation['relation']) - . '(master_db, master_table, master_field, foreign_db,' - . ' foreign_table, foreign_field)' - . ' values(' - . '\'' . PMA_Util::sqlAddSlashes($db) . '\', ' - . '\'' . PMA_Util::sqlAddSlashes($table) . '\', ' - . '\'' . PMA_Util::sqlAddSlashes($master_field) . '\', ' - . '\'' . PMA_Util::sqlAddSlashes($foreign_db) . '\', ' - . '\'' . PMA_Util::sqlAddSlashes($foreign_table) . '\',' - . '\'' . PMA_Util::sqlAddSlashes($foreign_field) . '\')'; - - } elseif ($existrel[$master_field]['foreign_db'] != $foreign_db - || $existrel[$master_field]['foreign_table'] != $foreign_table - || $existrel[$master_field]['foreign_field'] != $foreign_field - ) { - $upd_query = 'UPDATE ' - . PMA_Util::backquote($GLOBALS['cfgRelation']['db']) - . '.' . PMA_Util::backquote($cfgRelation['relation']) . ' SET' - . ' foreign_db = \'' - . PMA_Util::sqlAddSlashes($foreign_db) . '\', ' - . ' foreign_table = \'' - . PMA_Util::sqlAddSlashes($foreign_table) . '\', ' - . ' foreign_field = \'' - . PMA_Util::sqlAddSlashes($foreign_field) . '\' ' - . ' WHERE master_db = \'' - . PMA_Util::sqlAddSlashes($db) . '\'' - . ' AND master_table = \'' - . PMA_Util::sqlAddSlashes($table) . '\'' - . ' AND master_field = \'' - . PMA_Util::sqlAddSlashes($master_field) . '\''; - } // end if... else.... - } elseif (isset($existrel[$master_field])) { - $upd_query = 'DELETE FROM ' - . PMA_Util::backquote($GLOBALS['cfgRelation']['db']) - . '.' . PMA_Util::backquote($cfgRelation['relation']) - . ' WHERE master_db = \'' . PMA_Util::sqlAddSlashes($db) . '\'' - . ' AND master_table = \'' . PMA_Util::sqlAddSlashes($table) . '\'' - . ' AND master_field = \'' . PMA_Util::sqlAddSlashes($master_field) - . '\''; - } // end if... else.... - if ($upd_query) { - PMA_queryAsControlUser($upd_query); - } - } // end while + PMA_handleUpdatesForInternalRelations( + $destination_db, $multi_edit_columns_name, $destination_table, + $destination_column, $cfgRelation, $db, $table, + isset($existrel) ? $existrel : null + ); } // end if (updates for internal relations) // u p d a t e s f o r f o r e i g n k e y s // (for now, one index name only; we keep the definitions if the // foreign db is not the same) - if (isset($destination_foreign_db)) { $display_query = ''; $seen_error = false; From 73380973be31181766806f24e7e1374cce2a3a55 Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Wed, 28 Aug 2013 20:47:55 +0530 Subject: [PATCH 2/8] added method PMA_handleUpdatesForForeignKeys --- libraries/tbl_relation.lib.php | 129 +++++++++++++++++++++++++++++++++ tbl_relation.php | 116 ++--------------------------- 2 files changed, 135 insertions(+), 110 deletions(-) diff --git a/libraries/tbl_relation.lib.php b/libraries/tbl_relation.lib.php index 154903bda1..e1ca971240 100644 --- a/libraries/tbl_relation.lib.php +++ b/libraries/tbl_relation.lib.php @@ -814,4 +814,133 @@ function PMA_getQueryForInternalRelationUpdate($multi_edit_columns_name, return $upd_query; } + +/** + * Function to handle foreign key updates + * + * @param string $destination_foreign_db destination foreign database + * @param string $multi_edit_columns_name multi edit column names + * @param string $destination_foreign_table destination foreign table + * @param string $destination_foreign_column destination foreign column + * @param array $options_array options array + * @param string $table current table + * @param array $existrel_foreign db, table, column + * + * @return void + */ +function PMA_handleUpdatesForForeignKeys($destination_foreign_db, + $multi_edit_columns_name, $destination_foreign_table, + $destination_foreign_column, $options_array, $table, $existrel_foreign + ) { + $display_query = ''; + $seen_error = false; + foreach ($destination_foreign_db as $master_field_md5 => $foreign_db) { + $create = false; + $drop = false; + + // Map the fieldname's md5 back to it's real name + $master_field = $multi_edit_columns_name[$master_field_md5]; + + $foreign_table = $destination_foreign_table[$master_field_md5]; + $foreign_field = $destination_foreign_column[$master_field_md5]; + if (! empty($foreign_db) + && ! empty($foreign_table) + && ! empty($foreign_field) + ) { + if (! isset($existrel_foreign[$master_field])) { + // no key defined for this field + $create = true; + } elseif ($existrel_foreign[$master_field]['foreign_db'] != $foreign_db + || $existrel_foreign[$master_field]['foreign_table'] != $foreign_table + || $existrel_foreign[$master_field]['foreign_field'] != $foreign_field + || $_REQUEST['constraint_name'][$master_field_md5] != $existrel_foreign[$master_field]['constraint'] + || ($_REQUEST['on_delete'][$master_field_md5] != (! empty($existrel_foreign[$master_field]['on_delete']) ? $existrel_foreign[$master_field]['on_delete'] : 'RESTRICT')) + || ($_REQUEST['on_update'][$master_field_md5] != (! empty($existrel_foreign[$master_field]['on_update']) ? $existrel_foreign[$master_field]['on_update'] : 'RESTRICT')) + ) { + // another foreign key is already defined for this field + // or an option has been changed for ON DELETE or ON UPDATE + $drop = true; + $create = true; + } // end if... else.... + } elseif (isset($existrel_foreign[$master_field])) { + $drop = true; + } // end if... else.... + + $tmp_error_drop = false; + if ($drop) { + $drop_query = PMA_getSQLToDropForeignKey( + $table, $existrel_foreign[$master_field]['constraint'] + ); + $display_query .= $drop_query . "\n"; + $GLOBALS['dbi']->tryQuery($drop_query); + $tmp_error_drop = $GLOBALS['dbi']->getError(); + + if (! empty($tmp_error_drop)) { + $seen_error = true; + $html_output .= PMA_Util::mysqlDie( + $tmp_error_drop, $drop_query, false, '', false + ); + continue; + } + } + $tmp_error_create = false; + if ($create) { + $create_query = PMA_getSQLToCreateForeignKey( + $table, $master_field, $foreign_db, $foreign_table, $foreign_field, + $_REQUEST['constraint_name'][$master_field_md5], + $options_array[$_REQUEST['on_delete'][$master_field_md5]], + $options_array[$_REQUEST['on_update'][$master_field_md5]] + ); + + $display_query .= $create_query . "\n"; + $GLOBALS['dbi']->tryQuery($create_query); + $tmp_error_create = $GLOBALS['dbi']->getError(); + if (! empty($tmp_error_create)) { + $seen_error = true; + + if (substr($tmp_error_create, 1, 4) == '1005') { + $message = PMA_Message::error( + __('Error creating foreign key on %1$s (check data types)') + ); + $message->addParam($master_field); + $message->display(); + } else { + $html_output .= PMA_Util::mysqlDie( + $tmp_error_create, $create_query, false, '', false + ); + } + $html_output .= PMA_Util::showMySQLDocu( + 'InnoDB_foreign_key_constraints' + ) . "\n"; + } + + // this is an alteration and the old constraint has been dropped + // without creation of a new one + if ($drop && $create && empty($tmp_error_drop) + && ! empty($tmp_error_create) + ) { + // a rollback may be better here + $sql_query_recreate = '# Restoring the dropped constraint...' . "\n"; + $sql_query_recreate .= PMA_getSQLToCreateForeignKey( + $table, + $master_field, + $existrel_foreign[$master_field]['foreign_db'], + $existrel_foreign[$master_field]['foreign_table'], + $existrel_foreign[$master_field]['foreign_field'], + $existrel_foreign[$master_field]['constraint'], + $options_array[$existrel_foreign[$master_field]['on_delete']], + $options_array[$existrel_foreign[$master_field]['on_update']] + ); + $display_query .= $sql_query_recreate . "\n"; + $GLOBALS['dbi']->tryQuery($sql_query_recreate); + } + } + } // end foreach + if (! empty($display_query) && ! $seen_error) { + $html_output .= PMA_Util::getMessage( + __('Your SQL query has been executed successfully'), + null, 'success' + ); + } +} ?> diff --git a/tbl_relation.php b/tbl_relation.php index 9b6fe0a130..198a1f9940 100644 --- a/tbl_relation.php +++ b/tbl_relation.php @@ -108,116 +108,12 @@ if (isset($destination_db) && $cfgRelation['relwork']) { // (for now, one index name only; we keep the definitions if the // foreign db is not the same) if (isset($destination_foreign_db)) { - $display_query = ''; - $seen_error = false; - foreach ($destination_foreign_db as $master_field_md5 => $foreign_db) { - $create = false; - $drop = false; - - // Map the fieldname's md5 back to it's real name - $master_field = $multi_edit_columns_name[$master_field_md5]; - - $foreign_table = $destination_foreign_table[$master_field_md5]; - $foreign_field = $destination_foreign_column[$master_field_md5]; - if (! empty($foreign_db) - && ! empty($foreign_table) - && ! empty($foreign_field) - ) { - if (! isset($existrel_foreign[$master_field])) { - // no key defined for this field - $create = true; - } elseif ($existrel_foreign[$master_field]['foreign_db'] != $foreign_db - || $existrel_foreign[$master_field]['foreign_table'] != $foreign_table - || $existrel_foreign[$master_field]['foreign_field'] != $foreign_field - || $_REQUEST['constraint_name'][$master_field_md5] != $existrel_foreign[$master_field]['constraint'] - || ($_REQUEST['on_delete'][$master_field_md5] != (! empty($existrel_foreign[$master_field]['on_delete']) ? $existrel_foreign[$master_field]['on_delete'] : 'RESTRICT')) - || ($_REQUEST['on_update'][$master_field_md5] != (! empty($existrel_foreign[$master_field]['on_update']) ? $existrel_foreign[$master_field]['on_update'] : 'RESTRICT')) - ) { - // another foreign key is already defined for this field - // or an option has been changed for ON DELETE or ON UPDATE - $drop = true; - $create = true; - } // end if... else.... - } elseif (isset($existrel_foreign[$master_field])) { - $drop = true; - } // end if... else.... - - $tmp_error_drop = false; - if ($drop) { - $drop_query = PMA_getSQLToDropForeignKey( - $table, $existrel_foreign[$master_field]['constraint'] - ); - $display_query .= $drop_query . "\n"; - $GLOBALS['dbi']->tryQuery($drop_query); - $tmp_error_drop = $GLOBALS['dbi']->getError(); - - if (! empty($tmp_error_drop)) { - $seen_error = true; - $html_output .= PMA_Util::mysqlDie( - $tmp_error_drop, $drop_query, false, '', false - ); - continue; - } - } - $tmp_error_create = false; - if ($create) { - $create_query = PMA_getSQLToCreateForeignKey( - $table, $master_field, $foreign_db, $foreign_table, $foreign_field, - $_REQUEST['constraint_name'][$master_field_md5], - $options_array[$_REQUEST['on_delete'][$master_field_md5]], - $options_array[$_REQUEST['on_update'][$master_field_md5]] - ); - - $display_query .= $create_query . "\n"; - $GLOBALS['dbi']->tryQuery($create_query); - $tmp_error_create = $GLOBALS['dbi']->getError(); - if (! empty($tmp_error_create)) { - $seen_error = true; - - if (substr($tmp_error_create, 1, 4) == '1005') { - $message = PMA_Message::error( - __('Error creating foreign key on %1$s (check data types)') - ); - $message->addParam($master_field); - $message->display(); - } else { - $html_output .= PMA_Util::mysqlDie( - $tmp_error_create, $create_query, false, '', false - ); - } - $html_output .= PMA_Util::showMySQLDocu( - 'InnoDB_foreign_key_constraints' - ) . "\n"; - } - - // this is an alteration and the old constraint has been dropped - // without creation of a new one - if ($drop && $create && empty($tmp_error_drop) - && ! empty($tmp_error_create) - ) { - // a rollback may be better here - $sql_query_recreate = '# Restoring the dropped constraint...' . "\n"; - $sql_query_recreate .= PMA_getSQLToCreateForeignKey( - $table, - $master_field, - $existrel_foreign[$master_field]['foreign_db'], - $existrel_foreign[$master_field]['foreign_table'], - $existrel_foreign[$master_field]['foreign_field'], - $existrel_foreign[$master_field]['constraint'], - $options_array[$existrel_foreign[$master_field]['on_delete']], - $options_array[$existrel_foreign[$master_field]['on_update']] - ); - $display_query .= $sql_query_recreate . "\n"; - $GLOBALS['dbi']->tryQuery($sql_query_recreate); - } - } - } // end foreach - if (! empty($display_query) && ! $seen_error) { - $html_output .= PMA_Util::getMessage( - __('Your SQL query has been executed successfully'), - null, 'success' - ); - } + PMA_handleUpdatesForForeignKeys( + $destination_foreign_db, + $multi_edit_columns_name, $destination_foreign_table, + $destination_foreign_column, $options_array, $table, + isset($existrel_foreign) ? $existrel_foreign : null + ); } // end if isset($destination_foreign) From bf2c85c877ddcc4f814cab8d5a2cbcccaf71eb4a Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Thu, 29 Aug 2013 21:45:15 +0530 Subject: [PATCH 3/8] added method PMA_handleUpdateForForeignKey --- libraries/tbl_relation.lib.php | 240 +++++++++++++++++++-------------- tbl_relation.php | 3 +- 2 files changed, 139 insertions(+), 104 deletions(-) diff --git a/libraries/tbl_relation.lib.php b/libraries/tbl_relation.lib.php index e1ca971240..ac4ba1ad21 100644 --- a/libraries/tbl_relation.lib.php +++ b/libraries/tbl_relation.lib.php @@ -826,7 +826,7 @@ function PMA_getQueryForInternalRelationUpdate($multi_edit_columns_name, * @param string $table current table * @param array $existrel_foreign db, table, column * - * @return void + * @return string */ function PMA_handleUpdatesForForeignKeys($destination_foreign_db, $multi_edit_columns_name, $destination_foreign_table, @@ -835,112 +835,148 @@ function PMA_handleUpdatesForForeignKeys($destination_foreign_db, $display_query = ''; $seen_error = false; foreach ($destination_foreign_db as $master_field_md5 => $foreign_db) { - $create = false; - $drop = false; - - // Map the fieldname's md5 back to it's real name - $master_field = $multi_edit_columns_name[$master_field_md5]; - - $foreign_table = $destination_foreign_table[$master_field_md5]; - $foreign_field = $destination_foreign_column[$master_field_md5]; - if (! empty($foreign_db) - && ! empty($foreign_table) - && ! empty($foreign_field) - ) { - if (! isset($existrel_foreign[$master_field])) { - // no key defined for this field - $create = true; - } elseif ($existrel_foreign[$master_field]['foreign_db'] != $foreign_db - || $existrel_foreign[$master_field]['foreign_table'] != $foreign_table - || $existrel_foreign[$master_field]['foreign_field'] != $foreign_field - || $_REQUEST['constraint_name'][$master_field_md5] != $existrel_foreign[$master_field]['constraint'] - || ($_REQUEST['on_delete'][$master_field_md5] != (! empty($existrel_foreign[$master_field]['on_delete']) ? $existrel_foreign[$master_field]['on_delete'] : 'RESTRICT')) - || ($_REQUEST['on_update'][$master_field_md5] != (! empty($existrel_foreign[$master_field]['on_update']) ? $existrel_foreign[$master_field]['on_update'] : 'RESTRICT')) - ) { - // another foreign key is already defined for this field - // or an option has been changed for ON DELETE or ON UPDATE - $drop = true; - $create = true; - } // end if... else.... - } elseif (isset($existrel_foreign[$master_field])) { - $drop = true; - } // end if... else.... - - $tmp_error_drop = false; - if ($drop) { - $drop_query = PMA_getSQLToDropForeignKey( - $table, $existrel_foreign[$master_field]['constraint'] - ); - $display_query .= $drop_query . "\n"; - $GLOBALS['dbi']->tryQuery($drop_query); - $tmp_error_drop = $GLOBALS['dbi']->getError(); - - if (! empty($tmp_error_drop)) { - $seen_error = true; - $html_output .= PMA_Util::mysqlDie( - $tmp_error_drop, $drop_query, false, '', false - ); - continue; - } - } - $tmp_error_create = false; - if ($create) { - $create_query = PMA_getSQLToCreateForeignKey( - $table, $master_field, $foreign_db, $foreign_table, $foreign_field, - $_REQUEST['constraint_name'][$master_field_md5], - $options_array[$_REQUEST['on_delete'][$master_field_md5]], - $options_array[$_REQUEST['on_update'][$master_field_md5]] - ); - - $display_query .= $create_query . "\n"; - $GLOBALS['dbi']->tryQuery($create_query); - $tmp_error_create = $GLOBALS['dbi']->getError(); - if (! empty($tmp_error_create)) { - $seen_error = true; - - if (substr($tmp_error_create, 1, 4) == '1005') { - $message = PMA_Message::error( - __('Error creating foreign key on %1$s (check data types)') - ); - $message->addParam($master_field); - $message->display(); - } else { - $html_output .= PMA_Util::mysqlDie( - $tmp_error_create, $create_query, false, '', false - ); - } - $html_output .= PMA_Util::showMySQLDocu( - 'InnoDB_foreign_key_constraints' - ) . "\n"; - } - - // this is an alteration and the old constraint has been dropped - // without creation of a new one - if ($drop && $create && empty($tmp_error_drop) - && ! empty($tmp_error_create) - ) { - // a rollback may be better here - $sql_query_recreate = '# Restoring the dropped constraint...' . "\n"; - $sql_query_recreate .= PMA_getSQLToCreateForeignKey( - $table, - $master_field, - $existrel_foreign[$master_field]['foreign_db'], - $existrel_foreign[$master_field]['foreign_table'], - $existrel_foreign[$master_field]['foreign_field'], - $existrel_foreign[$master_field]['constraint'], - $options_array[$existrel_foreign[$master_field]['on_delete']], - $options_array[$existrel_foreign[$master_field]['on_update']] - ); - $display_query .= $sql_query_recreate . "\n"; - $GLOBALS['dbi']->tryQuery($sql_query_recreate); - } - } + PMA_handleUpdateForForeignKey( + $multi_edit_columns_name, $master_field_md5, + $destination_foreign_table, $destination_foreign_column, $options_array, + $existrel_foreign, $table, $seen_error, $display_query, $foreign_db + ); } // end foreach if (! empty($display_query) && ! $seen_error) { - $html_output .= PMA_Util::getMessage( + $html_output = PMA_Util::getMessage( __('Your SQL query has been executed successfully'), null, 'success' ); } + + return $html_output; +} + +/** + * Function to handle update for a foreign key + * + * @param array $multi_edit_columns_name multu edit columns name + * @param string $master_field_md5 master field md5 + * @param string $destination_foreign_table destination foreign table + * @param string $destination_foreign_column destination foreign column + * @param array $options_array options array + * @param array $existrel_foreign db, table, column + * @param string $table current table + * @param bool $seen_error whether seen error + * @param string $display_query display query + * @param string $foreign_db foreign database + * + * @return void + */ +function PMA_handleUpdateForForeignKey($multi_edit_columns_name, $master_field_md5, + $destination_foreign_table, $destination_foreign_column, $options_array, + $existrel_foreign, $table, &$seen_error, &$display_query, $foreign_db +) { + $create = false; + $drop = false; + + // Map the fieldname's md5 back to it's real name + $master_field = $multi_edit_columns_name[$master_field_md5]; + + $foreign_table = $destination_foreign_table[$master_field_md5]; + $foreign_field = $destination_foreign_column[$master_field_md5]; + if (! empty($foreign_db) + && ! empty($foreign_table) + && ! empty($foreign_field) + ) { + $constraint_name = $existrel_foreign[$master_field]['constraint']; + $on_delete = ! empty( + $existrel_foreign[$master_field]['on_delete']) + ? $existrel_foreign[$master_field]['on_delete'] : 'RESTRICT'; + $on_update = ! empty( + $existrel_foreign[$master_field]['on_update']) + ? $existrel_foreign[$master_field]['on_update'] : 'RESTRICT'; + if (! isset($existrel_foreign[$master_field])) { + // no key defined for this field + $create = true; + } elseif ($existrel_foreign[$master_field]['foreign_db'] != $foreign_db + || $existrel_foreign[$master_field]['foreign_table'] != $foreign_table + || $existrel_foreign[$master_field]['foreign_field'] != $foreign_field + || $_REQUEST['constraint_name'][$master_field_md5] != $constraint_name + || ($_REQUEST['on_delete'][$master_field_md5] != $on_delete) + || ($_REQUEST['on_update'][$master_field_md5] != $on_update) + ) { + // another foreign key is already defined for this field + // or an option has been changed for ON DELETE or ON UPDATE + $drop = true; + $create = true; + } // end if... else.... + } elseif (isset($existrel_foreign[$master_field])) { + $drop = true; + } // end if... else.... + + $tmp_error_drop = false; + if ($drop) { + $drop_query = PMA_getSQLToDropForeignKey( + $table, $existrel_foreign[$master_field]['constraint'] + ); + $display_query .= $drop_query . "\n"; + $GLOBALS['dbi']->tryQuery($drop_query); + $tmp_error_drop = $GLOBALS['dbi']->getError(); + + if (! empty($tmp_error_drop)) { + $seen_error = true; + $html_output .= PMA_Util::mysqlDie( + $tmp_error_drop, $drop_query, false, '', false + ); + return; + } + } + $tmp_error_create = false; + if ($create) { + $create_query = PMA_getSQLToCreateForeignKey( + $table, $master_field, $foreign_db, $foreign_table, $foreign_field, + $_REQUEST['constraint_name'][$master_field_md5], + $options_array[$_REQUEST['on_delete'][$master_field_md5]], + $options_array[$_REQUEST['on_update'][$master_field_md5]] + ); + + $display_query .= $create_query . "\n"; + $GLOBALS['dbi']->tryQuery($create_query); + $tmp_error_create = $GLOBALS['dbi']->getError(); + if (! empty($tmp_error_create)) { + $seen_error = true; + + if (substr($tmp_error_create, 1, 4) == '1005') { + $message = PMA_Message::error( + __('Error creating foreign key on %1$s (check data types)') + ); + $message->addParam($master_field); + $message->display(); + } else { + $html_output .= PMA_Util::mysqlDie( + $tmp_error_create, $create_query, false, '', false + ); + } + $html_output .= PMA_Util::showMySQLDocu( + 'InnoDB_foreign_key_constraints' + ) . "\n"; + } + + // this is an alteration and the old constraint has been dropped + // without creation of a new one + if ($drop && $create && empty($tmp_error_drop) + && ! empty($tmp_error_create) + ) { + // a rollback may be better here + $sql_query_recreate = '# Restoring the dropped constraint...' . "\n"; + $sql_query_recreate .= PMA_getSQLToCreateForeignKey( + $table, + $master_field, + $existrel_foreign[$master_field]['foreign_db'], + $existrel_foreign[$master_field]['foreign_table'], + $existrel_foreign[$master_field]['foreign_field'], + $existrel_foreign[$master_field]['constraint'], + $options_array[$existrel_foreign[$master_field]['on_delete']], + $options_array[$existrel_foreign[$master_field]['on_update']] + ); + $display_query .= $sql_query_recreate . "\n"; + $GLOBALS['dbi']->tryQuery($sql_query_recreate); + } + } } ?> diff --git a/tbl_relation.php b/tbl_relation.php index 198a1f9940..1de7e69554 100644 --- a/tbl_relation.php +++ b/tbl_relation.php @@ -93,7 +93,6 @@ $multi_edit_columns_name = isset($_REQUEST['fields_name']) ? $_REQUEST['fields_name'] : null; -$html_output = ''; // u p d a t e s f o r I n t e r n a l r e l a t i o n s if (isset($destination_db) && $cfgRelation['relwork']) { @@ -108,7 +107,7 @@ if (isset($destination_db) && $cfgRelation['relwork']) { // (for now, one index name only; we keep the definitions if the // foreign db is not the same) if (isset($destination_foreign_db)) { - PMA_handleUpdatesForForeignKeys( + $html_output = PMA_handleUpdatesForForeignKeys( $destination_foreign_db, $multi_edit_columns_name, $destination_foreign_table, $destination_foreign_column, $options_array, $table, From 207ee1ffc3cbf635abd162d800665fa83498a5b7 Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Thu, 29 Aug 2013 21:58:35 +0530 Subject: [PATCH 4/8] errors corrected --- libraries/tbl_relation.lib.php | 10 +++++++--- tbl_relation.php | 5 +++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libraries/tbl_relation.lib.php b/libraries/tbl_relation.lib.php index ac4ba1ad21..1819052811 100644 --- a/libraries/tbl_relation.lib.php +++ b/libraries/tbl_relation.lib.php @@ -832,10 +832,11 @@ function PMA_handleUpdatesForForeignKeys($destination_foreign_db, $multi_edit_columns_name, $destination_foreign_table, $destination_foreign_column, $options_array, $table, $existrel_foreign ) { + $html_output = ''; $display_query = ''; $seen_error = false; foreach ($destination_foreign_db as $master_field_md5 => $foreign_db) { - PMA_handleUpdateForForeignKey( + $html_output .= PMA_handleUpdateForForeignKey( $multi_edit_columns_name, $master_field_md5, $destination_foreign_table, $destination_foreign_column, $options_array, $existrel_foreign, $table, $seen_error, $display_query, $foreign_db @@ -865,12 +866,13 @@ function PMA_handleUpdatesForForeignKeys($destination_foreign_db, * @param string $display_query display query * @param string $foreign_db foreign database * - * @return void + * @return string */ function PMA_handleUpdateForForeignKey($multi_edit_columns_name, $master_field_md5, $destination_foreign_table, $destination_foreign_column, $options_array, $existrel_foreign, $table, &$seen_error, &$display_query, $foreign_db ) { + $html_output = ''; $create = false; $drop = false; @@ -923,7 +925,7 @@ function PMA_handleUpdateForForeignKey($multi_edit_columns_name, $master_field_m $html_output .= PMA_Util::mysqlDie( $tmp_error_drop, $drop_query, false, '', false ); - return; + return $html_output; } } $tmp_error_create = false; @@ -978,5 +980,7 @@ function PMA_handleUpdateForForeignKey($multi_edit_columns_name, $master_field_m $GLOBALS['dbi']->tryQuery($sql_query_recreate); } } + + return $html_output; } ?> diff --git a/tbl_relation.php b/tbl_relation.php index 1de7e69554..4f9500af63 100644 --- a/tbl_relation.php +++ b/tbl_relation.php @@ -103,11 +103,13 @@ if (isset($destination_db) && $cfgRelation['relwork']) { ); } // end if (updates for internal relations) +$html_output = ''; + // u p d a t e s f o r f o r e i g n k e y s // (for now, one index name only; we keep the definitions if the // foreign db is not the same) if (isset($destination_foreign_db)) { - $html_output = PMA_handleUpdatesForForeignKeys( + $html_output .= PMA_handleUpdatesForForeignKeys( $destination_foreign_db, $multi_edit_columns_name, $destination_foreign_table, $destination_foreign_column, $options_array, $table, @@ -117,7 +119,6 @@ if (isset($destination_foreign_db)) { // U p d a t e s f o r d i s p l a y f i e l d - if ($cfgRelation['displaywork'] && isset($display_field)) { PMA_handleUpdateForDisplayField( $disp, $display_field, $db, $table, $cfgRelation From 5b318ed1e9cc1a4e0c56273e8de20e0a8f970421 Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Thu, 29 Aug 2013 22:04:07 +0530 Subject: [PATCH 5/8] error corrected --- libraries/tbl_relation.lib.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/tbl_relation.lib.php b/libraries/tbl_relation.lib.php index 1819052811..e0d138070b 100644 --- a/libraries/tbl_relation.lib.php +++ b/libraries/tbl_relation.lib.php @@ -885,13 +885,15 @@ function PMA_handleUpdateForForeignKey($multi_edit_columns_name, $master_field_m && ! empty($foreign_table) && ! empty($foreign_field) ) { - $constraint_name = $existrel_foreign[$master_field]['constraint']; - $on_delete = ! empty( + if ( isset($existrel_foreign[$master_field])) { + $constraint_name = $existrel_foreign[$master_field]['constraint']; + $on_delete = ! empty( $existrel_foreign[$master_field]['on_delete']) ? $existrel_foreign[$master_field]['on_delete'] : 'RESTRICT'; - $on_update = ! empty( + $on_update = ! empty( $existrel_foreign[$master_field]['on_update']) ? $existrel_foreign[$master_field]['on_update'] : 'RESTRICT'; + } if (! isset($existrel_foreign[$master_field])) { // no key defined for this field $create = true; From 23d5e798be412cf0dd840091e07321a217d4a4cb Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Thu, 29 Aug 2013 22:07:24 +0530 Subject: [PATCH 6/8] phpcs errors corrected --- libraries/tbl_relation.lib.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/tbl_relation.lib.php b/libraries/tbl_relation.lib.php index e0d138070b..91fbf95a34 100644 --- a/libraries/tbl_relation.lib.php +++ b/libraries/tbl_relation.lib.php @@ -568,7 +568,7 @@ function PMA_getHtmlForForeignKey($save_row, $i, $existrel_foreign, $myfield, $d /** * Function to send html for table or column dropdown list * - * @retrun void + * @return void */ function PMA_sendHtmlForTableOrColumnDropdownList() { @@ -620,7 +620,7 @@ function PMA_sendHtmlForTableDropdownList() ); } else { $query = 'SHOW TABLES FROM ' - . PMA_Util::backquote( $_REQUEST['foreignDb']); + . PMA_Util::backquote($_REQUEST['foreignDb']); } $tables_rs = $GLOBALS['dbi']->query( $query, @@ -831,7 +831,7 @@ function PMA_getQueryForInternalRelationUpdate($multi_edit_columns_name, function PMA_handleUpdatesForForeignKeys($destination_foreign_db, $multi_edit_columns_name, $destination_foreign_table, $destination_foreign_column, $options_array, $table, $existrel_foreign - ) { +) { $html_output = ''; $display_query = ''; $seen_error = false; @@ -862,8 +862,8 @@ function PMA_handleUpdatesForForeignKeys($destination_foreign_db, * @param array $options_array options array * @param array $existrel_foreign db, table, column * @param string $table current table - * @param bool $seen_error whether seen error - * @param string $display_query display query + * @param bool &$seen_error whether seen error + * @param string &$display_query display query * @param string $foreign_db foreign database * * @return string From 1014d9fef42d3b4fe2121b71cc9ce50a3afe4e6f Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Fri, 30 Aug 2013 21:41:58 +0530 Subject: [PATCH 7/8] query not shown error corrected --- libraries/tbl_relation.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/tbl_relation.lib.php b/libraries/tbl_relation.lib.php index 91fbf95a34..eb4b66261b 100644 --- a/libraries/tbl_relation.lib.php +++ b/libraries/tbl_relation.lib.php @@ -843,6 +843,7 @@ function PMA_handleUpdatesForForeignKeys($destination_foreign_db, ); } // end foreach if (! empty($display_query) && ! $seen_error) { + $GLOBALS['display_query'] = $display_query; $html_output = PMA_Util::getMessage( __('Your SQL query has been executed successfully'), null, 'success' From ae6e4954587ac7747ece40f9a096a2288409ebbf Mon Sep 17 00:00:00 2001 From: Spun Nakandala Date: Fri, 30 Aug 2013 21:51:11 +0530 Subject: [PATCH 8/8] remove global variables and use super global variables --- tbl_relation.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tbl_relation.php b/tbl_relation.php index 4f9500af63..2dc55d9ad8 100644 --- a/tbl_relation.php +++ b/tbl_relation.php @@ -40,9 +40,6 @@ $scripts->addFile('indexes.js'); * Sets globals from $_POST */ $post_params = array( - 'destination_db', - 'destination_table', - 'destination_column', 'destination_foreign_db', 'destination_foreign_table', 'destination_foreign_column', @@ -95,10 +92,11 @@ $multi_edit_columns_name = isset($_REQUEST['fields_name']) // u p d a t e s f o r I n t e r n a l r e l a t i o n s -if (isset($destination_db) && $cfgRelation['relwork']) { +if (isset($_POST['destination_db']) && $cfgRelation['relwork']) { PMA_handleUpdatesForInternalRelations( - $destination_db, $multi_edit_columns_name, $destination_table, - $destination_column, $cfgRelation, $db, $table, + $_POST['destination_db'], $multi_edit_columns_name, + $_POST['destination_table'], + $_POST['destination_column'], $cfgRelation, $db, $table, isset($existrel) ? $existrel : null ); } // end if (updates for internal relations) @@ -126,7 +124,7 @@ if ($cfgRelation['displaywork'] && isset($display_field)) { } // end if // If we did an update, refresh our data -if (isset($destination_db) && $cfgRelation['relwork']) { +if (isset($_POST['destination_db']) && $cfgRelation['relwork']) { $existrel = PMA_getForeigners($db, $table, '', 'internal'); } if (isset($destination_foreign_db)