161 lines
4.5 KiB
PHP
161 lines
4.5 KiB
PHP
<?php
|
|
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
|
/**
|
|
* Display table relations for viewing and editing
|
|
*
|
|
* includes phpMyAdmin relations and InnoDB relations
|
|
*
|
|
* @todo fix name handling: currently names with dots (.) are not properly handled
|
|
* for internal relations (but foreign keys relations are correct)
|
|
* @todo foreign key constraints require both fields being of equal type and size
|
|
* @todo check foreign fields to be from same type and size, all other makes no sense
|
|
* @todo if above todos are fullfilled we can add all fields meet requirements
|
|
* in the select dropdown
|
|
* @package PhpMyAdmin
|
|
*/
|
|
|
|
/**
|
|
* Gets some core libraries
|
|
*/
|
|
require_once 'libraries/common.inc.php';
|
|
require_once 'libraries/index.lib.php';
|
|
require_once 'libraries/tbl_relation.lib.php';
|
|
|
|
$response = PMA_Response::getInstance();
|
|
|
|
// Send table of column names to populate corresponding dropdowns depending
|
|
// on the current selection
|
|
if (isset($_REQUEST['getDropdownValues'])
|
|
&& $_REQUEST['getDropdownValues'] === 'true'
|
|
) {
|
|
PMA_sendHtmlForTableOrColumnDropdownList();
|
|
}
|
|
|
|
$header = $response->getHeader();
|
|
$scripts = $header->getScripts();
|
|
$scripts->addFile('tbl_relation.js');
|
|
$scripts->addFile('indexes.js');
|
|
|
|
/**
|
|
* Sets globals from $_POST
|
|
*/
|
|
$post_params = array(
|
|
'destination_foreign_db',
|
|
'destination_foreign_table',
|
|
'destination_foreign_column',
|
|
'display_field',
|
|
'fields_name',
|
|
'on_delete',
|
|
'on_update'
|
|
);
|
|
|
|
foreach ($post_params as $one_post_param) {
|
|
if (isset($_POST[$one_post_param])) {
|
|
$GLOBALS[$one_post_param] = $_POST[$one_post_param];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets tables informations
|
|
*/
|
|
require_once 'libraries/tbl_info.inc.php';
|
|
|
|
$options_array = array(
|
|
'CASCADE' => 'CASCADE',
|
|
'SET_NULL' => 'SET NULL',
|
|
'NO_ACTION' => 'NO ACTION',
|
|
'RESTRICT' => 'RESTRICT',
|
|
);
|
|
|
|
/**
|
|
* Gets the relation settings
|
|
*/
|
|
$cfgRelation = PMA_getRelationsParam();
|
|
|
|
/**
|
|
* Updates
|
|
*/
|
|
if ($cfgRelation['relwork']) {
|
|
$existrel = PMA_getForeigners($db, $table, '', 'internal');
|
|
}
|
|
if (PMA_Util::isForeignKeySupported($tbl_storage_engine)) {
|
|
$existrel_foreign = PMA_getForeigners($db, $table, '', 'foreign');
|
|
}
|
|
if ($cfgRelation['displaywork']) {
|
|
$disp = PMA_getDisplayField($db, $table);
|
|
}
|
|
|
|
// will be used in the logic for internal relations and foreign keys:
|
|
$multi_edit_columns_name = isset($_REQUEST['fields_name'])
|
|
? $_REQUEST['fields_name']
|
|
: null;
|
|
|
|
|
|
// 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($_POST['destination_db']) && $cfgRelation['relwork']) {
|
|
PMA_handleUpdatesForInternalRelations(
|
|
$_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)
|
|
|
|
$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(
|
|
$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)
|
|
|
|
|
|
// 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
|
|
);
|
|
} // end if
|
|
|
|
// If we did an update, refresh our data
|
|
if (isset($_POST['destination_db']) && $cfgRelation['relwork']) {
|
|
$existrel = PMA_getForeigners($db, $table, '', 'internal');
|
|
}
|
|
if (isset($destination_foreign_db)
|
|
&& PMA_Util::isForeignKeySupported($tbl_storage_engine)
|
|
) {
|
|
$existrel_foreign = PMA_getForeigners($db, $table, '', 'foreign');
|
|
}
|
|
|
|
if ($cfgRelation['displaywork']) {
|
|
$disp = PMA_getDisplayField($db, $table);
|
|
}
|
|
|
|
|
|
/**
|
|
* Dialog
|
|
*/
|
|
// Now find out the columns of our $table
|
|
// need to use PMA_DatabaseInterface::QUERY_STORE with $GLOBALS['dbi']->numRows()
|
|
// in mysqli
|
|
$columns = $GLOBALS['dbi']->getColumns($db, $table);
|
|
|
|
// common form
|
|
$html_output .= PMA_getHtmlForCommonForm(
|
|
$db, $table, $columns, $cfgRelation, $tbl_storage_engine, $existrel,
|
|
isset($existrel_foreign) ? $existrel_foreign : null, $options_array
|
|
);
|
|
|
|
if (PMA_Util::isForeignKeySupported($tbl_storage_engine)) {
|
|
$html_output .= PMA_getHtmlForDisplayIndexes();
|
|
}
|
|
// Render HTML output
|
|
PMA_Response::getInstance()->addHTML($html_output);
|
|
?>
|