Set namespace on DbQbe. Set namespace to 'DbSearch'. Split Advisor.class.php file. Change Advisor namespace. Rename DbQbe class and file. Set namespace on DisplayResults. Set namespace on Error. Use namespace for ErrorHandler. Add class autoloader. Change ErrorHandler filename. Remove some require. Update Config namespace path. Update PMA_Util to PMA\libraries\Util. Rename Font and File classes files. Use namespace for Footer. Set namespace in all libraries classes. Namespace OutputBuffering. Export SubPartition. Rename Partition file. Namespace PDF. Namespace RecentFavoriteTable. Replace PMA_Response by Response and PMA_Message by Message. Update uses and calls. Fix unit tests. Fix SqlParser autoload. Signed-off-by: Hugues Peccatte <hugues.peccatte@gmail.com>
532 lines
18 KiB
PHP
532 lines
18 KiB
PHP
<?php
|
|
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
|
/**
|
|
* functions for multi submit forms
|
|
*
|
|
* @usedby mult_submits.inc.php
|
|
*
|
|
* @package PhpMyAdmin
|
|
*/
|
|
if (! defined('PHPMYADMIN')) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Gets url params
|
|
*
|
|
* @param string $what mult submit type
|
|
* @param bool $reload is reload
|
|
* @param string $action action type
|
|
* @param string $db database name
|
|
* @param string $table table name
|
|
* @param array $selected selected rows(table,db)
|
|
* @param array $views table views
|
|
* @param string $original_sql_query original sql query
|
|
* @param string $original_url_query original url query
|
|
*
|
|
* @return array
|
|
*/
|
|
function PMA_getUrlParams(
|
|
$what, $reload, $action, $db, $table, $selected, $views,
|
|
$original_sql_query, $original_url_query
|
|
) {
|
|
$_url_params = array(
|
|
'query_type' => $what,
|
|
'reload' => (! empty($reload) ? 1 : 0),
|
|
);
|
|
if (/*overload*/mb_strpos(' ' . $action, 'db_') == 1) {
|
|
$_url_params['db']= $db;
|
|
} elseif (/*overload*/mb_strpos(' ' . $action, 'tbl_') == 1
|
|
|| $what == 'row_delete'
|
|
) {
|
|
$_url_params['db']= $db;
|
|
$_url_params['table']= $table;
|
|
}
|
|
foreach ($selected as $sval) {
|
|
if ($what == 'row_delete') {
|
|
$_url_params['selected'][] = 'DELETE FROM '
|
|
. PMA\libraries\Util::backquote($table)
|
|
. ' WHERE ' . urldecode($sval) . ' LIMIT 1;';
|
|
} else {
|
|
$_url_params['selected'][] = $sval;
|
|
}
|
|
}
|
|
if ($what == 'drop_tbl' && !empty($views)) {
|
|
foreach ($views as $current) {
|
|
$_url_params['views'][] = $current;
|
|
}
|
|
}
|
|
if ($what == 'row_delete') {
|
|
$_url_params['original_sql_query'] = $original_sql_query;
|
|
if (! empty($original_url_query)) {
|
|
$_url_params['original_url_query'] = $original_url_query;
|
|
}
|
|
}
|
|
|
|
return $_url_params;
|
|
}
|
|
|
|
/**
|
|
* Gets query results from
|
|
*
|
|
* @param string $query_type query type
|
|
* @param array $selected selected tables
|
|
* @param string $db db name
|
|
* @param string $table table name
|
|
* @param array $views table views
|
|
* @param string $primary table primary
|
|
* @param string $from_prefix from prefix original
|
|
* @param string $to_prefix to prefix original
|
|
*
|
|
* @return array
|
|
*/
|
|
function PMA_getQueryStrFromSelected(
|
|
$query_type, $selected, $db, $table, $views, $primary,
|
|
$from_prefix, $to_prefix
|
|
) {
|
|
$rebuild_database_list = false;
|
|
$reload = null;
|
|
$a_query = null;
|
|
$sql_query = '';
|
|
$sql_query_views = null;
|
|
// whether to run query after each pass
|
|
$run_parts = false;
|
|
// whether to execute the query at the end (to display results)
|
|
$use_sql = false;
|
|
$result = null;
|
|
|
|
if ($query_type == 'drop_tbl') {
|
|
$sql_query_views = '';
|
|
}
|
|
|
|
$selected_cnt = count($selected);
|
|
$deletes = false;
|
|
|
|
for ($i = 0; $i < $selected_cnt; $i++) {
|
|
switch ($query_type) {
|
|
case 'row_delete':
|
|
$deletes = true;
|
|
$a_query = $selected[$i];
|
|
$run_parts = true;
|
|
break;
|
|
|
|
case 'drop_db':
|
|
PMA_relationsCleanupDatabase($selected[$i]);
|
|
$a_query = 'DROP DATABASE '
|
|
. PMA\libraries\Util::backquote($selected[$i]);
|
|
$reload = 1;
|
|
$run_parts = true;
|
|
$rebuild_database_list = true;
|
|
break;
|
|
|
|
case 'drop_tbl':
|
|
PMA_relationsCleanupTable($db, $selected[$i]);
|
|
$current = $selected[$i];
|
|
if (!empty($views) && in_array($current, $views)) {
|
|
$sql_query_views .= (empty($sql_query_views) ? 'DROP VIEW ' : ', ')
|
|
. PMA\libraries\Util::backquote($current);
|
|
} else {
|
|
$sql_query .= (empty($sql_query) ? 'DROP TABLE ' : ', ')
|
|
. PMA\libraries\Util::backquote($current);
|
|
}
|
|
$reload = 1;
|
|
break;
|
|
|
|
case 'check_tbl':
|
|
$sql_query .= (empty($sql_query) ? 'CHECK TABLE ' : ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i]);
|
|
$use_sql = true;
|
|
break;
|
|
|
|
case 'optimize_tbl':
|
|
$sql_query .= (empty($sql_query) ? 'OPTIMIZE TABLE ' : ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i]);
|
|
$use_sql = true;
|
|
break;
|
|
|
|
case 'analyze_tbl':
|
|
$sql_query .= (empty($sql_query) ? 'ANALYZE TABLE ' : ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i]);
|
|
$use_sql = true;
|
|
break;
|
|
|
|
case 'checksum_tbl':
|
|
$sql_query .= (empty($sql_query) ? 'CHECKSUM TABLE ' : ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i]);
|
|
$use_sql = true;
|
|
break;
|
|
|
|
case 'repair_tbl':
|
|
$sql_query .= (empty($sql_query) ? 'REPAIR TABLE ' : ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i]);
|
|
$use_sql = true;
|
|
break;
|
|
|
|
case 'empty_tbl':
|
|
$deletes = true;
|
|
$a_query = 'TRUNCATE ';
|
|
$a_query .= PMA\libraries\Util::backquote($selected[$i]);
|
|
$run_parts = true;
|
|
break;
|
|
|
|
case 'drop_fld':
|
|
PMA_relationsCleanupColumn($db, $table, $selected[$i]);
|
|
$sql_query .= (empty($sql_query)
|
|
? 'ALTER TABLE ' . PMA\libraries\Util::backquote($table)
|
|
: ',')
|
|
. ' DROP ' . PMA\libraries\Util::backquote($selected[$i])
|
|
. (($i == $selected_cnt-1) ? ';' : '');
|
|
break;
|
|
|
|
case 'primary_fld':
|
|
$sql_query .= (empty($sql_query)
|
|
? 'ALTER TABLE ' . PMA\libraries\Util::backquote($table) . (empty($primary)
|
|
? ''
|
|
: ' DROP PRIMARY KEY,') . ' ADD PRIMARY KEY( '
|
|
: ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i])
|
|
. (($i == $selected_cnt-1) ? ');' : '');
|
|
break;
|
|
|
|
case 'index_fld':
|
|
$sql_query .= (empty($sql_query)
|
|
? 'ALTER TABLE ' . PMA\libraries\Util::backquote($table) . ' ADD INDEX( '
|
|
: ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i])
|
|
. (($i == $selected_cnt-1) ? ');' : '');
|
|
break;
|
|
|
|
case 'unique_fld':
|
|
$sql_query .= (empty($sql_query)
|
|
? 'ALTER TABLE ' . PMA\libraries\Util::backquote($table) . ' ADD UNIQUE( '
|
|
: ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i])
|
|
. (($i == $selected_cnt-1) ? ');' : '');
|
|
break;
|
|
|
|
case 'spatial_fld':
|
|
$sql_query .= (empty($sql_query)
|
|
? 'ALTER TABLE ' . PMA\libraries\Util::backquote($table) . ' ADD SPATIAL( '
|
|
: ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i])
|
|
. (($i == $selected_cnt-1) ? ');' : '');
|
|
break;
|
|
|
|
case 'fulltext_fld':
|
|
$sql_query .= (empty($sql_query)
|
|
? 'ALTER TABLE ' . PMA\libraries\Util::backquote($table) . ' ADD FULLTEXT( '
|
|
: ', ')
|
|
. PMA\libraries\Util::backquote($selected[$i])
|
|
. (($i == $selected_cnt-1) ? ');' : '');
|
|
break;
|
|
|
|
case 'add_prefix_tbl':
|
|
$newtablename = $_POST['add_prefix'] . $selected[$i];
|
|
// ADD PREFIX TO TABLE NAME
|
|
$a_query = 'ALTER TABLE '
|
|
. PMA\libraries\Util::backquote($selected[$i])
|
|
. ' RENAME '
|
|
. PMA\libraries\Util::backquote($newtablename);
|
|
$run_parts = true;
|
|
break;
|
|
|
|
case 'replace_prefix_tbl':
|
|
$current = $selected[$i];
|
|
$subFromPrefix = /*overload*/mb_substr(
|
|
$current,
|
|
0,
|
|
/*overload*/mb_strlen($from_prefix)
|
|
);
|
|
if ($subFromPrefix == $from_prefix) {
|
|
$newtablename = $to_prefix
|
|
. /*overload*/mb_substr(
|
|
$current,
|
|
/*overload*/mb_strlen($from_prefix)
|
|
);
|
|
} else {
|
|
$newtablename = $current;
|
|
}
|
|
// CHANGE PREFIX PATTERN
|
|
$a_query = 'ALTER TABLE '
|
|
. PMA\libraries\Util::backquote($selected[$i])
|
|
. ' RENAME '
|
|
. PMA\libraries\Util::backquote($newtablename);
|
|
$run_parts = true;
|
|
break;
|
|
|
|
case 'copy_tbl_change_prefix':
|
|
$current = $selected[$i];
|
|
$newtablename = $to_prefix .
|
|
/*overload*/mb_substr($current, /*overload*/mb_strlen($from_prefix));
|
|
// COPY TABLE AND CHANGE PREFIX PATTERN
|
|
$a_query = 'CREATE TABLE '
|
|
. PMA\libraries\Util::backquote($newtablename)
|
|
. ' SELECT * FROM '
|
|
. PMA\libraries\Util::backquote($selected[$i]);
|
|
$run_parts = true;
|
|
break;
|
|
|
|
} // end switch
|
|
|
|
// All "DROP TABLE", "DROP FIELD", "OPTIMIZE TABLE" and "REPAIR TABLE"
|
|
// statements will be run at once below
|
|
if ($run_parts) {
|
|
$sql_query .= $a_query . ';' . "\n";
|
|
if ($query_type != 'drop_db') {
|
|
$GLOBALS['dbi']->selectDb($db);
|
|
}
|
|
$result = $GLOBALS['dbi']->query($a_query);
|
|
|
|
if ($query_type == 'drop_db') {
|
|
PMA_clearTransformations($selected[$i]);
|
|
} elseif ($query_type == 'drop_tbl') {
|
|
PMA_clearTransformations($db, $selected[$i]);
|
|
} else if ($query_type == 'drop_fld') {
|
|
PMA_clearTransformations($db, $table, $selected[$i]);
|
|
}
|
|
} // end if
|
|
} // end for
|
|
|
|
if ($deletes && ! empty($_REQUEST['pos'])) {
|
|
$_REQUEST['pos'] = PMA_calculatePosForLastPage(
|
|
$db, $table, isset($_REQUEST['pos']) ? $_REQUEST['pos'] : null
|
|
);
|
|
}
|
|
|
|
return array(
|
|
$result, $rebuild_database_list, $reload,
|
|
$run_parts, $use_sql, $sql_query, $sql_query_views
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Gets HTML for replace_prefix_tbl or copy_tbl_change_prefix
|
|
*
|
|
* @param string $what mult_submit type
|
|
* @param string $action action type
|
|
* @param array $_url_params URL params
|
|
*
|
|
* @return string
|
|
*/
|
|
function PMA_getHtmlForReplacePrefixTable($what, $action, $_url_params)
|
|
{
|
|
$html = '<form action="' . $action . '" method="post">';
|
|
$html .= PMA_URL_getHiddenInputs($_url_params);
|
|
$html .= '<fieldset class = "input">';
|
|
$html .= '<legend>';
|
|
if ($what == 'replace_prefix_tbl') {
|
|
$html .= __('Replace table prefix:');
|
|
} else {
|
|
$html .= __('Copy table with prefix:');
|
|
}
|
|
$html .= '</legend>';
|
|
$html .= '<table>';
|
|
$html .= '<tr>';
|
|
$html .= '<td>' . __('From') . '</td>';
|
|
$html .= '<td>';
|
|
$html .= '<input type="text" name="from_prefix" id="initialPrefix" />';
|
|
$html .= '</td>';
|
|
$html .= '</tr>';
|
|
$html .= '<tr>';
|
|
$html .= '<td>' . __('To') . '</td>';
|
|
$html .= '<td>';
|
|
$html .= '<input type="text" name="to_prefix" id="newPrefix" />';
|
|
$html .= '</td>';
|
|
$html .= '</tr>';
|
|
$html .= '</table>';
|
|
$html .= '</fieldset>';
|
|
$html .= '<fieldset class="tblFooters">';
|
|
$html .= '<input type="hidden" name="mult_btn" value="' . __('Yes') . '" />';
|
|
$html .= '<input type="submit" value="' . __('Submit') . '" id="buttonYes" />';
|
|
$html .= '</fieldset>';
|
|
$html .= '</form>';
|
|
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* Gets HTML for add_prefix_tbl
|
|
*
|
|
* @param string $action action type
|
|
* @param array $_url_params URL params
|
|
*
|
|
* @return string
|
|
*/
|
|
function PMA_getHtmlForAddPrefixTable($action, $_url_params)
|
|
{
|
|
$html = '<form action="' . $action . '" method="post">';
|
|
$html .= PMA_URL_getHiddenInputs($_url_params);
|
|
$html .= '<fieldset class = "input">';
|
|
$html .= '<legend>' . __('Add table prefix:') . '</legend>';
|
|
$html .= '<table>';
|
|
$html .= '<tr>';
|
|
$html .= '<td>' . __('Add prefix') . '</td>';
|
|
$html .= '<td>';
|
|
$html .= '<input type="text" name="add_prefix" id="txtPrefix" />';
|
|
$html .= '</td>';
|
|
$html .= '</tr>';
|
|
$html .= '<tr>';
|
|
$html .= '</table>';
|
|
$html .= '</fieldset>';
|
|
$html .= '<fieldset class="tblFooters">';
|
|
$html .= '<input type="hidden" name="mult_btn" value="' . __('Yes') . '" />';
|
|
$html .= '<input type="submit" value="' . __('Submit') . '" id="buttonYes" />';
|
|
$html .= '</fieldset>';
|
|
$html .= '</form>';
|
|
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* Gets HTML for other mult_submits actions
|
|
*
|
|
* @param string $what mult_submit type
|
|
* @param string $action action type
|
|
* @param array $_url_params URL params
|
|
* @param string $full_query full sql query string
|
|
*
|
|
* @return string
|
|
*/
|
|
function PMA_getHtmlForOtherActions($what, $action, $_url_params, $full_query)
|
|
{
|
|
$html = '<form action="' . $action . '" method="post">';
|
|
$html .= PMA_URL_getHiddenInputs($_url_params);
|
|
$html .= '<fieldset class="confirmation">';
|
|
$html .= '<legend>';
|
|
if ($what == 'drop_db') {
|
|
$html .= __('You are about to DESTROY a complete database!') . ' ';
|
|
}
|
|
$html .= __('Do you really want to execute the following query?');
|
|
$html .= '<input type="submit" name="mult_btn" value="'
|
|
. __('Yes') . '" />';
|
|
$html .= '<input type="submit" name="mult_btn" value="'
|
|
. __('No') . '" />';
|
|
$html .= '</legend>';
|
|
$html .= '<code>' . $full_query . '</code>';
|
|
$html .= '</fieldset>';
|
|
$html .= '<fieldset class="tblFooters">';
|
|
// Display option to disable foreign key checks while dropping tables
|
|
if ($what === 'drop_tbl' || $what === 'empty_tbl' || $what === 'row_delete') {
|
|
$html .= '<div id="foreignkeychk">';
|
|
$html .= PMA\libraries\Util::getFKCheckbox();
|
|
$html .= '</div>';
|
|
}
|
|
$html .= '<input id="buttonYes" type="submit" name="mult_btn" value="'
|
|
. __('Yes') . '" />';
|
|
$html .= '<input id="buttonNo" type="submit" name="mult_btn" value="'
|
|
. __('No') . '" />';
|
|
$html .= '</fieldset>';
|
|
$html .= '</form>';
|
|
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* Get query string from Selected
|
|
*
|
|
* @param string $what mult_submit type
|
|
* @param string $table table name
|
|
* @param array $selected the selected columns
|
|
* @param array $views table views
|
|
*
|
|
* @return array
|
|
*/
|
|
function PMA_getQueryFromSelected($what, $table, $selected, $views)
|
|
{
|
|
$reload = false;
|
|
$full_query_views = null;
|
|
$full_query = '';
|
|
|
|
if ($what == 'drop_tbl') {
|
|
$full_query_views = '';
|
|
}
|
|
|
|
$selected_cnt = count($selected);
|
|
$i = 0;
|
|
foreach ($selected as $sval) {
|
|
switch ($what) {
|
|
case 'row_delete':
|
|
$full_query .= 'DELETE FROM '
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($table))
|
|
// Do not append a "LIMIT 1" clause here
|
|
// (it's not binlog friendly).
|
|
// We don't need the clause because the calling panel permits
|
|
// this feature only when there is a unique index.
|
|
. ' WHERE ' . urldecode(htmlspecialchars($sval))
|
|
. ';<br />';
|
|
break;
|
|
case 'drop_db':
|
|
$full_query .= 'DROP DATABASE '
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($sval))
|
|
. ';<br />';
|
|
$reload = true;
|
|
break;
|
|
|
|
case 'drop_tbl':
|
|
$current = $sval;
|
|
if (!empty($views) && in_array($current, $views)) {
|
|
$full_query_views .= (empty($full_query_views) ? 'DROP VIEW ' : ', ')
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($current));
|
|
} else {
|
|
$full_query .= (empty($full_query) ? 'DROP TABLE ' : ', ')
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($current));
|
|
}
|
|
break;
|
|
|
|
case 'empty_tbl':
|
|
$full_query .= 'TRUNCATE ';
|
|
$full_query .= PMA\libraries\Util::backquote(htmlspecialchars($sval))
|
|
. ';<br />';
|
|
break;
|
|
|
|
case 'primary_fld':
|
|
if ($full_query == '') {
|
|
$full_query .= 'ALTER TABLE '
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($table))
|
|
. '<br /> DROP PRIMARY KEY,'
|
|
. '<br /> ADD PRIMARY KEY('
|
|
. '<br /> '
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($sval))
|
|
. ',';
|
|
} else {
|
|
$full_query .= '<br /> '
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($sval))
|
|
. ',';
|
|
}
|
|
if ($i == $selected_cnt-1) {
|
|
$full_query = preg_replace('@,$@', ');<br />', $full_query);
|
|
}
|
|
break;
|
|
|
|
case 'drop_fld':
|
|
if ($full_query == '') {
|
|
$full_query .= 'ALTER TABLE '
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($table));
|
|
}
|
|
$full_query .= '<br /> DROP '
|
|
. PMA\libraries\Util::backquote(htmlspecialchars($sval))
|
|
. ',';
|
|
if ($i == $selected_cnt - 1) {
|
|
$full_query = preg_replace('@,$@', ';<br />', $full_query);
|
|
}
|
|
break;
|
|
} // end switch
|
|
$i++;
|
|
}
|
|
|
|
if ($what == 'drop_tbl') {
|
|
if (!empty($full_query)) {
|
|
$full_query .= ';<br />' . "\n";
|
|
}
|
|
if (!empty($full_query_views)) {
|
|
$full_query .= $full_query_views . ';<br />' . "\n";
|
|
}
|
|
unset($full_query_views);
|
|
}
|
|
|
|
$full_query_views = isset($full_query_views)? $full_query_views : null;
|
|
|
|
return array($full_query, $reload, $full_query_views);
|
|
}
|
|
|