Use db_desginer.php as a route for all designer operation. Combine pmd_general.lib.php and designer.lib.php into db_designer.lib.php
Signed-off-by: Bimal Yashodha <kb.yashodha@gmail.com>
This commit is contained in:
parent
7e1f1d21ef
commit
285c18acdd
@ -6,12 +6,9 @@
|
||||
* @package PhpMyAdmin-Designer
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/pmd_common.php';
|
||||
require_once 'libraries/pmd_general.lib.php';
|
||||
require_once 'libraries/db_designer.lib.php';
|
||||
|
||||
$script_display_field = PMA_getTablesInfo();
|
||||
$tab_column = PMA_getColumnsInfo();
|
||||
@ -24,11 +21,10 @@ $response = PMA_Response::getInstance();
|
||||
|
||||
if (isset($_REQUEST['dialog'])) {
|
||||
|
||||
include_once 'libraries/designer.lib.php';
|
||||
if ($_REQUEST['dialog'] == 'edit') {
|
||||
$html = PMA_getHtmlForEditOrDeletePages($GLOBALS['db'], 'edit');
|
||||
$html = PMA_getHtmlForEditOrDeletePages($GLOBALS['db'], 'editPage');
|
||||
} else if ($_REQUEST['dialog'] == 'delete') {
|
||||
$html = PMA_getHtmlForEditOrDeletePages($GLOBALS['db'], 'delete');
|
||||
$html = PMA_getHtmlForEditOrDeletePages($GLOBALS['db'], 'deletePage');
|
||||
} else if ($_REQUEST['dialog'] == 'save_as') {
|
||||
$html = PMA_getHtmlForPageSaveAs($GLOBALS['db']);
|
||||
} else if ($_REQUEST['dialog'] == 'export') {
|
||||
@ -44,14 +40,14 @@ if (isset($_REQUEST['dialog'])) {
|
||||
|
||||
if (isset($_REQUEST['operation'])) {
|
||||
|
||||
if ($_REQUEST['operation'] == 'delete') {
|
||||
if ($_REQUEST['operation'] == 'deletePage') {
|
||||
$result = PMA_deletePage($_REQUEST['selected_page']);
|
||||
if ($result) {
|
||||
$response->isSuccess(true);
|
||||
} else {
|
||||
$response->isSuccess(false);
|
||||
}
|
||||
} elseif ($_REQUEST['operation'] == 'save') {
|
||||
} elseif ($_REQUEST['operation'] == 'savePage') {
|
||||
if ($_REQUEST['save_page'] == 'same') {
|
||||
$page = $_REQUEST['selected_page'];
|
||||
} elseif ($_REQUEST['save_page'] == 'new') {
|
||||
@ -63,6 +59,31 @@ if (isset($_REQUEST['operation'])) {
|
||||
} else {
|
||||
$response->isSuccess(false);
|
||||
}
|
||||
} elseif ($_REQUEST['operation'] == 'setDisplayField') {
|
||||
PMA_saveDisplayField(
|
||||
$_REQUEST['db'], $_REQUEST['table'], $_REQUEST['field']
|
||||
);
|
||||
$response->isSuccess(true);
|
||||
} elseif ($_REQUEST['operation'] == 'addNewRelation') {
|
||||
list($success, $message) = PMA_addNewRelation(
|
||||
$_REQUEST['db'],
|
||||
$_REQUEST['T1'],
|
||||
$_REQUEST['F1'],
|
||||
$_REQUEST['T2'],
|
||||
$_REQUEST['F2'],
|
||||
$_REQUEST['on_delete'],
|
||||
$_REQUEST['on_update']
|
||||
);
|
||||
$response->isSuccess($success);
|
||||
$response->addJSON($success ? 'message' : 'error', $message);
|
||||
} elseif ($_REQUEST['operation'] == 'removeRelation') {
|
||||
PMA_removeRelation(
|
||||
$_REQUEST['T1'],
|
||||
$_REQUEST['F1'],
|
||||
$_REQUEST['T2'],
|
||||
$_REQUEST['F2']
|
||||
);
|
||||
$response->isSuccess(true);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
@ -86,12 +107,12 @@ $response = PMA_Response::getInstance();
|
||||
$response->getFooter()->setMinimal();
|
||||
$header = $response->getHeader();
|
||||
$header->setBodyId('pmd_body');
|
||||
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('jquery/jquery.fullscreen.js');
|
||||
$scripts->addFile('pmd/designer_db.js');
|
||||
$scripts->addFile('pmd/designer_objects.js');
|
||||
$scripts->addFile('pmd/designer_page.js');
|
||||
$scripts->addFile('pmd/ajax.js');
|
||||
$scripts->addFile('pmd/history.js');
|
||||
$scripts->addFile('pmd/move.js');
|
||||
$scripts->addFile('pmd/iecanvas.js', true);
|
||||
@ -112,7 +112,7 @@ $db_qbe = new PMA_DBQbe($GLOBALS['db'], $savedSearchList, $savedSearch);
|
||||
* Displays the Query by example form
|
||||
*/
|
||||
if ($cfgRelation['pdfwork']) {
|
||||
$url = 'pmd_general.php' . PMA_URL_getCommon(
|
||||
$url = 'db_designer.php' . PMA_URL_getCommon(
|
||||
array_merge(
|
||||
$url_params,
|
||||
array('query' => 1)
|
||||
|
||||
@ -405,6 +405,7 @@ $js_messages['strEnterValidPageName'] = __('Please enter a valid page name');
|
||||
$js_messages['strLeavingPage'] = __('Do you want to save the changes to the current page?');
|
||||
$js_messages['strSuccessfulPageDelete'] = __('Successfully deleted the page');
|
||||
$js_messages['strExportRelationalSchema'] = __('Export relational schema');
|
||||
$js_messages['strModificationSaved'] = __('Modifications have been saved');
|
||||
|
||||
/* Visual query builder (js/pmd/move.js) */
|
||||
$js_messages['strAddOption'] = __('Add an option for column "%s".');
|
||||
|
||||
@ -1,60 +0,0 @@
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
*
|
||||
* @package PhpMyAdmin-Designer
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
function PrintXML(data)
|
||||
{
|
||||
var $root = $(data).find('root');
|
||||
if ($root.length === 0) {
|
||||
// error
|
||||
var myWin = window.open('', 'Report', 'width=400, height=250, resizable=1, scrollbars=1, status=1');
|
||||
var tmp = myWin.document;
|
||||
tmp.write(data);
|
||||
tmp.close();
|
||||
} else {
|
||||
// success
|
||||
if ($root.attr('act') == 'save_pos') {
|
||||
PMA_ajaxShowMessage($root.attr('return'));
|
||||
} else if ($root.attr('act') == 'relation_upd') {
|
||||
PMA_ajaxShowMessage($root.attr('return'));
|
||||
if ($root.attr('b') == '1') {
|
||||
contr.splice($root.attr('K'), 1);
|
||||
Re_load();
|
||||
}
|
||||
} else if ($root.attr('act') == 'relation_new') {
|
||||
PMA_ajaxShowMessage($root.attr('return'));
|
||||
if ($root.attr('b') == '1') {
|
||||
var i = contr.length;
|
||||
var t1 = $root.attr('DB1') + '.' + $root.attr('T1');
|
||||
var f1 = $root.attr('F1');
|
||||
var t2 = $root.attr('DB2') + '.' + $root.attr('T2');
|
||||
var f2 = $root.attr('F2');
|
||||
contr[i] = [];
|
||||
contr[i][''] = [];
|
||||
contr[i][''][t2] = [];
|
||||
contr[i][''][t2][f2] = [];
|
||||
contr[i][''][t2][f2][0] = t1;
|
||||
contr[i][''][t2][f2][1] = f1;
|
||||
Re_load();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
function makeRequest(url, parameters)
|
||||
{
|
||||
var $msg = PMA_ajaxShowMessage();
|
||||
$.post(url, parameters, function (data) {
|
||||
PMA_ajaxRemoveMessage($msg);
|
||||
PrintXML(data);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
@ -566,14 +566,24 @@ function Get_url_pos()
|
||||
|
||||
function Save2(callback)
|
||||
{
|
||||
_change = 0;
|
||||
if (pmd_tables_enabled) {
|
||||
var poststr = 'IS_AJAX=1&server=' + server + '&db=' + db + '&token=' + token + '&die_save_pos=1&selected_page=' + selected_page;
|
||||
var poststr = '&operation=savePage&save_page=same&ajax_request=true';
|
||||
poststr += '&server=' + server + '&db=' + db + '&token=' + token + '&selected_page=' + selected_page;
|
||||
poststr += Get_url_pos();
|
||||
makeRequest('pmd_save_pos.php', poststr);
|
||||
if (typeof callback !== 'undefined') {
|
||||
callback();
|
||||
}
|
||||
|
||||
var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
|
||||
$.post('db_designer.php', poststr, function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
PMA_ajaxRemoveMessage($msgbox);
|
||||
PMA_ajaxShowMessage(PMA_messages.strModificationSaved);
|
||||
_change = 0;
|
||||
if (typeof callback !== 'undefined') {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
var name = $("#page_name").html().trim();
|
||||
Save_to_selected_page(db, selected_page, name, Get_url_pos(), function (page){
|
||||
@ -634,10 +644,10 @@ function Save3(callback)
|
||||
$(this).dialog('close');
|
||||
};
|
||||
|
||||
var $form = $('<form action="pmd_general.php" method="post" name="save_page" id="save_page" class="ajax"></form>')
|
||||
var $form = $('<form action="db_designer.php" method="post" name="save_page" id="save_page" class="ajax"></form>')
|
||||
.append('<input type="hidden" name="db" value="' + db + '" />')
|
||||
.append('<input type="hidden" name="token" value="' + token + '" />')
|
||||
.append('<input type="hidden" name="operation" value="save" />')
|
||||
.append('<input type="hidden" name="operation" value="savePage" />')
|
||||
.append('<input type="hidden" name="save_page" value="new" />')
|
||||
.append('<label for="selected_value">' + PMA_messages.strPageName
|
||||
+ '</label>:<input type="text" name="selected_value" />');
|
||||
@ -677,7 +687,7 @@ function Edit_pages()
|
||||
|
||||
var $msgbox = PMA_ajaxShowMessage();
|
||||
var params = 'ajax_request=true&dialog=edit&token=' + token + '&db=' + db;
|
||||
$.get("pmd_general.php", params, function (data) {
|
||||
$.get("db_designer.php", params, function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
@ -703,6 +713,7 @@ function Edit_pages()
|
||||
}); // end $.get()
|
||||
});
|
||||
}
|
||||
|
||||
// ----------------------------- DELETE PAGES ---------------------------------------
|
||||
function Delete_pages()
|
||||
{
|
||||
@ -755,7 +766,7 @@ function Delete_pages()
|
||||
|
||||
var $msgbox = PMA_ajaxShowMessage();
|
||||
var params = 'ajax_request=true&dialog=delete&token=' + token + '&db=' + db;
|
||||
$.get("pmd_general.php", params, function (data) {
|
||||
$.get("db_designer.php", params, function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
@ -853,7 +864,7 @@ function Save_as()
|
||||
|
||||
var $msgbox = PMA_ajaxShowMessage();
|
||||
var params = 'ajax_request=true&dialog=save_as&token=' + token + '&db=' + db;
|
||||
$.get("pmd_general.php", params, function (data) {
|
||||
$.get("db_designer.php", params, function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
@ -931,7 +942,7 @@ function Export_pages()
|
||||
};
|
||||
var $msgbox = PMA_ajaxShowMessage();
|
||||
var params = 'ajax_request=true&dialog=export&token=' + token + '&db=' + db + '&selected_page=' + selected_page;
|
||||
$.get("pmd_general.php", params, function (data) {
|
||||
$.get("db_designer.php", params, function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
@ -980,7 +991,7 @@ function Load_page(page) {
|
||||
if (page !== null) {
|
||||
param_page = '&page=' + page;
|
||||
}
|
||||
$('<a href="pmd_general.php?db=' + db + '&token=' + token + param_page + '"></a>')
|
||||
$('<a href="db_designer.php?db=' + db + '&token=' + token + param_page + '"></a>')
|
||||
.appendTo($('#page_content'))
|
||||
.click();
|
||||
} else {
|
||||
@ -1091,19 +1102,37 @@ function Click_field(T, f, PK) // table field
|
||||
document.getElementById('pmd_hint').innerHTML = "";
|
||||
document.getElementById('pmd_hint').style.display = 'none';
|
||||
document.getElementById('display_field_button').className = 'M_butt';
|
||||
makeRequest('pmd_display_field.php', 'T=' + T + '&F=' + f + '&server=' + server + '&db=' + db + '&token=' + token);
|
||||
|
||||
var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
|
||||
$.post('db_designer.php',
|
||||
{operation: 'setDisplayField', ajax_request: true, server: server, token: token, db: db, table: T, field: f},
|
||||
function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
PMA_ajaxRemoveMessage($msgbox);
|
||||
PMA_ajaxShowMessage(PMA_messages.strModificationSaved);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function New_relation()
|
||||
{
|
||||
document.getElementById('layer_new_relation').style.display = 'none';
|
||||
link_relation += '&server=' + server + '&db=' + db + '&token=' + token + '&die_save_pos=0';
|
||||
link_relation += '&server=' + server + '&db=' + db + '&token=' + token;
|
||||
link_relation += '&on_delete=' + document.getElementById('on_delete').value + '&on_update=' + document.getElementById('on_update').value;
|
||||
link_relation += Get_url_pos();
|
||||
link_relation += '&operation=addNewRelation&ajax_request=true';
|
||||
|
||||
//alert(link_relation);
|
||||
makeRequest('pmd_relation_new.php', link_relation);
|
||||
var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
|
||||
$.post('db_designer.php', link_relation, function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
PMA_ajaxRemoveMessage($msgbox);
|
||||
Load_page(selected_page);
|
||||
}
|
||||
}); // end $.post()
|
||||
}
|
||||
|
||||
//-------------------------- create tables -------------------------------------
|
||||
@ -1305,9 +1334,18 @@ function Canvas_click(id)
|
||||
function Upd_relation()
|
||||
{
|
||||
document.getElementById('layer_upd_relation').style.display = 'none';
|
||||
link_relation += '&server=' + server + '&db=' + db + '&token=' + token + '&die_save_pos=0';
|
||||
link_relation += Get_url_pos();
|
||||
makeRequest('pmd_relation_upd.php', link_relation);
|
||||
link_relation += '&server=' + server + '&db=' + db + '&token=' + token;
|
||||
link_relation += '&operation=removeRelation&ajax_request=true';
|
||||
|
||||
var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
|
||||
$.post('db_designer.php', link_relation, function (data) {
|
||||
if (data.success === false) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
} else {
|
||||
PMA_ajaxRemoveMessage($msgbox);
|
||||
Load_page(selected_page);
|
||||
}
|
||||
}); // end $.post()
|
||||
}
|
||||
|
||||
function VisibleTab(id, t_n)
|
||||
|
||||
@ -480,7 +480,7 @@ class PMA_Menu
|
||||
if (! $db_is_system_schema) {
|
||||
$tabs['designer']['text'] = __('Designer');
|
||||
$tabs['designer']['icon'] = 'b_relations.png';
|
||||
$tabs['designer']['link'] = 'pmd_general.php';
|
||||
$tabs['designer']['link'] = 'db_designer.php';
|
||||
$tabs['designer']['id'] = 'designer_tab';
|
||||
}
|
||||
|
||||
|
||||
@ -1,15 +1,181 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* phpMyAdmin designer general code
|
||||
* Set of functions related to designer
|
||||
*
|
||||
* @package PhpMyAdmin-Designer
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
if (! defined('PHPMYADMIN')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
require_once 'libraries/relation.lib.php';
|
||||
|
||||
/**
|
||||
* Function to get html for displaying the page edit/delete form
|
||||
*
|
||||
* @param string $db databasae name
|
||||
* @param string $operation 'edit' or 'delete' depending on the operation
|
||||
*
|
||||
* @return string html content
|
||||
*/
|
||||
function PMA_getHtmlForEditOrDeletePages($db, $operation)
|
||||
{
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
$html = '<form action="db_designer.php" method="post"'
|
||||
. ' name="edit_delete_pages" id="edit_delete_pages" class="ajax">';
|
||||
$html .= PMA_URL_getHiddenInputs($db);
|
||||
$html .= '<fieldset id="page_edit_delete_options">';
|
||||
$html .= '<input type="hidden" name="operation" value="' . $operation . '" />';
|
||||
$html .= '<label for="selected_page">';
|
||||
if ($operation == 'edit') {
|
||||
$html .= __("Page to open");
|
||||
} else {
|
||||
$html .= __("Page to delete");
|
||||
}
|
||||
$html .= ': </label>';
|
||||
$html .= '<select name="selected_page" id="selected_page">';
|
||||
$html .= '<option value="0">-- ' . __('Select page') . ' --</option>';
|
||||
if ($cfgRelation['pdfwork']) {
|
||||
$pages = PMA_getPageIdsAndNames($db);
|
||||
foreach ($pages as $nr => $desc) {
|
||||
$html .= '<option value="' . $nr . '">';
|
||||
$html .= htmlspecialchars($desc) . '</option>';
|
||||
}
|
||||
}
|
||||
$html .= '</select>';
|
||||
$html .= '</fieldset>';
|
||||
$html .= '</form>';
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get html for displaying the page save as form
|
||||
*
|
||||
* @param string $db databasae name
|
||||
*
|
||||
* @return string html content
|
||||
*/
|
||||
function PMA_getHtmlForPageSaveAs($db)
|
||||
{
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
$choices = array(
|
||||
'same' => __('Save to selected page'),
|
||||
'new' => __('Create a page and save to it')
|
||||
);
|
||||
|
||||
$html = '<form action="db_designer.php" method="post"'
|
||||
. ' name="save_as_pages" id="save_as_pages" class="ajax">';
|
||||
$html .= PMA_URL_getHiddenInputs($db);
|
||||
$html .= '<fieldset id="page_save_as_options">';
|
||||
$html .= '<table><tbody>';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<td>';
|
||||
$html .= '<input type="hidden" name="operation" value="savePage" />';
|
||||
$html .= '<select name="selected_page" id="selected_page">';
|
||||
$html .= '<option value="0">-- ' . __('Select page') . ' --</option>';
|
||||
|
||||
if ($cfgRelation['pdfwork']) {
|
||||
$pages = PMA_getPageIdsAndNames($db);
|
||||
foreach ($pages as $nr => $desc) {
|
||||
$html .= '<option value="' . $nr . '">';
|
||||
$html .= htmlspecialchars($desc) . '</option>';
|
||||
}
|
||||
}
|
||||
$html .= '</select>';
|
||||
$html .= '</td>';
|
||||
$html .= '</tr>';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<td>';
|
||||
$html .= PMA_Util::getRadioFields('save_page', $choices, 'same', true);
|
||||
$html .= '</td>';
|
||||
$html .= '</tr>';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<td>';
|
||||
$html .= '<label for="selected_value">' . __('New page name') . '</label>';
|
||||
$html .= '<input type="text" name="selected_value" id="selected_value" />';
|
||||
$html .= '</td>';
|
||||
$html .= '</tr>';
|
||||
|
||||
$html .= '</tbody></table>';
|
||||
$html .= '</fieldset>';
|
||||
$html .= '</form>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve IDs and names of schema pages
|
||||
*
|
||||
* @param string $db database name
|
||||
*
|
||||
* @return array array of schema page id and names
|
||||
*/
|
||||
function PMA_getPageIdsAndNames($db)
|
||||
{
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
$page_query = "SELECT `page_nr`, `page_descr` FROM "
|
||||
. PMA_Util::backquote($cfgRelation['db']) . "."
|
||||
. PMA_Util::backquote($cfgRelation['pdf_pages'])
|
||||
. " WHERE db_name = '" . PMA_Util::sqlAddSlashes($db) . "'"
|
||||
. " ORDER BY `page_nr`";
|
||||
$page_rs = PMA_queryAsControlUser(
|
||||
$page_query, false, PMA_DatabaseInterface::QUERY_STORE
|
||||
);
|
||||
|
||||
$result = array();
|
||||
while ($curr_page = $GLOBALS['dbi']->fetchAssoc($page_rs)) {
|
||||
$result[$curr_page['page_nr']] = $curr_page['page_descr'];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get html for displaying the schema export
|
||||
*
|
||||
* @param string $db database name
|
||||
* @param int $page the page to be exported
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function PMA_getHtmlForSchemaExport($db, $page)
|
||||
{
|
||||
/* Scan for schema plugins */
|
||||
$export_list = PMA_getPlugins(
|
||||
"schema",
|
||||
'libraries/plugins/schema/',
|
||||
null
|
||||
);
|
||||
|
||||
/* Fail if we didn't find any schema plugin */
|
||||
if (empty($export_list)) {
|
||||
return PMA_Message::error(
|
||||
__('Could not load schema plugins, please check your installation!')
|
||||
)->getDisplay();
|
||||
}
|
||||
|
||||
|
||||
$htmlString = '<form method="post" action="schema_export.php"'
|
||||
. ' class="disableAjax" id="id_export_pages">';
|
||||
$htmlString .= '<fieldset>';
|
||||
$htmlString .= PMA_URL_getHiddenInputs($db);
|
||||
$htmlString .= '<label>' . __('Select Export Relational Type')
|
||||
. '</label><br />';
|
||||
$htmlString .= PMA_pluginGetChoice(
|
||||
'Schema', 'export_type', $export_list, 'format'
|
||||
);
|
||||
$htmlString .= '<input type="hidden" name="chpage"'
|
||||
. ' value="' . htmlspecialchars($page) . '" />';
|
||||
$htmlString .= PMA_pluginGetOptions('Schema', $export_list);
|
||||
$htmlString .= '</fieldset>';
|
||||
$htmlString .= '</form>';
|
||||
|
||||
return $htmlString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML for including some variable to be accessed by JavaScript
|
||||
*
|
||||
@ -86,7 +252,7 @@ function PMA_getDesignerPageTopMenu($selected_page)
|
||||
$html .= 'class="M_butt hide" target="_self">';
|
||||
$html .= '<img title="' . __('Exit fullscreen') . '" alt="" ';
|
||||
$html .= 'src="' . $_SESSION['PMA_Theme']->getImgPath('pmd/exitFullscreen.png')
|
||||
. '" />';
|
||||
. '" />';
|
||||
$html .= '</a>';
|
||||
|
||||
$html .= '<img class="M_bord" alt="" ';
|
||||
@ -275,7 +441,7 @@ function PMA_getHTMLTableList($tab_pos, $display_page)
|
||||
$html .= 'return false">';
|
||||
$html .= '<img title="' . __('Hide/Show all') . '" alt="v" id="key_HS_all" ';
|
||||
$html .= 'src="' . $_SESSION['PMA_Theme']->getImgPath('pmd/downarrow1.png')
|
||||
. '" />';
|
||||
. '" />';
|
||||
$html .= '</a>';
|
||||
|
||||
$html .= '<a href="#" class="M_butt" target="_self" ';
|
||||
@ -284,7 +450,7 @@ function PMA_getHTMLTableList($tab_pos, $display_page)
|
||||
$html .= '<img alt="v" id="key_HS" ';
|
||||
$html .= 'title="' . __('Hide/Show Tables with no relation') . '"';
|
||||
$html .= 'src="' . $_SESSION['PMA_Theme']->getImgPath('pmd/downarrow2.png')
|
||||
. '" />';
|
||||
. '" />';
|
||||
$html .= '</a>';
|
||||
|
||||
$html .= '</div>';
|
||||
@ -464,8 +630,8 @@ function PMA_getDatabaseTables(
|
||||
);
|
||||
for (
|
||||
$j = 0, $id_cnt = count($tab_column[$t_n]["COLUMN_ID"]);
|
||||
$j < $id_cnt;
|
||||
$j++
|
||||
$j < $id_cnt;
|
||||
$j++
|
||||
) {
|
||||
$html .= '<tr id="id_tr_'
|
||||
. $GLOBALS['PMD_URL']["TABLE_NAME_SMALL"][$i] . '.'
|
||||
@ -1192,4 +1358,4 @@ function PMA_getCacheImages()
|
||||
|
||||
return $html;
|
||||
}
|
||||
?>
|
||||
?>
|
||||
@ -1,178 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Set of functions related to designer
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
if (! defined('PHPMYADMIN')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
require_once 'libraries/relation.lib.php';
|
||||
|
||||
/**
|
||||
* Function to get html for displaying the page edit/delete form
|
||||
*
|
||||
* @param string $db databasae name
|
||||
* @param string $operation 'edit' or 'delete' depending on the operation
|
||||
*
|
||||
* @return string html content
|
||||
*/
|
||||
function PMA_getHtmlForEditOrDeletePages($db, $operation)
|
||||
{
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
$html = '<form action="pmd_general.php" method="post"'
|
||||
. ' name="edit_delete_pages" id="edit_delete_pages" class="ajax">';
|
||||
$html .= PMA_URL_getHiddenInputs($db);
|
||||
$html .= '<fieldset id="page_edit_delete_options">';
|
||||
$html .= '<input type="hidden" name="operation" value="' . $operation . '" />';
|
||||
$html .= '<label for="selected_page">';
|
||||
if ($operation == 'edit') {
|
||||
$html .= __("Page to open");
|
||||
} else {
|
||||
$html .= __("Page to delete");
|
||||
}
|
||||
$html .= ': </label>';
|
||||
$html .= '<select name="selected_page" id="selected_page">';
|
||||
$html .= '<option value="0">-- ' . __('Select page') . ' --</option>';
|
||||
if ($cfgRelation['pdfwork']) {
|
||||
$pages = PMA_getPageIdsAndNames($db);
|
||||
foreach ($pages as $nr => $desc) {
|
||||
$html .= '<option value="' . $nr . '">';
|
||||
$html .= htmlspecialchars($desc) . '</option>';
|
||||
}
|
||||
}
|
||||
$html .= '</select>';
|
||||
$html .= '</fieldset>';
|
||||
$html .= '</form>';
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get html for displaying the page save as form
|
||||
*
|
||||
* @param string $db databasae name
|
||||
*
|
||||
* @return string html content
|
||||
*/
|
||||
function PMA_getHtmlForPageSaveAs($db)
|
||||
{
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
$choices = array(
|
||||
'same' => __('Save to selected page'),
|
||||
'new' => __('Create a page and save to it')
|
||||
);
|
||||
|
||||
$html = '<form action="pmd_general.php" method="post"'
|
||||
. ' name="save_as_pages" id="save_as_pages" class="ajax">';
|
||||
$html .= PMA_URL_getHiddenInputs($db);
|
||||
$html .= '<fieldset id="page_save_as_options">';
|
||||
$html .= '<table><tbody>';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<td>';
|
||||
$html .= '<input type="hidden" name="operation" value="save" />';
|
||||
$html .= '<select name="selected_page" id="selected_page">';
|
||||
$html .= '<option value="0">-- ' . __('Select page') . ' --</option>';
|
||||
|
||||
if ($cfgRelation['pdfwork']) {
|
||||
$pages = PMA_getPageIdsAndNames($db);
|
||||
foreach ($pages as $nr => $desc) {
|
||||
$html .= '<option value="' . $nr . '">';
|
||||
$html .= htmlspecialchars($desc) . '</option>';
|
||||
}
|
||||
}
|
||||
$html .= '</select>';
|
||||
$html .= '</td>';
|
||||
$html .= '</tr>';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<td>';
|
||||
$html .= PMA_Util::getRadioFields('save_page', $choices, 'same', true);
|
||||
$html .= '</td>';
|
||||
$html .= '</tr>';
|
||||
|
||||
$html .= '<tr>';
|
||||
$html .= '<td>';
|
||||
$html .= '<label for="selected_value">' . __('New page name') . '</label>';
|
||||
$html .= '<input type="text" name="selected_value" id="selected_value" />';
|
||||
$html .= '</td>';
|
||||
$html .= '</tr>';
|
||||
|
||||
$html .= '</tbody></table>';
|
||||
$html .= '</fieldset>';
|
||||
$html .= '</form>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve IDs and names of schema pages
|
||||
*
|
||||
* @param string $db database name
|
||||
*
|
||||
* @return array array of schema page id and names
|
||||
*/
|
||||
function PMA_getPageIdsAndNames($db)
|
||||
{
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
$page_query = "SELECT `page_nr`, `page_descr` FROM "
|
||||
. PMA_Util::backquote($cfgRelation['db']) . "."
|
||||
. PMA_Util::backquote($cfgRelation['pdf_pages'])
|
||||
. " WHERE db_name = '" . PMA_Util::sqlAddSlashes($db) . "'"
|
||||
. " ORDER BY `page_nr`";
|
||||
$page_rs = PMA_queryAsControlUser(
|
||||
$page_query, false, PMA_DatabaseInterface::QUERY_STORE
|
||||
);
|
||||
|
||||
$result = array();
|
||||
while ($curr_page = $GLOBALS['dbi']->fetchAssoc($page_rs)) {
|
||||
$result[$curr_page['page_nr']] = $curr_page['page_descr'];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get html for displaying the schema export
|
||||
*
|
||||
* @param string $db database name
|
||||
* @param int $page the page to be exported
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function PMA_getHtmlForSchemaExport($db, $page)
|
||||
{
|
||||
/* Scan for schema plugins */
|
||||
$export_list = PMA_getPlugins(
|
||||
"schema",
|
||||
'libraries/plugins/schema/',
|
||||
null
|
||||
);
|
||||
|
||||
/* Fail if we didn't find any schema plugin */
|
||||
if (empty($export_list)) {
|
||||
return PMA_Message::error(
|
||||
__('Could not load schema plugins, please check your installation!')
|
||||
)->getDisplay();
|
||||
}
|
||||
|
||||
|
||||
$htmlString = '<form method="post" action="schema_export.php"'
|
||||
. ' class="disableAjax" id="id_export_pages">';
|
||||
$htmlString .= '<fieldset>';
|
||||
$htmlString .= PMA_URL_getHiddenInputs($db);
|
||||
$htmlString .= '<label>' . __('Select Export Relational Type')
|
||||
. '</label><br />';
|
||||
$htmlString .= PMA_pluginGetChoice(
|
||||
'Schema', 'export_type', $export_list, 'format'
|
||||
);
|
||||
$htmlString .= '<input type="hidden" name="chpage"'
|
||||
. ' value="' . htmlspecialchars($page) . '" />';
|
||||
$htmlString .= PMA_pluginGetOptions('Schema', $export_list);
|
||||
$htmlString .= '</fieldset>';
|
||||
$htmlString .= '</form>';
|
||||
|
||||
return $htmlString;
|
||||
}
|
||||
?>
|
||||
@ -429,25 +429,199 @@ function PMA_saveTablePositions($pg)
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepares XML output for js/pmd/ajax.js to display a message
|
||||
* Saves the display field for a table.
|
||||
*
|
||||
* @param string $b b attribute value
|
||||
* @param string $ret Return attribute value
|
||||
* @param string $db database name
|
||||
* @param string $table table name
|
||||
* @param string $field display field name
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function PMA_returnUpd($b, $ret)
|
||||
function PMA_saveDisplayField($db, $table, $field)
|
||||
{
|
||||
// not sure where this was defined...
|
||||
global $K;
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
if (!$cfgRelation['displaywork']) {
|
||||
return false;
|
||||
}
|
||||
|
||||
header("Content-Type: text/xml; charset=utf-8");
|
||||
header("Cache-Control: no-cache");
|
||||
die(
|
||||
'<root act="relation_upd" return="' . $ret . '" b="'
|
||||
. $b . '" K="' . $K . '"></root>'
|
||||
);
|
||||
$disp = PMA_getDisplayField($db, $table);
|
||||
if ($disp && $disp === $field) {
|
||||
$field = '';
|
||||
}
|
||||
|
||||
include_once 'libraries/tbl_relation.lib.php';
|
||||
PMA_handleUpdateForDisplayField($disp, $field, $db, $table, $cfgRelation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new foreign relation
|
||||
*
|
||||
* @param string $db database name
|
||||
* @param string $T1 foreign table
|
||||
* @param string $F1 foreign field
|
||||
* @param string $T2 master table
|
||||
* @param string $F2 master field
|
||||
* @param string $on_delete on delete action
|
||||
* @param string $on_update on updaet action
|
||||
*
|
||||
* @return array array of success/failure and message
|
||||
*/
|
||||
function PMA_addNewRelation($db, $T1, $F1, $T2, $F2, $on_delete, $on_update)
|
||||
{
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($db, $T1);
|
||||
$type_T1 = strtoupper($tables[$T1]['ENGINE']);
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($db, $T2);
|
||||
$type_T2 = strtoupper($tables[$T2]['ENGINE']);
|
||||
|
||||
// native foreign key
|
||||
if (PMA_Util::isForeignKeySupported($type_T1)
|
||||
&& PMA_Util::isForeignKeySupported($type_T2)
|
||||
&& $type_T1 == $type_T2
|
||||
) {
|
||||
// relation exists?
|
||||
$existrel_foreign = PMA_getForeigners($db, $T2, '', 'foreign');
|
||||
$foreigner = PMA_searchColumnInForeigners($existrel_foreign, $F2);
|
||||
if ($foreigner
|
||||
&& isset($foreigner['constraint'])
|
||||
) {
|
||||
return array(false, __('Error: relation already exists.'));
|
||||
}
|
||||
// note: in InnoDB, the index does not requires to be on a PRIMARY
|
||||
// or UNIQUE key
|
||||
// improve: check all other requirements for InnoDB relations
|
||||
$result = $GLOBALS['dbi']->query(
|
||||
'SHOW INDEX FROM ' . PMA_Util::backquote($db)
|
||||
. '.' . PMA_Util::backquote($T1) . ';'
|
||||
);
|
||||
|
||||
// will be use to emphasis prim. keys in the table view
|
||||
$index_array1 = array();
|
||||
while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
|
||||
$index_array1[$row['Column_name']] = 1;
|
||||
}
|
||||
$GLOBALS['dbi']->freeResult($result);
|
||||
|
||||
$result = $GLOBALS['dbi']->query(
|
||||
'SHOW INDEX FROM ' . PMA_Util::backquote($db)
|
||||
. '.' . PMA_Util::backquote($T2) . ';'
|
||||
);
|
||||
// will be used to emphasis prim. keys in the table view
|
||||
$index_array2 = array();
|
||||
while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
|
||||
$index_array2[$row['Column_name']] = 1;
|
||||
}
|
||||
$GLOBALS['dbi']->freeResult($result);
|
||||
|
||||
if (! empty($index_array1[$F1]) && ! empty($index_array2[$F2])) {
|
||||
$upd_query = 'ALTER TABLE ' . PMA_Util::backquote($db)
|
||||
. '.' . PMA_Util::backquote($T2)
|
||||
. ' ADD FOREIGN KEY ('
|
||||
. PMA_Util::backquote($F2) . ')'
|
||||
. ' REFERENCES '
|
||||
. PMA_Util::backquote($db) . '.'
|
||||
. PMA_Util::backquote($T1) . '('
|
||||
. PMA_Util::backquote($F1) . ')';
|
||||
|
||||
if ($on_delete != 'nix') {
|
||||
$upd_query .= ' ON DELETE ' . $on_delete;
|
||||
}
|
||||
if ($on_update != 'nix') {
|
||||
$upd_query .= ' ON UPDATE ' . $on_update;
|
||||
}
|
||||
$upd_query .= ';';
|
||||
if ($GLOBALS['dbi']->tryQuery($upd_query)) {
|
||||
return array(true, __('FOREIGN KEY relation has been added.'));
|
||||
}
|
||||
return array(false, __('Error: Relation could not be added!'));
|
||||
}
|
||||
} else { // internal (pmadb) relation
|
||||
if ($GLOBALS['cfgRelation']['relwork'] == false) {
|
||||
return array(false, __('Error: Relational features are disabled!'));
|
||||
} else {
|
||||
// no need to recheck if the keys are primary or unique at this point,
|
||||
// this was checked on the interface part
|
||||
|
||||
$q = 'INSERT INTO '
|
||||
. PMA_Util::backquote($GLOBALS['cfgRelation']['db'])
|
||||
. '.' . PMA_Util::backquote($GLOBALS['cfgRelation']['relation'])
|
||||
. '(master_db, master_table, master_field,'
|
||||
. 'foreign_db, foreign_table, foreign_field)'
|
||||
. ' values('
|
||||
. '\'' . PMA_Util::sqlAddSlashes($db) . '\', '
|
||||
. '\'' . PMA_Util::sqlAddSlashes($T2) . '\', '
|
||||
. '\'' . PMA_Util::sqlAddSlashes($F2) . '\', '
|
||||
. '\'' . PMA_Util::sqlAddSlashes($db) . '\', '
|
||||
. '\'' . PMA_Util::sqlAddSlashes($T1) . '\','
|
||||
. '\'' . PMA_Util::sqlAddSlashes($F1) . '\')';
|
||||
|
||||
if (PMA_queryAsControlUser($q, false, PMA_DatabaseInterface::QUERY_STORE)) {
|
||||
return array(true, __('Internal relation has been added.'));
|
||||
} else {
|
||||
return array(false, __('Error: Relation could not be added!'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a foreign relation
|
||||
*
|
||||
* @param string $T1 foreign db.table
|
||||
* @param string $F1 foreign field
|
||||
* @param string $T2 master db.table
|
||||
* @param string $F2 master field
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function PMA_removeRelation($T1, $F1, $T2, $F2)
|
||||
{
|
||||
list($DB1, $T1) = explode(".", $T1);
|
||||
list($DB2, $T2) = explode(".", $T2);
|
||||
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($DB1, $T1);
|
||||
$type_T1 = strtoupper($tables[$T1]['ENGINE']);
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($DB2, $T2);
|
||||
$type_T2 = strtoupper($tables[$T2]['ENGINE']);
|
||||
|
||||
$try_to_delete_internal_relation = false;
|
||||
|
||||
if (PMA_Util::isForeignKeySupported($type_T1)
|
||||
&& PMA_Util::isForeignKeySupported($type_T2)
|
||||
&& $type_T1 == $type_T2
|
||||
) {
|
||||
// InnoDB
|
||||
$existrel_foreign = PMA_getForeigners($DB2, $T2, '', 'foreign');
|
||||
$foreigner = PMA_searchColumnInForeigners($existrel_foreign, $F2);
|
||||
|
||||
if (isset($foreigner['constraint'])) {
|
||||
$upd_query = 'ALTER TABLE ' . PMA_Util::backquote($DB2)
|
||||
. '.' . PMA_Util::backquote($T2) . ' DROP FOREIGN KEY '
|
||||
. PMA_Util::backquote($foreigner['constraint'])
|
||||
. ';';
|
||||
$upd_rs = $GLOBALS['dbi']->query($upd_query);
|
||||
} else {
|
||||
// there can be an internal relation even if InnoDB
|
||||
$try_to_delete_internal_relation = true;
|
||||
}
|
||||
} else {
|
||||
$try_to_delete_internal_relation = true;
|
||||
}
|
||||
if ($try_to_delete_internal_relation) {
|
||||
// internal relations
|
||||
PMA_queryAsControlUser(
|
||||
'DELETE FROM '
|
||||
. PMA_Util::backquote($GLOBALS['cfgRelation']['db']) . '.'
|
||||
. $GLOBALS['cfgRelation']['relation'] . ' WHERE '
|
||||
. 'master_db = \'' . PMA_Util::sqlAddSlashes($DB2) . '\''
|
||||
. ' AND master_table = \'' . PMA_Util::sqlAddSlashes($T2) . '\''
|
||||
. ' AND master_field = \'' . PMA_Util::sqlAddSlashes($F2) . '\''
|
||||
. ' AND foreign_db = \'' . PMA_Util::sqlAddSlashes($DB1) . '\''
|
||||
. ' AND foreign_table = \'' . PMA_Util::sqlAddSlashes($T1) . '\''
|
||||
. ' AND foreign_field = \'' . PMA_Util::sqlAddSlashes($F1) . '\'',
|
||||
false,
|
||||
PMA_DatabaseInterface::QUERY_STORE
|
||||
);
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@ -767,7 +767,7 @@ function PMA_sendHtmlForTableDropdownList()
|
||||
/**
|
||||
* Function to handle update for display field
|
||||
*
|
||||
* @param string $disp field name
|
||||
* @param string $disp current display field
|
||||
* @param string $display_field display field
|
||||
* @param string $db current database
|
||||
* @param string $table current table
|
||||
@ -789,7 +789,7 @@ function PMA_handleUpdateForDisplayField($disp, $display_field, $db, $table,
|
||||
/**
|
||||
* Function to get display query for handlingdisplay update
|
||||
*
|
||||
* @param string $disp field name
|
||||
* @param string $disp current display field
|
||||
* @param string $display_field display field
|
||||
* @param string $db current database
|
||||
* @param string $table current table
|
||||
|
||||
@ -1,63 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Handles the display field
|
||||
*
|
||||
* @package PhpMyAdmin-Designer
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
require_once './libraries/common.inc.php';
|
||||
|
||||
PMA_Response::getInstance()->disable();
|
||||
|
||||
require_once 'libraries/pmd_common.php';
|
||||
|
||||
$table = $_POST['T'];
|
||||
$display_field = $_POST['F'];
|
||||
|
||||
if ($cfgRelation['displaywork']) {
|
||||
|
||||
$disp = PMA_getDisplayField($db, $table);
|
||||
if ($disp) {
|
||||
if ($display_field != $disp) {
|
||||
$upd_query = 'UPDATE '
|
||||
. PMA_Util::backquote($GLOBALS['cfgRelation']['db'])
|
||||
. '.'
|
||||
. PMA_Util::backquote($cfgRelation['table_info'])
|
||||
. ' SET display_field = \''
|
||||
. PMA_Util::sqlAddSlashes($display_field) . '\''
|
||||
. ' WHERE db_name = \'' . PMA_Util::sqlAddSlashes($db) . '\''
|
||||
. ' AND table_name = \'' . PMA_Util::sqlAddSlashes($table) . '\'';
|
||||
} else {
|
||||
$upd_query = 'DELETE FROM '
|
||||
. PMA_Util::backquote($GLOBALS['cfgRelation']['db'])
|
||||
. '.'
|
||||
. PMA_Util::backquote($cfgRelation['table_info'])
|
||||
. ' WHERE db_name = \'' . PMA_Util::sqlAddSlashes($db) . '\''
|
||||
. ' AND table_name = \'' . PMA_Util::sqlAddSlashes($table) . '\'';
|
||||
}
|
||||
} elseif ($display_field != '') {
|
||||
$upd_query = 'INSERT INTO '
|
||||
. PMA_Util::backquote($GLOBALS['cfgRelation']['db'])
|
||||
. '.'
|
||||
. PMA_Util::backquote($cfgRelation['table_info'])
|
||||
. '(db_name, table_name, display_field) '
|
||||
. ' VALUES('
|
||||
. '\'' . PMA_Util::sqlAddSlashes($db) . '\','
|
||||
. '\'' . PMA_Util::sqlAddSlashes($table) . '\','
|
||||
. '\'' . PMA_Util::sqlAddSlashes($display_field) . '\')';
|
||||
}
|
||||
|
||||
if (isset($upd_query)) {
|
||||
$upd_rs = PMA_queryAsControlUser($upd_query);
|
||||
}
|
||||
} // end if
|
||||
|
||||
header("Content-Type: text/xml; charset=utf-8");
|
||||
header("Cache-Control: no-cache");
|
||||
die("<root act='save_pos' return='"
|
||||
. __('Modifications have been saved') . "'></root>");
|
||||
?>
|
||||
@ -1,134 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* PMD handler for creating new relation
|
||||
*
|
||||
* @package PhpMyAdmin-Designer
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
require_once './libraries/common.inc.php';
|
||||
|
||||
PMA_Response::getInstance()->disable();
|
||||
|
||||
require_once 'libraries/pmd_common.php';
|
||||
$die_save_pos = 0;
|
||||
require_once 'pmd_save_pos.php';
|
||||
extract($_POST, EXTR_SKIP);
|
||||
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($db, $T1);
|
||||
$type_T1 = strtoupper($tables[$T1]['ENGINE']);
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($db, $T2);
|
||||
$type_T2 = strtoupper($tables[$T2]['ENGINE']);
|
||||
|
||||
// native foreign key
|
||||
if (PMA_Util::isForeignKeySupported($type_T1)
|
||||
&& PMA_Util::isForeignKeySupported($type_T2)
|
||||
&& $type_T1 == $type_T2
|
||||
) {
|
||||
// relation exists?
|
||||
$existrel_foreign = PMA_getForeigners($db, $T2, '', 'foreign');
|
||||
$foreigner = PMA_searchColumnInForeigners($existrel_foreign, $F2);
|
||||
if ($foreigner
|
||||
&& isset($foreigner['constraint'])
|
||||
) {
|
||||
PMD_Return_new(0, __('Error: relation already exists.'));
|
||||
}
|
||||
// note: in InnoDB, the index does not requires to be on a PRIMARY
|
||||
// or UNIQUE key
|
||||
// improve: check all other requirements for InnoDB relations
|
||||
$result = $GLOBALS['dbi']->query(
|
||||
'SHOW INDEX FROM ' . PMA_Util::backquote($db)
|
||||
. '.' . PMA_Util::backquote($T1) . ';'
|
||||
);
|
||||
$index_array1 = array(); // will be use to emphasis prim. keys in the table view
|
||||
while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
|
||||
$index_array1[$row['Column_name']] = 1;
|
||||
}
|
||||
$GLOBALS['dbi']->freeResult($result);
|
||||
|
||||
$result = $GLOBALS['dbi']->query(
|
||||
'SHOW INDEX FROM ' . PMA_Util::backquote($db)
|
||||
. '.' . PMA_Util::backquote($T2) . ';'
|
||||
);
|
||||
// will be used to emphasis prim. keys in the table view
|
||||
$index_array2 = array();
|
||||
while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
|
||||
$index_array2[$row['Column_name']] = 1;
|
||||
}
|
||||
$GLOBALS['dbi']->freeResult($result);
|
||||
|
||||
if (! empty($index_array1[$F1]) && ! empty($index_array2[$F2])) {
|
||||
$upd_query = 'ALTER TABLE ' . PMA_Util::backquote($db)
|
||||
. '.' . PMA_Util::backquote($T2)
|
||||
. ' ADD FOREIGN KEY ('
|
||||
. PMA_Util::backquote($F2) . ')'
|
||||
. ' REFERENCES '
|
||||
. PMA_Util::backquote($db) . '.'
|
||||
. PMA_Util::backquote($T1) . '('
|
||||
. PMA_Util::backquote($F1) . ')';
|
||||
|
||||
if ($on_delete != 'nix') {
|
||||
$upd_query .= ' ON DELETE ' . $on_delete;
|
||||
}
|
||||
if ($on_update != 'nix') {
|
||||
$upd_query .= ' ON UPDATE ' . $on_update;
|
||||
}
|
||||
$upd_query .= ';';
|
||||
$GLOBALS['dbi']->tryQuery($upd_query)
|
||||
|| PMD_Return_new(0, __('Error: Relation could not be added!'));
|
||||
PMD_Return_new(1, __('FOREIGN KEY relation has been added.'));
|
||||
}
|
||||
} else { // internal (pmadb) relation
|
||||
if ($GLOBALS['cfgRelation']['relwork'] == false) {
|
||||
PMD_Return_new(0, __('Error: Relational features are disabled!'));
|
||||
} else {
|
||||
// no need to recheck if the keys are primary or unique at this point,
|
||||
// this was checked on the interface part
|
||||
|
||||
$q = '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($T2) . '\', '
|
||||
. '\'' . PMA_Util::sqlAddSlashes($F2) . '\', '
|
||||
. '\'' . PMA_Util::sqlAddSlashes($db) . '\', '
|
||||
. '\'' . PMA_Util::sqlAddSlashes($T1) . '\','
|
||||
. '\'' . PMA_Util::sqlAddSlashes($F1) . '\')';
|
||||
|
||||
if (PMA_queryAsControlUser($q, false, PMA_DatabaseInterface::QUERY_STORE)) {
|
||||
PMD_Return_new(1, __('Internal relation has been added.'));
|
||||
} else {
|
||||
PMD_Return_new(0, __('Error: Relation could not be added!'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send xml
|
||||
*
|
||||
* @param string $b Value of attribute "b"
|
||||
* @param string $ret Value of attribute "return"
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function PMD_Return_new($b,$ret)
|
||||
{
|
||||
global $db,$T1,$F1,$T2,$F2;
|
||||
header("Content-Type: text/xml; charset=utf-8");
|
||||
header("Cache-Control: no-cache");
|
||||
die('<root act="relation_new" return="' . $ret . '" b="' . $b .
|
||||
'" DB1="' . urlencode($db) .
|
||||
'" T1="' . urlencode($T1) .
|
||||
'" F1="' . urlencode($F1) .
|
||||
'" DB2="' . urlencode($db) .
|
||||
'" T2="' . urlencode($T2) .
|
||||
'" F2="' . urlencode($F2) .
|
||||
'"></root>');
|
||||
}
|
||||
?>
|
||||
@ -1,70 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* PMD relation update handler
|
||||
*
|
||||
* @package PhpMyAdmin-Designer
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
require_once './libraries/common.inc.php';
|
||||
|
||||
PMA_Response::getInstance()->disable();
|
||||
|
||||
require_once 'libraries/pmd_common.php';
|
||||
extract($_POST, EXTR_SKIP);
|
||||
extract($_GET, EXTR_SKIP);
|
||||
$die_save_pos = 0;
|
||||
require_once 'pmd_save_pos.php';
|
||||
list($DB1, $T1) = explode(".", $T1);
|
||||
list($DB2, $T2) = explode(".", $T2);
|
||||
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($db, $T1);
|
||||
$type_T1 = strtoupper($tables[$T1]['ENGINE']);
|
||||
$tables = $GLOBALS['dbi']->getTablesFull($db, $T2);
|
||||
$type_T2 = strtoupper($tables[$T2]['ENGINE']);
|
||||
|
||||
$try_to_delete_internal_relation = false;
|
||||
|
||||
if (PMA_Util::isForeignKeySupported($type_T1)
|
||||
&& PMA_Util::isForeignKeySupported($type_T2)
|
||||
&& $type_T1 == $type_T2
|
||||
) {
|
||||
// InnoDB
|
||||
$existrel_foreign = PMA_getForeigners($DB2, $T2, '', 'foreign');
|
||||
$foreigner = PMA_searchColumnInForeigners($existrel_foreign, $F2);
|
||||
|
||||
if (isset($foreigner['constraint'])) {
|
||||
$upd_query = 'ALTER TABLE ' . PMA_Util::backquote($DB2)
|
||||
. '.' . PMA_Util::backquote($T2) . ' DROP FOREIGN KEY '
|
||||
. PMA_Util::backquote($foreigner['constraint'])
|
||||
. ';';
|
||||
$upd_rs = $GLOBALS['dbi']->query($upd_query);
|
||||
} else {
|
||||
// there can be an internal relation even if InnoDB
|
||||
$try_to_delete_internal_relation = true;
|
||||
}
|
||||
} else {
|
||||
$try_to_delete_internal_relation = true;
|
||||
}
|
||||
if ($try_to_delete_internal_relation) {
|
||||
// internal relations
|
||||
PMA_queryAsControlUser(
|
||||
'DELETE FROM '
|
||||
. PMA_Util::backquote($GLOBALS['cfgRelation']['db']) . '.'
|
||||
. $cfg['Server']['relation'] . ' WHERE '
|
||||
. 'master_db = \'' . PMA_Util::sqlAddSlashes($DB2) . '\''
|
||||
. ' AND master_table = \'' . PMA_Util::sqlAddSlashes($T2) . '\''
|
||||
. ' AND master_field = \'' . PMA_Util::sqlAddSlashes($F2) . '\''
|
||||
. ' AND foreign_db = \'' . PMA_Util::sqlAddSlashes($DB1) . '\''
|
||||
. ' AND foreign_table = \'' . PMA_Util::sqlAddSlashes($T1) . '\''
|
||||
. ' AND foreign_field = \'' . PMA_Util::sqlAddSlashes($F1) . '\'',
|
||||
false,
|
||||
PMA_DatabaseInterface::QUERY_STORE
|
||||
);
|
||||
}
|
||||
PMA_returnUpd(1, __('Relation deleted'));
|
||||
|
||||
?>
|
||||
@ -1,63 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Save handler for PMD
|
||||
*
|
||||
* @package PhpMyAdmin-Designer
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
require_once './libraries/common.inc.php';
|
||||
require_once 'libraries/pmd_common.php';
|
||||
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
|
||||
if (! $cfgRelation['pdfwork']) {
|
||||
PMD_errorSave();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets globals from $_POST
|
||||
*/
|
||||
$post_params = array(
|
||||
'die_save_pos',
|
||||
);
|
||||
|
||||
foreach ($post_params as $one_post_param) {
|
||||
if (isset($_POST[$one_post_param])) {
|
||||
$GLOBALS[$one_post_param] = $_POST[$one_post_param];
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_REQUEST['selected_page'])) {
|
||||
PMA_saveTablePositions($_REQUEST['selected_page']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Error handler
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function PMD_errorSave()
|
||||
{
|
||||
global $die_save_pos; // if this file included
|
||||
if (! empty($die_save_pos)) {
|
||||
header("Content-Type: text/xml; charset=utf-8");
|
||||
header("Cache-Control: no-cache");
|
||||
die(
|
||||
'<root act="save_pos" return="'
|
||||
. __('Error saving coordinates for Designer.')
|
||||
. '"></root>'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($die_save_pos)) {
|
||||
header("Content-Type: text/xml; charset=utf-8");
|
||||
header("Cache-Control: no-cache");
|
||||
echo '<root act="save_pos" return="'
|
||||
. __('Modifications have been saved') . '"></root>';
|
||||
}
|
||||
?>
|
||||
@ -1,13 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* Tests for libraries/designer.lib.php
|
||||
* Tests for libraries/db_designer.lib.php
|
||||
*
|
||||
* @package PhpMyAdmin-test
|
||||
*/
|
||||
/*
|
||||
* Include to test.
|
||||
*/
|
||||
require_once 'libraries/designer.lib.php';
|
||||
require_once 'libraries/db_designer.lib.php';
|
||||
|
||||
require_once 'libraries/database_interface.inc.php';
|
||||
require_once 'libraries/Util.class.php';
|
||||
@ -16,7 +16,7 @@ require_once 'libraries/url_generating.lib.php';
|
||||
require_once 'libraries/relation.lib.php';
|
||||
|
||||
/**
|
||||
* Tests for libraries/designer.lib.php
|
||||
* Tests for libraries/db_designer.lib.php
|
||||
*
|
||||
* @package PhpMyAdmin-test
|
||||
*/
|
||||
@ -151,7 +151,7 @@ class PMA_DesginerTest extends PHPUnit_Framework_TestCase
|
||||
|
||||
$result = PMA_getHtmlForPageSaveAs($db);
|
||||
$this->assertContains(
|
||||
'<input type="hidden" name="operation" value="save" />',
|
||||
'<input type="hidden" name="operation" value="savePage" />',
|
||||
$result
|
||||
);
|
||||
$this->assertContains(
|
||||
|
||||
Loading…
Reference in New Issue
Block a user