From 0d11ecc728fcd5d841b496d85b6aa23414d59e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Sun, 20 Aug 2017 21:28:36 -0300 Subject: [PATCH] Refactor operations functions to static methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MaurĂ­cio Meneghini Fauth --- db_operations.php | 63 +- libraries/classes/Operations.php | 2131 +++++++++++++++++ libraries/classes/Sql.php | 7 +- libraries/mult_submits.lib.php | 79 +- libraries/operations.lib.php | 2121 ---------------- tbl_operations.php | 63 +- .../OperationsTest.php} | 60 +- view_operations.php | 20 +- 8 files changed, 2277 insertions(+), 2267 deletions(-) create mode 100644 libraries/classes/Operations.php delete mode 100644 libraries/operations.lib.php rename test/{libraries/PMA_operations_test.php => classes/OperationsTest.php} (76%) diff --git a/db_operations.php b/db_operations.php index a7ce9745b7..503a0ae5c0 100644 --- a/db_operations.php +++ b/db_operations.php @@ -11,8 +11,12 @@ * * @package PhpMyAdmin */ -use PhpMyAdmin\Response; +use PhpMyAdmin\DatabaseInterface; +use PhpMyAdmin\Message; use PhpMyAdmin\Plugins\Export\ExportSql; +use PhpMyAdmin\Operations; +use PhpMyAdmin\Response; +use PhpMyAdmin\Util; /** * requirements @@ -24,7 +28,6 @@ require_once 'libraries/display_create_table.lib.php'; * functions implementation for this script */ require_once 'libraries/check_user_privileges.lib.php'; -require_once 'libraries/operations.lib.php'; // add a javascript file for jQuery functions to handle Ajax actions $response = Response::getInstance(); @@ -47,15 +50,15 @@ if (strlen($GLOBALS['db']) > 0 } if (! isset($_REQUEST['newname']) || strlen($_REQUEST['newname']) === 0) { - $message = PhpMyAdmin\Message::error(__('The database name is empty!')); + $message = Message::error(__('The database name is empty!')); } else if($_REQUEST['newname'] === $_REQUEST['db']) { - $message = PhpMyAdmin\Message::error( + $message = Message::error( __('Cannot copy database to the same name. Change the name and try again.') ); } else { $_error = false; if ($move || ! empty($_REQUEST['create_database_before_copying'])) { - PMA_createDbBeforeCopy(); + Operations::createDbBeforeCopy(); } // here I don't use DELIMITER because it's not part of the @@ -64,7 +67,7 @@ if (strlen($GLOBALS['db']) > 0 // to avoid selecting alternatively the current and new db // we would need to modify the CREATE definitions to qualify // the db name - PMA_runProcedureAndFunctionDefinitions($GLOBALS['db']); + Operations::runProcedureAndFunctionDefinitions($GLOBALS['db']); // go back to current db, just in case $GLOBALS['dbi']->selectDb($GLOBALS['db']); @@ -85,24 +88,24 @@ if (strlen($GLOBALS['db']) > 0 ); // create stand-in tables for views - $views = PMA_getViewsAndCreateSqlViewStandIn( + $views = Operations::getViewsAndCreateSqlViewStandIn( $tables_full, $export_sql_plugin, $GLOBALS['db'] ); // copy tables - $sqlConstratints = PMA_copyTables( + $sqlConstratints = Operations::copyTables( $tables_full, $move, $GLOBALS['db'] ); // handle the views if (! $_error) { - PMA_handleTheViews($views, $move, $GLOBALS['db']); + Operations::handleTheViews($views, $move, $GLOBALS['db']); } unset($views); // now that all tables exist, create all the accumulated constraints if (! $_error && count($sqlConstratints) > 0) { - PMA_createAllAccumulatedConstraints($sqlConstratints); + Operations::createAllAccumulatedConstraints($sqlConstratints); } unset($sqlConstratints); @@ -110,20 +113,20 @@ if (strlen($GLOBALS['db']) > 0 // here DELIMITER is not used because it's not part of the // language; each statement is sent one by one - PMA_runEventDefinitionsForDb($GLOBALS['db']); + Operations::runEventDefinitionsForDb($GLOBALS['db']); } // go back to current db, just in case $GLOBALS['dbi']->selectDb($GLOBALS['db']); // Duplicate the bookmarks for this db (done once for each db) - PMA_duplicateBookmarks($_error, $GLOBALS['db']); + Operations::duplicateBookmarks($_error, $GLOBALS['db']); if (! $_error && $move) { if (isset($_REQUEST['adjust_privileges']) && ! empty($_REQUEST['adjust_privileges']) ) { - PMA_AdjustPrivileges_moveDB($GLOBALS['db'], $_REQUEST['newname']); + Operations::adjustPrivilegesMoveDb($GLOBALS['db'], $_REQUEST['newname']); } /** @@ -134,11 +137,11 @@ if (strlen($GLOBALS['db']) > 0 // if someday the RENAME DATABASE reappears, do not DROP $local_query = 'DROP DATABASE ' - . PhpMyAdmin\Util::backquote($GLOBALS['db']) . ';'; + . Util::backquote($GLOBALS['db']) . ';'; $sql_query .= "\n" . $local_query; $GLOBALS['dbi']->query($local_query); - $message = PhpMyAdmin\Message::success( + $message = Message::success( __('Database %1$s has been renamed to %2$s.') ); $message->addParam($GLOBALS['db']); @@ -147,16 +150,16 @@ if (strlen($GLOBALS['db']) > 0 if (isset($_REQUEST['adjust_privileges']) && ! empty($_REQUEST['adjust_privileges']) ) { - PMA_AdjustPrivileges_copyDB($GLOBALS['db'], $_REQUEST['newname']); + Operations::adjustPrivilegesCopyDb($GLOBALS['db'], $_REQUEST['newname']); } - $message = PhpMyAdmin\Message::success( + $message = Message::success( __('Database %1$s has been copied to %2$s.') ); $message->addParam($GLOBALS['db']); $message->addParam($_REQUEST['newname']); } else { - $message = PhpMyAdmin\Message::error(); + $message = Message::error(); } $reload = true; @@ -185,7 +188,7 @@ if (strlen($GLOBALS['db']) > 0 $response->addJSON('newname', $_REQUEST['newname']); $response->addJSON( 'sql_query', - PhpMyAdmin\Util::getMessage(null, $sql_query) + Util::getMessage(null, $sql_query) ); $response->addJSON('db', $GLOBALS['db']); exit; @@ -222,12 +225,12 @@ list( $tooltip_truename, $tooltip_aliasname, $pos -) = PhpMyAdmin\Util::getDbInfo($db, isset($sub_part) ? $sub_part : ''); +) = Util::getDbInfo($db, isset($sub_part) ? $sub_part : ''); echo "\n"; if (isset($message)) { - echo PhpMyAdmin\Util::getMessage($message, $sql_query); + echo Util::getMessage($message, $sql_query); unset($message); } @@ -239,7 +242,7 @@ if (!$is_information_schema) { /** * database comment */ - $response->addHTML(PMA_getHtmlForDatabaseComment($GLOBALS['db'])); + $response->addHTML(Operations::getHtmlForDatabaseComment($GLOBALS['db'])); } $response->addHTML('
'); @@ -250,7 +253,7 @@ if (!$is_information_schema) { * rename database */ if ($GLOBALS['db'] != 'mysql') { - $response->addHTML(PMA_getHtmlForRenameDatabase($GLOBALS['db'])); + $response->addHTML(Operations::getHtmlForRenameDatabase($GLOBALS['db'])); } // Drop link if allowed @@ -261,22 +264,22 @@ if (!$is_information_schema) { && ! $db_is_system_schema && $GLOBALS['db'] != 'mysql' ) { - $response->addHTML(PMA_getHtmlForDropDatabaseLink($GLOBALS['db'])); + $response->addHTML(Operations::getHtmlForDropDatabaseLink($GLOBALS['db'])); } /** * Copy database */ - $response->addHTML(PMA_getHtmlForCopyDatabase($GLOBALS['db'])); + $response->addHTML(Operations::getHtmlForCopyDatabase($GLOBALS['db'])); /** * Change database charset */ - $response->addHTML(PMA_getHtmlForChangeDatabaseCharset($GLOBALS['db'], $table)); + $response->addHTML(Operations::getHtmlForChangeDatabaseCharset($GLOBALS['db'], $table)); if (! $cfgRelation['allworks'] && $cfg['PmaNoRelation_DisableWarning'] == false ) { - $message = PhpMyAdmin\Message::notice( + $message = Message::notice( __( 'The phpMyAdmin configuration storage has been deactivated. ' . '%sFind out why%s.' @@ -296,13 +299,13 @@ if ($cfgRelation['pdfwork'] && $num_tables > 0) { // We only show this if we find something in the new pdf_pages table $test_query = ' SELECT * - FROM ' . PhpMyAdmin\Util::backquote($GLOBALS['cfgRelation']['db']) - . '.' . PhpMyAdmin\Util::backquote($cfgRelation['pdf_pages']) . ' + FROM ' . Util::backquote($GLOBALS['cfgRelation']['db']) + . '.' . Util::backquote($cfgRelation['pdf_pages']) . ' WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($GLOBALS['db']) . '\''; $test_rs = PMA_queryAsControlUser( $test_query, false, - PhpMyAdmin\DatabaseInterface::QUERY_STORE + DatabaseInterface::QUERY_STORE ); } // end if diff --git a/libraries/classes/Operations.php b/libraries/classes/Operations.php new file mode 100644 index 0000000000..e26a0e45c5 --- /dev/null +++ b/libraries/classes/Operations.php @@ -0,0 +1,2131 @@ +' + . '
' + . Url::getHiddenInputs($db) + . '
' + . ''; + if (Util::showIcons('ActionLinksMode')) { + $html_output .= Util::getImage('b_comment.png') . ' '; + } + $html_output .= __('Database comment'); + $html_output .= ''; + $html_output .= '' + . '
'; + $html_output .= '
' + . '' + . '
' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get HTML output for rename database + * + * @param string $db database name + * + * @return string $html_output + */ + public static function getHtmlForRenameDatabase($db) + { + $html_output = '
' + . '
'; + if (isset($_REQUEST['db_collation'])) { + $html_output .= '' . "\n"; + } + $html_output .= '' + . '' + . Url::getHiddenInputs($db) + . '
' + . ''; + + if (Util::showIcons('ActionLinksMode')) { + $html_output .= Util::getImage('b_edit.png') . ' '; + } + $html_output .= __('Rename database to') + . ''; + + $html_output .= ''; + $html_output .= '
'; + + if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] + && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $html_output .= ''; + } else { + $html_output .= ''; + } + + $html_output .= '
'; + + $html_output .= '' + . '
' + . '
' + . '' + . '
' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get HTML for database drop link + * + * @param string $db database name + * + * @return string $html_output + */ + public static function getHtmlForDropDatabaseLink($db) + { + $this_sql_query = 'DROP DATABASE ' . Util::backquote($db); + $this_url_params = array( + 'sql_query' => $this_sql_query, + 'back' => 'db_operations.php', + 'goto' => 'index.php', + 'reload' => '1', + 'purge' => '1', + 'message_to_show' => sprintf( + __('Database %s has been dropped.'), + htmlspecialchars(Util::backquote($db)) + ), + 'db' => null, + ); + + $html_output = '
' + . '
'; + $html_output .= ''; + if (Util::showIcons('ActionLinksMode')) { + $html_output .= Util::getImage('b_deltbl.png') . ' '; + } + $html_output .= __('Remove database') + . ''; + $html_output .= '
    '; + $html_output .= self::getDeleteDataOrTablelink( + $this_url_params, + 'DROP_DATABASE', + __('Drop the database (DROP)'), + 'drop_db_anchor' + ); + $html_output .= '
' + . '
'; + + return $html_output; + } + + /** + * Get HTML snippet for copy database + * + * @param string $db database name + * + * @return string $html_output + */ + public static function getHtmlForCopyDatabase($db) + { + $drop_clause = 'DROP TABLE / DROP VIEW'; + $choices = array( + 'structure' => __('Structure only'), + 'data' => __('Structure and data'), + 'dataonly' => __('Data only') + ); + + if (isset($_COOKIE) + && isset($_COOKIE['pma_switch_to_new']) + && $_COOKIE['pma_switch_to_new'] == 'true' + ) { + $pma_switch_to_new = 'true'; + } + + $html_output = '
'; + $html_output .= '
'; + + if (isset($_REQUEST['db_collation'])) { + $html_output .= '' . "\n"; + } + $html_output .= '' . "\n" + . Url::getHiddenInputs($db); + $html_output .= '
' + . ''; + + if (Util::showIcons('ActionLinksMode')) { + $html_output .= Util::getImage('b_edit.png') . ' '; + } + $html_output .= __('Copy database to') + . '' + . '
' + . Util::getRadioFields( + 'what', $choices, 'data', true + ); + $html_output .= '
'; + $html_output .= ''; + $html_output .= '
'; + $html_output .= ''; + $html_output .= '
'; + $html_output .= ''; + $html_output .= '
'; + $html_output .= ''; + $html_output .= '
'; + $html_output .= '
'; + + if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] + && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $html_output .= ''; + } else { + $html_output .= ''; + } + $html_output .= '
'; + + $html_output .= ''; + $html_output .= '' + . '
'; + $html_output .= '
' + . '' + . '
' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get HTML snippet for change database charset + * + * @param string $db database name + * @param string $table table name + * + * @return string $html_output + */ + public static function getHtmlForChangeDatabaseCharset($db, $table) + { + $html_output = '
' + . '
'; + if (Util::showIcons('ActionLinksMode')) { + $html_output .= Util::getImage('s_asci.png') . ' '; + } + $html_output .= '' . "\n" + . '' . "\n" + . Charsets::getCollationDropdownBox( + 'db_collation', + 'select_db_collation', + isset($_REQUEST['db_collation']) ? $_REQUEST['db_collation'] : '', + false + ) + . '' + . '
' + . '' . "\n" + . '
' . "\n" + . '
' . "\n"; + + return $html_output; + } + + /** + * Run the Procedure definitions and function definitions + * + * to avoid selecting alternatively the current and new db + * we would need to modify the CREATE definitions to qualify + * the db name + * + * @param string $db database name + * + * @return void + */ + public static function runProcedureAndFunctionDefinitions($db) + { + $procedure_names = $GLOBALS['dbi']->getProceduresOrFunctions($db, 'PROCEDURE'); + if ($procedure_names) { + foreach ($procedure_names as $procedure_name) { + $GLOBALS['dbi']->selectDb($db); + $tmp_query = $GLOBALS['dbi']->getDefinition( + $db, 'PROCEDURE', $procedure_name + ); + // collect for later display + $GLOBALS['sql_query'] .= "\n" . $tmp_query; + $GLOBALS['dbi']->selectDb($_REQUEST['newname']); + $GLOBALS['dbi']->query($tmp_query); + } + } + + $function_names = $GLOBALS['dbi']->getProceduresOrFunctions($db, 'FUNCTION'); + if ($function_names) { + foreach ($function_names as $function_name) { + $GLOBALS['dbi']->selectDb($db); + $tmp_query = $GLOBALS['dbi']->getDefinition( + $db, 'FUNCTION', $function_name + ); + // collect for later display + $GLOBALS['sql_query'] .= "\n" . $tmp_query; + $GLOBALS['dbi']->selectDb($_REQUEST['newname']); + $GLOBALS['dbi']->query($tmp_query); + } + } + } + + /** + * Create database before copy + * + * @return void + */ + public static function createDbBeforeCopy() + { + // lower_case_table_names=1 `DB` becomes `db` + if ($GLOBALS['dbi']->getLowerCaseNames() === '1') { + $_REQUEST['newname'] = mb_strtolower( + $_REQUEST['newname'] + ); + } + + $local_query = 'CREATE DATABASE IF NOT EXISTS ' + . Util::backquote($_REQUEST['newname']); + if (isset($_REQUEST['db_collation'])) { + $local_query .= ' DEFAULT' + . Util::getCharsetQueryPart($_REQUEST['db_collation']); + } + $local_query .= ';'; + $GLOBALS['sql_query'] .= $local_query; + + // save the original db name because Tracker.php which + // may be called under $GLOBALS['dbi']->query() changes $GLOBALS['db'] + // for some statements, one of which being CREATE DATABASE + $original_db = $GLOBALS['db']; + $GLOBALS['dbi']->query($local_query); + $GLOBALS['db'] = $original_db; + + // Set the SQL mode to NO_AUTO_VALUE_ON_ZERO to prevent MySQL from creating + // export statements it cannot import + $sql_set_mode = "SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO'"; + $GLOBALS['dbi']->query($sql_set_mode); + + // rebuild the database list because Table::moveCopy + // checks in this list if the target db exists + $GLOBALS['dblist']->databases->build(); + } + + /** + * Get views as an array and create SQL view stand-in + * + * @param array $tables_full array of all tables in given db or dbs + * @param ExportSql $export_sql_plugin export plugin instance + * @param string $db database name + * + * @return array $views + */ + public static function getViewsAndCreateSqlViewStandIn( + $tables_full, $export_sql_plugin, $db + ) { + $views = array(); + foreach ($tables_full as $each_table => $tmp) { + // to be able to rename a db containing views, + // first all the views are collected and a stand-in is created + // the real views are created after the tables + if ($GLOBALS['dbi']->getTable($db, $each_table)->isView()) { + + // If view exists, and 'add drop view' is selected: Drop it! + if ($_REQUEST['what'] != 'nocopy' + && isset($_REQUEST['drop_if_exists']) + && $_REQUEST['drop_if_exists'] == 'true' + ) { + $drop_query = 'DROP VIEW IF EXISTS ' + . Util::backquote($_REQUEST['newname']) . '.' + . Util::backquote($each_table); + $GLOBALS['dbi']->query($drop_query); + + $GLOBALS['sql_query'] .= "\n" . $drop_query . ';'; + } + + $views[] = $each_table; + // Create stand-in definition to resolve view dependencies + $sql_view_standin = $export_sql_plugin->getTableDefStandIn( + $db, $each_table, "\n" + ); + $GLOBALS['dbi']->selectDb($_REQUEST['newname']); + $GLOBALS['dbi']->query($sql_view_standin); + $GLOBALS['sql_query'] .= "\n" . $sql_view_standin; + } + } + return $views; + } + + /** + * Get sql query for copy/rename table and boolean for whether copy/rename or not + * + * @param array $tables_full array of all tables in given db or dbs + * @param boolean $move whether database name is empty or not + * @param string $db database name + * + * @return array SQL queries for the constraints + */ + public static function copyTables($tables_full, $move, $db) + { + $sqlContraints = array(); + foreach ($tables_full as $each_table => $tmp) { + // skip the views; we have created stand-in definitions + if ($GLOBALS['dbi']->getTable($db, $each_table)->isView()) { + continue; + } + + // value of $what for this table only + $this_what = $_REQUEST['what']; + + // do not copy the data from a Merge table + // note: on the calling FORM, 'data' means 'structure and data' + if ($GLOBALS['dbi']->getTable($db, $each_table)->isMerge()) { + if ($this_what == 'data') { + $this_what = 'structure'; + } + if ($this_what == 'dataonly') { + $this_what = 'nocopy'; + } + } + + if ($this_what != 'nocopy') { + // keep the triggers from the original db+table + // (third param is empty because delimiters are only intended + // for importing via the mysql client or our Import feature) + $triggers = $GLOBALS['dbi']->getTriggers($db, $each_table, ''); + + if (! Table::moveCopy( + $db, $each_table, $_REQUEST['newname'], $each_table, + (isset($this_what) ? $this_what : 'data'), + $move, 'db_copy' + )) { + $GLOBALS['_error'] = true; + break; + } + // apply the triggers to the destination db+table + if ($triggers) { + $GLOBALS['dbi']->selectDb($_REQUEST['newname']); + foreach ($triggers as $trigger) { + $GLOBALS['dbi']->query($trigger['create']); + $GLOBALS['sql_query'] .= "\n" . $trigger['create'] . ';'; + } + } + + // this does not apply to a rename operation + if (isset($_REQUEST['add_constraints']) + && ! empty($GLOBALS['sql_constraints_query']) + ) { + $sqlContraints[] = $GLOBALS['sql_constraints_query']; + unset($GLOBALS['sql_constraints_query']); + } + } + } + return $sqlContraints; + } + + /** + * Run the EVENT definition for selected database + * + * to avoid selecting alternatively the current and new db + * we would need to modify the CREATE definitions to qualify + * the db name + * + * @param string $db database name + * + * @return void + */ + public static function runEventDefinitionsForDb($db) + { + $event_names = $GLOBALS['dbi']->fetchResult( + 'SELECT EVENT_NAME FROM information_schema.EVENTS WHERE EVENT_SCHEMA= \'' + . $GLOBALS['dbi']->escapeString($db) . '\';' + ); + if ($event_names) { + foreach ($event_names as $event_name) { + $GLOBALS['dbi']->selectDb($db); + $tmp_query = $GLOBALS['dbi']->getDefinition($db, 'EVENT', $event_name); + // collect for later display + $GLOBALS['sql_query'] .= "\n" . $tmp_query; + $GLOBALS['dbi']->selectDb($_REQUEST['newname']); + $GLOBALS['dbi']->query($tmp_query); + } + } + } + + /** + * Handle the views, return the boolean value whether table rename/copy or not + * + * @param array $views views as an array + * @param boolean $move whether database name is empty or not + * @param string $db database name + * + * @return void + */ + public static function handleTheViews($views, $move, $db) + { + // temporarily force to add DROP IF EXIST to CREATE VIEW query, + // to remove stand-in VIEW that was created earlier + // ( $_REQUEST['drop_if_exists'] is used in moveCopy() ) + if (isset($_REQUEST['drop_if_exists'])) { + $temp_drop_if_exists = $_REQUEST['drop_if_exists']; + } + + $_REQUEST['drop_if_exists'] = 'true'; + foreach ($views as $view) { + $copying_succeeded = Table::moveCopy( + $db, $view, $_REQUEST['newname'], $view, 'structure', $move, 'db_copy' + ); + if (! $copying_succeeded) { + $GLOBALS['_error'] = true; + break; + } + } + unset($_REQUEST['drop_if_exists']); + + if (isset($temp_drop_if_exists)) { + // restore previous value + $_REQUEST['drop_if_exists'] = $temp_drop_if_exists; + } + } + + /** + * Adjust the privileges after Renaming the db + * + * @param string $oldDb Database name before renaming + * @param string $newname New Database name requested + * + * @return void + */ + public static function adjustPrivilegesMoveDb($oldDb, $newname) + { + if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] + && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $GLOBALS['dbi']->selectDb('mysql'); + $newname = str_replace("_", "\_", $newname); + $oldDb = str_replace("_", "\_", $oldDb); + + // For Db specific privileges + $query_db_specific = 'UPDATE ' . Util::backquote('db') + . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) + . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; + $GLOBALS['dbi']->query($query_db_specific); + + // For table specific privileges + $query_table_specific = 'UPDATE ' . Util::backquote('tables_priv') + . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) + . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; + $GLOBALS['dbi']->query($query_table_specific); + + // For column specific privileges + $query_col_specific = 'UPDATE ' . Util::backquote('columns_priv') + . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) + . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; + $GLOBALS['dbi']->query($query_col_specific); + + // For procedures specific privileges + $query_proc_specific = 'UPDATE ' . Util::backquote('procs_priv') + . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) + . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; + $GLOBALS['dbi']->query($query_proc_specific); + + // Finally FLUSH the new privileges + $flush_query = "FLUSH PRIVILEGES;"; + $GLOBALS['dbi']->query($flush_query); + } + } + + /** + * Adjust the privileges after Copying the db + * + * @param string $oldDb Database name before copying + * @param string $newname New Database name requested + * + * @return void + */ + public static function adjustPrivilegesCopyDb($oldDb, $newname) + { + if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] + && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $GLOBALS['dbi']->selectDb('mysql'); + $newname = str_replace("_", "\_", $newname); + $oldDb = str_replace("_", "\_", $oldDb); + + $query_db_specific_old = 'SELECT * FROM ' + . Util::backquote('db') . ' WHERE ' + . 'Db = "' . $oldDb . '";'; + + $old_privs_db = $GLOBALS['dbi']->fetchResult($query_db_specific_old, 0); + + foreach ($old_privs_db as $old_priv) { + $newDb_db_privs_query = 'INSERT INTO ' . Util::backquote('db') + . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' + . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] + . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '", "' + . $old_priv[7] . '", "' . $old_priv[8] . '", "' . $old_priv[9] + . '", "' . $old_priv[10] . '", "' . $old_priv[11] . '", "' + . $old_priv[12] . '", "' . $old_priv[13] . '", "' . $old_priv[14] + . '", "' . $old_priv[15] . '", "' . $old_priv[16] . '", "' + . $old_priv[17] . '", "' . $old_priv[18] . '", "' . $old_priv[19] + . '", "' . $old_priv[20] . '", "' . $old_priv[21] . '");'; + + $GLOBALS['dbi']->query($newDb_db_privs_query); + } + + // For Table Specific privileges + $query_table_specific_old = 'SELECT * FROM ' + . Util::backquote('tables_priv') . ' WHERE ' + . 'Db = "' . $oldDb . '";'; + + $old_privs_table = $GLOBALS['dbi']->fetchResult( + $query_table_specific_old, + 0 + ); + + foreach ($old_privs_table as $old_priv) { + $newDb_table_privs_query = 'INSERT INTO ' . Util::backquote( + 'tables_priv' + ) . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' + . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] + . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '", "' + . $old_priv[7] . '");'; + + $GLOBALS['dbi']->query($newDb_table_privs_query); + } + + // For Column Specific privileges + $query_col_specific_old = 'SELECT * FROM ' + . Util::backquote('columns_priv') . ' WHERE ' + . 'Db = "' . $oldDb . '";'; + + $old_privs_col = $GLOBALS['dbi']->fetchResult( + $query_col_specific_old, + 0 + ); + + foreach ($old_privs_col as $old_priv) { + $newDb_col_privs_query = 'INSERT INTO ' . Util::backquote( + 'columns_priv' + ) . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' + . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] + . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '");'; + + $GLOBALS['dbi']->query($newDb_col_privs_query); + } + + // For Procedure Specific privileges + $query_proc_specific_old = 'SELECT * FROM ' + . Util::backquote('procs_priv') . ' WHERE ' + . 'Db = "' . $oldDb . '";'; + + $old_privs_proc = $GLOBALS['dbi']->fetchResult( + $query_proc_specific_old, + 0 + ); + + foreach ($old_privs_proc as $old_priv) { + $newDb_proc_privs_query = 'INSERT INTO ' . Util::backquote( + 'procs_priv' + ) . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' + . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] + . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '", "' + . $old_priv[7] . '");'; + + $GLOBALS['dbi']->query($newDb_proc_privs_query); + } + + // Finally FLUSH the new privileges + $flush_query = "FLUSH PRIVILEGES;"; + $GLOBALS['dbi']->query($flush_query); + } + } + + /** + * Create all accumulated constraints + * + * @param array $sqlConstratints array of sql constraints for the database + * + * @return void + */ + public static function createAllAccumulatedConstraints($sqlConstratints) + { + $GLOBALS['dbi']->selectDb($_REQUEST['newname']); + foreach ($sqlConstratints as $one_query) { + $GLOBALS['dbi']->query($one_query); + // and prepare to display them + $GLOBALS['sql_query'] .= "\n" . $one_query; + } + } + + /** + * Duplicate the bookmarks for the db (done once for each db) + * + * @param boolean $_error whether table rename/copy or not + * @param string $db database name + * + * @return void + */ + public static function duplicateBookmarks($_error, $db) + { + if (! $_error && $db != $_REQUEST['newname']) { + $get_fields = array('user', 'label', 'query'); + $where_fields = array('dbase' => $db); + $new_fields = array('dbase' => $_REQUEST['newname']); + Table::duplicateInfo( + 'bookmarkwork', 'bookmark', $get_fields, + $where_fields, $new_fields + ); + } + } + + /** + * Get the HTML snippet for order the table + * + * @param array $columns columns array + * + * @return string $html_out + */ + public static function getHtmlForOrderTheTable($columns) + { + $html_output = '
'; + $html_output .= '
'; + $html_output .= Url::getHiddenInputs( + $GLOBALS['db'], $GLOBALS['table'] + ); + $html_output .= '
' + . '' . __('Alter table order by') . '' + . ' ' . __('(singly)') . ' ' + . '
' + . '' + . '' + . '' + . '' + . '
' + . '
' + . '' + . '' + . '
' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get the HTML snippet for move table + * + * @return string $html_output + */ + public static function getHtmlForMoveTable() + { + $html_output = '
'; + $html_output .= '
' + . Url::getHiddenInputs($GLOBALS['db'], $GLOBALS['table']); + + $html_output .= '' + . '' + . '
'; + + $html_output .= '' . __('Move table to (database.table)') + . ''; + + if (count($GLOBALS['dblist']->databases) > $GLOBALS['cfg']['MaxDbList']) { + $html_output .= ''; + } else { + $html_output .= ''; + } + $html_output .= ' . '; + $html_output .= '
'; + + // starting with MySQL 5.0.24, SHOW CREATE TABLE includes the AUTO_INCREMENT + // next value but users can decide if they want it or not for the operation + + $html_output .= '' + . '
'; + + if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $html_output .= ''; + } else { + $html_output .= ''; + } + $html_output .= '
'; + + $html_output .= '
' + . '' + . '
' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get the HTML div for Table option + * + * @param Table $pma_table Table object + * @param string $comment Comment + * @param array $tbl_collation table collation + * @param string $tbl_storage_engine table storage engine + * @param string $pack_keys pack keys + * @param string $auto_increment value of auto increment + * @param string $delay_key_write delay key write + * @param string $transactional value of transactional + * @param string $page_checksum value of page checksum + * @param string $checksum the checksum + * + * @return string $html_output + */ + public static function getTableOptionDiv($pma_table, $comment, $tbl_collation, $tbl_storage_engine, + $pack_keys, $auto_increment, $delay_key_write, + $transactional, $page_checksum, $checksum + ) { + $html_output = '
'; + $html_output .= '
' + . '' + . '' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get HTML for the rename table part of table options + * + * @return string $html_output + */ + public static function getHtmlForRenameTable() + { + $html_output = '' . __('Rename table to') . '' + . '' + . '' + . '' + . ''; + + if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $html_output .= ''; + } else { + $html_output .= ''; + } + $html_output .= ''; + + $html_output .= ''; + return $html_output; + } + + /** + * Get HTML for the table comments part of table options + * + * @param string $current_value of the table comments + * + * @return string $html_output + */ + public static function getHtmlForTableComments($current_value) + { + $commentLength = $GLOBALS['dbi']->getVersion() >= 50503 ? 2048 : 60; + $html_output = '' . __('Table comments') . '' + . '' + . '' + . '' + . ''; + + return $html_output; + } + + /** + * Get HTML for the PACK KEYS part of table options + * + * @param string $current_value of the pack keys option + * + * @return string $html_output + */ + public static function getHtmlForPackKeys($current_value) + { + $html_output = '' + . '' + . '' + . '' + . ''; + + if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'ISAM'))) { + $html_output .= self::getHtmlForPackKeys($pack_keys); + } // end if (MYISAM|ISAM) + + if ($pma_table->isEngine(array('MYISAM', 'ARIA'))) { + $html_output .= self::getHtmlForTableRow( + 'new_checksum', + 'CHECKSUM', + $checksum + ); + + $html_output .= self::getHtmlForTableRow( + 'new_delay_key_write', + 'DELAY_KEY_WRITE', + $delay_key_write + ); + } // end if (MYISAM) + + if ($pma_table->isEngine('ARIA')) { + $html_output .= self::getHtmlForTableRow( + 'new_transactional', + 'TRANSACTIONAL', + $transactional + ); + + $html_output .= self::getHtmlForTableRow( + 'new_page_checksum', + 'PAGE_CHECKSUM', + $page_checksum + ); + } // end if (ARIA) + + if (strlen($auto_increment) > 0 + && $pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'PBXT')) + ) { + $html_output .= '' + . '' + . '' + . ' '; + } // end if (MYISAM|INNODB) + + $possible_row_formats = self::getPossibleRowFormat(); + + // for MYISAM there is also COMPRESSED but it can be set only by the + // myisampack utility, so don't offer here the choice because if we + // try it inside an ALTER TABLE, MySQL (at least in 5.1.23-maria) + // does not return a warning + // (if the table was compressed, it can be seen on the Structure page) + + if (isset($possible_row_formats[$tbl_storage_engine])) { + $current_row_format + = mb_strtoupper($GLOBALS['showtable']['Row_format']); + $html_output .= '' + . '' + . ''; + $html_output .= Util::getDropdown( + 'new_row_format', $possible_row_formats[$tbl_storage_engine], + $current_row_format, 'new_row_format' + ); + $html_output .= ''; + } + $html_output .= '' + . ''; + + return $html_output; + } + + /** + * Get the common HTML table row (tr) for new_checksum, new_delay_key_write, + * new_transactional and new_page_checksum + * + * @param string $attribute class, name and id attribute + * @param string $label label value + * @param string $val checksum, delay_key_write, transactional, page_checksum + * + * @return string $html_output + */ + public static function getHtmlForTableRow($attribute, $label, $val) + { + return '' + . '' + . '' + . '' + . '' + . '' + . '' + . ''; + } + + /** + * Get array of possible row formats + * + * @return array $possible_row_formats + */ + public static function getPossibleRowFormat() + { + // the outer array is for engines, the inner array contains the dropdown + // option values as keys then the dropdown option labels + + $possible_row_formats = array( + 'ARCHIVE' => array( + 'COMPRESSED' => 'COMPRESSED', + ), + 'ARIA' => array( + 'FIXED' => 'FIXED', + 'DYNAMIC' => 'DYNAMIC', + 'PAGE' => 'PAGE' + ), + 'MARIA' => array( + 'FIXED' => 'FIXED', + 'DYNAMIC' => 'DYNAMIC', + 'PAGE' => 'PAGE' + ), + 'MYISAM' => array( + 'FIXED' => 'FIXED', + 'DYNAMIC' => 'DYNAMIC' + ), + 'PBXT' => array( + 'FIXED' => 'FIXED', + 'DYNAMIC' => 'DYNAMIC' + ), + 'INNODB' => array( + 'COMPACT' => 'COMPACT', + 'REDUNDANT' => 'REDUNDANT' + ) + ); + + /** @var Innodb $innodbEnginePlugin */ + $innodbEnginePlugin = StorageEngine::getEngine('Innodb'); + $innodbPluginVersion = $innodbEnginePlugin->getInnodbPluginVersion(); + if (!empty($innodbPluginVersion)) { + $innodb_file_format = $innodbEnginePlugin->getInnodbFileFormat(); + } else { + $innodb_file_format = ''; + } + if ('Barracuda' == $innodb_file_format + && $innodbEnginePlugin->supportsFilePerTable() + ) { + $possible_row_formats['INNODB']['DYNAMIC'] = 'DYNAMIC'; + $possible_row_formats['INNODB']['COMPRESSED'] = 'COMPRESSED'; + } + + return $possible_row_formats; + } + + /** + * Get HTML div for copy table + * + * @return string $html_output + */ + public static function getHtmlForCopytable() + { + $html_output = '
'; + $html_output .= '
' + . Url::getHiddenInputs($GLOBALS['db'], $GLOBALS['table']) + . ''; + + $html_output .= '
'; + $html_output .= '' + . __('Copy table to (database.table)') . ''; + + if (count($GLOBALS['dblist']->databases) > $GLOBALS['cfg']['MaxDbList']) { + $html_output .= ''; + } else { + $html_output .= ''; + } + $html_output .= ' . '; + $html_output .= '
'; + + $choices = array( + 'structure' => __('Structure only'), + 'data' => __('Structure and data'), + 'dataonly' => __('Data only') + ); + + $html_output .= Util::getRadioFields( + 'what', $choices, 'data', true + ); + $html_output .= '
'; + + $html_output .= '' + . '
' + . '' + . '
'; + + // display "Add constraints" choice only if there are + // foreign keys + if (PMA_getForeigners($GLOBALS['db'], $GLOBALS['table'], '', 'foreign')) { + $html_output .= ''; + $html_output .= '
'; + } // endif + + $html_output .= '
'; + + if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $html_output .= ''; + } else { + $html_output .= ''; + } + $html_output .= '
'; + + if (isset($_COOKIE['pma_switch_to_new']) + && $_COOKIE['pma_switch_to_new'] == 'true' + ) { + $pma_switch_to_new = 'true'; + } + + $html_output .= ''); + $html_output .= '' + . '
'; + + $html_output .= '
' + . '' + . '
' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get HTML snippet for table maintenance + * + * @param Table $pma_table Table object + * @param array $url_params array of URL parameters + * + * @return string $html_output + */ + public static function getHtmlForTableMaintenance($pma_table, $url_params) + { + $html_output = '
'; + $html_output .= '
' + . '' . __('Table maintenance') . ''; + $html_output .= '
    '; + + // Note: BERKELEY (BDB) is no longer supported, starting with MySQL 5.1 + $html_output .= self::getListofMaintainActionLink($pma_table, $url_params); + + $html_output .= '
' + . '
' + . '
'; + + return $html_output; + } + + /** + * Get HTML 'li' having a link of maintain action + * + * @param Table $pma_table Table object + * @param array $url_params Array of URL parameters + * + * @return string $html_output + */ + public static function getListofMaintainActionLink($pma_table, $url_params) + { + $html_output = ''; + + // analyze table + if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'BERKELEYDB', 'TOKUDB'))) { + $params = array( + 'sql_query' => 'ANALYZE TABLE ' + . Util::backquote($GLOBALS['table']), + 'table_maintenance' => 'Go', + ); + $html_output .= self::getMaintainActionlink( + __('Analyze table'), + $params, + $url_params, + 'ANALYZE_TABLE' + ); + } + + // check table + if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'TOKUDB'))) { + $params = array( + 'sql_query' => 'CHECK TABLE ' + . Util::backquote($GLOBALS['table']), + 'table_maintenance' => 'Go', + ); + $html_output .= self::getMaintainActionlink( + __('Check table'), + $params, + $url_params, + 'CHECK_TABLE' + ); + } + + // checksum table + $params = array( + 'sql_query' => 'CHECKSUM TABLE ' + . Util::backquote($GLOBALS['table']), + 'table_maintenance' => 'Go', + ); + $html_output .= self::getMaintainActionlink( + __('Checksum table'), + $params, + $url_params, + 'CHECKSUM_TABLE' + ); + + // defragment table + if ($pma_table->isEngine(array('INNODB'))) { + $params = array( + 'sql_query' => 'ALTER TABLE ' + . Util::backquote($GLOBALS['table']) + . ' ENGINE = InnoDB;' + ); + $html_output .= self::getMaintainActionlink( + __('Defragment table'), + $params, + $url_params, + 'InnoDB_File_Defragmenting' + ); + } + + // flush table + $params = array( + 'sql_query' => 'FLUSH TABLE ' + . Util::backquote($GLOBALS['table']), + 'message_to_show' => sprintf( + __('Table %s has been flushed.'), + htmlspecialchars($GLOBALS['table']) + ), + 'reload' => 1, + ); + $html_output .= self::getMaintainActionlink( + __('Flush the table (FLUSH)'), + $params, + $url_params, + 'FLUSH' + ); + + // optimize table + if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'BERKELEYDB', 'TOKUDB'))) { + $params = array( + 'sql_query' => 'OPTIMIZE TABLE ' + . Util::backquote($GLOBALS['table']), + 'table_maintenance' => 'Go', + ); + $html_output .= self::getMaintainActionlink( + __('Optimize table'), + $params, + $url_params, + 'OPTIMIZE_TABLE' + ); + } + + // repair table + if ($pma_table->isEngine(array('MYISAM', 'ARIA'))) { + $params = array( + 'sql_query' => 'REPAIR TABLE ' + . Util::backquote($GLOBALS['table']), + 'table_maintenance' => 'Go', + ); + $html_output .= self::getMaintainActionlink( + __('Repair table'), + $params, + $url_params, + 'REPAIR_TABLE' + ); + } + + return $html_output; + } + + /** + * Get maintain action HTML link + * + * @param string $action_message action message + * @param array $params url parameters array + * @param array $url_params additional url parameters + * @param string $link contains name of page/anchor that is being linked + * + * @return string $html_output + */ + public static function getMaintainActionlink($action_message, $params, $url_params, $link) + { + return '
  • ' + . '' + . $action_message + . '' + . Util::showMySQLDocu($link) + . '
  • '; + } + + /** + * Get HTML for Delete data or table (truncate table, drop table) + * + * @param array $truncate_table_url_params url parameter array for truncate table + * @param array $dropTableUrlParams url parameter array for drop table + * + * @return string $html_output + */ + public static function getHtmlForDeleteDataOrTable( + $truncate_table_url_params, + $dropTableUrlParams + ) { + $html_output = '
    ' + . '
    ' + . '' . __('Delete data or table') . ''; + + $html_output .= '
      '; + + if (! empty($truncate_table_url_params)) { + $html_output .= self::getDeleteDataOrTablelink( + $truncate_table_url_params, + 'TRUNCATE_TABLE', + __('Empty the table (TRUNCATE)'), + 'truncate_tbl_anchor' + ); + } + if (!empty($dropTableUrlParams)) { + $html_output .= self::getDeleteDataOrTablelink( + $dropTableUrlParams, + 'DROP_TABLE', + __('Delete the table (DROP)'), + 'drop_tbl_anchor' + ); + } + $html_output .= '
    '; + + return $html_output; + } + + /** + * Get the HTML link for Truncate table, Drop table and Drop db + * + * @param array $url_params url parameter array for delete data or table + * @param string $syntax TRUNCATE_TABLE or DROP_TABLE or DROP_DATABASE + * @param string $link link to be shown + * @param string $htmlId id of the link + * + * @return String html output + */ + public static function getDeleteDataOrTablelink($url_params, $syntax, $link, $htmlId) + { + return '
  • ' + . $link . '' + . Util::showMySQLDocu($syntax) + . '
  • '; + } + + /** + * Get HTML snippet for partition maintenance + * + * @param array $partition_names array of partition names for a specific db/table + * @param array $url_params url parameters + * + * @return string $html_output + */ + public static function getHtmlForPartitionMaintenance($partition_names, $url_params) + { + $choices = array( + 'ANALYZE' => __('Analyze'), + 'CHECK' => __('Check'), + 'OPTIMIZE' => __('Optimize'), + 'REBUILD' => __('Rebuild'), + 'REPAIR' => __('Repair'), + 'TRUNCATE' => __('Truncate') + ); + + $partition_method = Partition::getPartitionMethod( + $GLOBALS['db'], $GLOBALS['table'] + ); + // add COALESCE or DROP option to choices array depeding on Partition method + if ($partition_method == 'RANGE' + || $partition_method == 'RANGE COLUMNS' + || $partition_method == 'LIST' + || $partition_method == 'LIST COLUMNS' + ) { + $choices['DROP'] = __('Drop'); + } else { + $choices['COALESCE'] = __('Coalesce'); + } + + $html_output = '
    ' + . '
    ' + . Url::getHiddenInputs($GLOBALS['db'], $GLOBALS['table']) + . '
    ' + . '' + . __('Partition maintenance') + . Util::showMySQLDocu('partitioning_maintenance') + . ''; + + $html_select = '' . "\n"; + $html_output .= sprintf(__('Partition %s'), $html_select); + + $html_output .= '
    '; + $html_output .= Util::getRadioFields( + 'partition_operation', $choices, 'ANALYZE', false, true, 'floatleft' + ); + $this_url_params = array_merge( + $url_params, + array( + 'sql_query' => 'ALTER TABLE ' + . Util::backquote($GLOBALS['table']) + . ' REMOVE PARTITIONING;' + ) + ); + $html_output .= '

    '; + + $html_output .= '' + . __('Remove partitioning') . ''; + + $html_output .= '
    ' + . '
    ' + . '' + . '' + . '
    ' + . '
    ' + . '
    '; + + return $html_output; + } + + /** + * Get the HTML for Referential Integrity check + * + * @param array $foreign all Relations to foreign tables for a given table + * or optionally a given column in a table + * @param array $url_params array of url parameters + * + * @return string $html_output + */ + public static function getHtmlForReferentialIntegrityCheck($foreign, $url_params) + { + $html_output = '
    ' + . '
    ' + . '' . __('Check referential integrity:') . ''; + + $html_output .= '
      '; + + foreach ($foreign as $master => $arr) { + $join_query = 'SELECT ' + . Util::backquote($GLOBALS['table']) . '.*' + . ' FROM ' . Util::backquote($GLOBALS['table']) + . ' LEFT JOIN ' + . Util::backquote($arr['foreign_db']) + . '.' + . Util::backquote($arr['foreign_table']); + if ($arr['foreign_table'] == $GLOBALS['table']) { + $foreign_table = $GLOBALS['table'] . '1'; + $join_query .= ' AS ' . Util::backquote($foreign_table); + } else { + $foreign_table = $arr['foreign_table']; + } + $join_query .= ' ON ' + . Util::backquote($GLOBALS['table']) . '.' + . Util::backquote($master) + . ' = ' + . Util::backquote($arr['foreign_db']) + . '.' + . Util::backquote($foreign_table) . '.' + . Util::backquote($arr['foreign_field']) + . ' WHERE ' + . Util::backquote($arr['foreign_db']) + . '.' + . Util::backquote($foreign_table) . '.' + . Util::backquote($arr['foreign_field']) + . ' IS NULL AND ' + . Util::backquote($GLOBALS['table']) . '.' + . Util::backquote($master) + . ' IS NOT NULL'; + $this_url_params = array_merge( + $url_params, + array('sql_query' => $join_query) + ); + + $html_output .= '
    • ' + . '' + . $master . ' -> ' . $arr['foreign_db'] . '.' + . $arr['foreign_table'] . '.' . $arr['foreign_field'] + . '
    • ' . "\n"; + } // foreach $foreign + $html_output .= '
    '; + + return $html_output; + } + + /** + * Reorder table based on request params + * + * @return array SQL query and result + */ + public static function getQueryAndResultForReorderingTable() + { + $sql_query = 'ALTER TABLE ' + . Util::backquote($GLOBALS['table']) + . ' ORDER BY ' + . Util::backquote(urldecode($_REQUEST['order_field'])); + if (isset($_REQUEST['order_order']) + && $_REQUEST['order_order'] === 'desc' + ) { + $sql_query .= ' DESC'; + } else { + $sql_query .= ' ASC'; + } + $sql_query .= ';'; + $result = $GLOBALS['dbi']->query($sql_query); + + return array($sql_query, $result); + } + + /** + * Get table alters array + * + * @param Table $pma_table The Table object + * @param string $pack_keys pack keys + * @param string $checksum value of checksum + * @param string $page_checksum value of page checksum + * @param string $delay_key_write delay key write + * @param string $row_format row format + * @param string $newTblStorageEngine table storage engine + * @param string $transactional value of transactional + * @param string $tbl_collation collation of the table + * + * @return array $table_alters + */ + public static function getTableAltersArray($pma_table, $pack_keys, + $checksum, $page_checksum, $delay_key_write, + $row_format, $newTblStorageEngine, $transactional, $tbl_collation + ) { + global $auto_increment; + + $table_alters = array(); + + if (isset($_REQUEST['comment']) + && urldecode($_REQUEST['prev_comment']) !== $_REQUEST['comment'] + ) { + $table_alters[] = 'COMMENT = \'' + . $GLOBALS['dbi']->escapeString($_REQUEST['comment']) . '\''; + } + + if (! empty($newTblStorageEngine) + && mb_strtolower($newTblStorageEngine) !== mb_strtolower($GLOBALS['tbl_storage_engine']) + ) { + $table_alters[] = 'ENGINE = ' . $newTblStorageEngine; + } + if (! empty($_REQUEST['tbl_collation']) + && $_REQUEST['tbl_collation'] !== $tbl_collation + ) { + $table_alters[] = 'DEFAULT ' + . Util::getCharsetQueryPart($_REQUEST['tbl_collation']); + } + + if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'ISAM')) + && isset($_REQUEST['new_pack_keys']) + && $_REQUEST['new_pack_keys'] != (string)$pack_keys + ) { + $table_alters[] = 'pack_keys = ' . $_REQUEST['new_pack_keys']; + } + + $_REQUEST['new_checksum'] = empty($_REQUEST['new_checksum']) ? '0' : '1'; + if ($pma_table->isEngine(array('MYISAM', 'ARIA')) + && $_REQUEST['new_checksum'] !== $checksum + ) { + $table_alters[] = 'checksum = ' . $_REQUEST['new_checksum']; + } + + $_REQUEST['new_transactional'] + = empty($_REQUEST['new_transactional']) ? '0' : '1'; + if ($pma_table->isEngine('ARIA') + && $_REQUEST['new_transactional'] !== $transactional + ) { + $table_alters[] = 'TRANSACTIONAL = ' . $_REQUEST['new_transactional']; + } + + $_REQUEST['new_page_checksum'] + = empty($_REQUEST['new_page_checksum']) ? '0' : '1'; + if ($pma_table->isEngine('ARIA') + && $_REQUEST['new_page_checksum'] !== $page_checksum + ) { + $table_alters[] = 'PAGE_CHECKSUM = ' . $_REQUEST['new_page_checksum']; + } + + $_REQUEST['new_delay_key_write'] + = empty($_REQUEST['new_delay_key_write']) ? '0' : '1'; + if ($pma_table->isEngine(array('MYISAM', 'ARIA')) + && $_REQUEST['new_delay_key_write'] !== $delay_key_write + ) { + $table_alters[] = 'delay_key_write = ' . $_REQUEST['new_delay_key_write']; + } + + if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'PBXT')) + && ! empty($_REQUEST['new_auto_increment']) + && (! isset($auto_increment) + || $_REQUEST['new_auto_increment'] !== $auto_increment) + ) { + $table_alters[] = 'auto_increment = ' + . $GLOBALS['dbi']->escapeString($_REQUEST['new_auto_increment']); + } + + if (! empty($_REQUEST['new_row_format'])) { + $newRowFormat = $_REQUEST['new_row_format']; + $newRowFormatLower = mb_strtolower($newRowFormat); + if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'PBXT')) + && (strlen($row_format) === 0 + || $newRowFormatLower !== mb_strtolower($row_format)) + ) { + $table_alters[] = 'ROW_FORMAT = ' + . $GLOBALS['dbi']->escapeString($newRowFormat); + } + } + + return $table_alters; + } + + /** + * Get warning messages array + * + * @return array $warning_messages + */ + public static function getWarningMessagesArray() + { + $warning_messages = array(); + foreach ($GLOBALS['dbi']->getWarnings() as $warning) { + // In MariaDB 5.1.44, when altering a table from Maria to MyISAM + // and if TRANSACTIONAL was set, the system reports an error; + // I discussed with a Maria developer and he agrees that this + // should not be reported with a Level of Error, so here + // I just ignore it. But there are other 1478 messages + // that it's better to show. + if (! ($_REQUEST['new_tbl_storage_engine'] == 'MyISAM' + && $warning['Code'] == '1478' + && $warning['Level'] == 'Error') + ) { + $warning_messages[] = $warning['Level'] . ': #' . $warning['Code'] + . ' ' . $warning['Message']; + } + } + return $warning_messages; + } + + /** + * Get SQL query and result after ran this SQL query for a partition operation + * has been requested by the user + * + * @return array $sql_query, $result + */ + public static function getQueryAndResultForPartition() + { + $sql_query = 'ALTER TABLE ' + . Util::backquote($GLOBALS['table']) . ' ' + . $_REQUEST['partition_operation'] + . ' PARTITION '; + + if ($_REQUEST['partition_operation'] == 'COALESCE') { + $sql_query .= count($_REQUEST['partition_name']); + } else { + $sql_query .= implode(', ', $_REQUEST['partition_name']) . ';'; + } + + $result = $GLOBALS['dbi']->query($sql_query); + + return array($sql_query, $result); + } + + /** + * Adjust the privileges after renaming/moving a table + * + * @param string $oldDb Database name before table renaming/moving table + * @param string $oldTable Table name before table renaming/moving table + * @param string $newDb Database name after table renaming/ moving table + * @param string $newTable Table name after table renaming/moving table + * + * @return void + */ + public static function adjustPrivilegesRenameOrMoveTable($oldDb, $oldTable, $newDb, $newTable) + { + if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $GLOBALS['dbi']->selectDb('mysql'); + + // For table specific privileges + $query_table_specific = 'UPDATE ' . Util::backquote('tables_priv') + . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newDb) . '\', Table_name = \'' . $GLOBALS['dbi']->escapeString($newTable) + . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\' AND Table_name = \'' . $GLOBALS['dbi']->escapeString($oldTable) + . '\';'; + $GLOBALS['dbi']->query($query_table_specific); + + // For column specific privileges + $query_col_specific = 'UPDATE ' . Util::backquote('columns_priv') + . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newDb) . '\', Table_name = \'' . $GLOBALS['dbi']->escapeString($newTable) + . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\' AND Table_name = \'' . $GLOBALS['dbi']->escapeString($oldTable) + . '\';'; + $GLOBALS['dbi']->query($query_col_specific); + + // Finally FLUSH the new privileges + $flush_query = "FLUSH PRIVILEGES;"; + $GLOBALS['dbi']->query($flush_query); + } + } + + /** + * Adjust the privileges after copying a table + * + * @param string $oldDb Database name before table copying + * @param string $oldTable Table name before table copying + * @param string $newDb Database name after table copying + * @param string $newTable Table name after table copying + * + * @return void + */ + public static function adjustPrivilegesCopyTable($oldDb, $oldTable, $newDb, $newTable) + { + if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] + && $GLOBALS['is_reload_priv'] + ) { + $GLOBALS['dbi']->selectDb('mysql'); + + // For Table Specific privileges + $query_table_specific_old = 'SELECT * FROM ' + . Util::backquote('tables_priv') . ' where ' + . 'Db = "' . $oldDb . '" AND Table_name = "' . $oldTable . '";'; + + $old_privs_table = $GLOBALS['dbi']->fetchResult( + $query_table_specific_old, + 0 + ); + + foreach ($old_privs_table as $old_priv) { + $newDb_table_privs_query = 'INSERT INTO ' + . Util::backquote('tables_priv') . ' VALUES("' + . $old_priv[0] . '", "' . $newDb . '", "' . $old_priv[2] . '", "' + . $newTable . '", "' . $old_priv[4] . '", "' . $old_priv[5] + . '", "' . $old_priv[6] . '", "' . $old_priv[7] . '");'; + + $GLOBALS['dbi']->query($newDb_table_privs_query); + } + + // For Column Specific privileges + $query_col_specific_old = 'SELECT * FROM ' + . Util::backquote('columns_priv') . ' WHERE ' + . 'Db = "' . $oldDb . '" AND Table_name = "' . $oldTable . '";'; + + $old_privs_col = $GLOBALS['dbi']->fetchResult( + $query_col_specific_old, + 0 + ); + + foreach ($old_privs_col as $old_priv) { + $newDb_col_privs_query = 'INSERT INTO ' + . Util::backquote('columns_priv') . ' VALUES("' + . $old_priv[0] . '", "' . $newDb . '", "' . $old_priv[2] . '", "' + . $newTable . '", "' . $old_priv[4] . '", "' . $old_priv[5] + . '", "' . $old_priv[6] . '");'; + + $GLOBALS['dbi']->query($newDb_col_privs_query); + } + + // Finally FLUSH the new privileges + $flush_query = "FLUSH PRIVILEGES;"; + $GLOBALS['dbi']->query($flush_query); + } + } + + /** + * Change all collations and character sets of all columns in table + * + * @param string $db Database name + * @param string $table Table name + * @param string $tbl_collation Collation Name + * + * @return void + */ + public static function changeAllColumnsCollation($db, $table, $tbl_collation) + { + $GLOBALS['dbi']->selectDb($db); + + $change_all_collations_query = 'ALTER TABLE ' + . Util::backquote($table) + . ' CONVERT TO'; + + list($charset) = explode('_', $tbl_collation); + + $change_all_collations_query .= ' CHARACTER SET ' . $charset + . ($charset == $tbl_collation ? '' : ' COLLATE ' . $tbl_collation); + + $GLOBALS['dbi']->query($change_all_collations_query); + } + + /** + * Move or copy a table + * + * @param string $db current database name + * @param string $table current table name + * + * @return void + */ + public static function moveOrCopyTable($db, $table) + { + /** + * Selects the database to work with + */ + $GLOBALS['dbi']->selectDb($db); + + /** + * $_REQUEST['target_db'] could be empty in case we came from an input field + * (when there are many databases, no drop-down) + */ + if (empty($_REQUEST['target_db'])) { + $_REQUEST['target_db'] = $db; + } + + /** + * A target table name has been sent to this script -> do the work + */ + if (Core::isValid($_REQUEST['new_name'])) { + if ($db == $_REQUEST['target_db'] && $table == $_REQUEST['new_name']) { + if (isset($_REQUEST['submit_move'])) { + $message = Message::error(__('Can\'t move table to same one!')); + } else { + $message = Message::error(__('Can\'t copy table to same one!')); + } + } else { + Table::moveCopy( + $db, $table, $_REQUEST['target_db'], $_REQUEST['new_name'], + $_REQUEST['what'], isset($_REQUEST['submit_move']), 'one_table' + ); + + if (isset($_REQUEST['adjust_privileges']) + && ! empty($_REQUEST['adjust_privileges']) + ) { + if (isset($_REQUEST['submit_move'])) { + self::adjustPrivilegesRenameOrMoveTable( + $db, $table, $_REQUEST['target_db'], $_REQUEST['new_name'] + ); + } else { + self::adjustPrivilegesCopyTable( + $db, $table, $_REQUEST['target_db'], $_REQUEST['new_name'] + ); + } + + if (isset($_REQUEST['submit_move'])) { + $message = Message::success( + __( + 'Table %s has been moved to %s. Privileges have been ' + . 'adjusted.' + ) + ); + } else { + $message = Message::success( + __( + 'Table %s has been copied to %s. Privileges have been ' + . 'adjusted.' + ) + ); + } + + } else { + if (isset($_REQUEST['submit_move'])) { + $message = Message::success( + __('Table %s has been moved to %s.') + ); + } else { + $message = Message::success( + __('Table %s has been copied to %s.') + ); + } + } + + $old = Util::backquote($db) . '.' + . Util::backquote($table); + $message->addParam($old); + + $new_name = $_REQUEST['new_name']; + if ($GLOBALS['dbi']->getLowerCaseNames() === '1') { + $new_name = strtolower($new_name); + } + + $new = Util::backquote($_REQUEST['target_db']) . '.' + . Util::backquote($new_name); + $message->addParam($new); + + /* Check: Work on new table or on old table? */ + if (isset($_REQUEST['submit_move']) + || Core::isValid($_REQUEST['switch_to_new']) + ) { + } + } + } else { + /** + * No new name for the table! + */ + $message = Message::error(__('The table name is empty!')); + } + + $response = Response::getInstance(); + if ($response->isAjax()) { + $response->addJSON('message', $message); + if ($message->isSuccess()) { + $response->addJSON('db', $GLOBALS['db']); + } else { + $response->setRequestStatus(false); + } + exit; + } + } +} diff --git a/libraries/classes/Sql.php b/libraries/classes/Sql.php index b0fd3af63e..88a1cd0ed5 100644 --- a/libraries/classes/Sql.php +++ b/libraries/classes/Sql.php @@ -13,6 +13,7 @@ use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\DisplayResults; use PhpMyAdmin\Index; use PhpMyAdmin\Message; +use PhpMyAdmin\Operations; use PhpMyAdmin\Response; use PhpMyAdmin\SqlParser\Statements\AlterStatement; use PhpMyAdmin\SqlParser\Statements\DropStatement; @@ -23,8 +24,6 @@ use PhpMyAdmin\Transformations; use PhpMyAdmin\Url; use PhpMyAdmin\Util; -require_once 'libraries/operations.lib.php'; - /** * Sql class * @@ -2183,7 +2182,7 @@ EOT; isset($extra_data) ? $extra_data : null ); - $warning_messages = PMA_getWarningMessagesArray(); + $warning_messages = Operations::getWarningMessagesArray(); // No rows returned -> move back to the calling page if ((0 == $num_rows && 0 == $unlim_num_rows) @@ -2223,7 +2222,7 @@ EOT; Util::handleDisableFKCheckCleanup($default_fk_check); foreach ($warning_messages as $warning) { - $message = \PhpMyAdmin\Message::notice($warning); + $message = Message::notice($warning); $html_output .= $message->getDisplay(); } diff --git a/libraries/mult_submits.lib.php b/libraries/mult_submits.lib.php index c1c3b0a1a0..aee828eb70 100644 --- a/libraries/mult_submits.lib.php +++ b/libraries/mult_submits.lib.php @@ -8,10 +8,12 @@ * @package PhpMyAdmin */ +use PhpMyAdmin\Operations; use PhpMyAdmin\Sql; use PhpMyAdmin\Table; use PhpMyAdmin\Transformations; use PhpMyAdmin\Url; +use PhpMyAdmin\Util; /** * Gets url params @@ -47,7 +49,7 @@ function PMA_getUrlParams( foreach ($selected as $sval) { if ($what == 'row_delete') { $_url_params['selected'][] = 'DELETE FROM ' - . PhpMyAdmin\Util::backquote($table) + . Util::backquote($table) . ' WHERE ' . $sval . ' LIMIT 1;'; } else { $_url_params['selected'][] = $sval; @@ -116,7 +118,7 @@ function PMA_buildOrExecuteQueryForMulti( case 'drop_db': PMA_relationsCleanupDatabase($selected[$i]); $a_query = 'DROP DATABASE ' - . PhpMyAdmin\Util::backquote($selected[$i]); + . Util::backquote($selected[$i]); $reload = 1; $run_parts = true; $rebuild_database_list = true; @@ -127,104 +129,104 @@ function PMA_buildOrExecuteQueryForMulti( $current = $selected[$i]; if (!empty($views) && in_array($current, $views)) { $sql_query_views .= (empty($sql_query_views) ? 'DROP VIEW ' : ', ') - . PhpMyAdmin\Util::backquote($current); + . Util::backquote($current); } else { $sql_query .= (empty($sql_query) ? 'DROP TABLE ' : ', ') - . PhpMyAdmin\Util::backquote($current); + . Util::backquote($current); } $reload = 1; break; case 'check_tbl': $sql_query .= (empty($sql_query) ? 'CHECK TABLE ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]); + . Util::backquote($selected[$i]); $execute_query_later = true; break; case 'optimize_tbl': $sql_query .= (empty($sql_query) ? 'OPTIMIZE TABLE ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]); + . Util::backquote($selected[$i]); $execute_query_later = true; break; case 'analyze_tbl': $sql_query .= (empty($sql_query) ? 'ANALYZE TABLE ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]); + . Util::backquote($selected[$i]); $execute_query_later = true; break; case 'checksum_tbl': $sql_query .= (empty($sql_query) ? 'CHECKSUM TABLE ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]); + . Util::backquote($selected[$i]); $execute_query_later = true; break; case 'repair_tbl': $sql_query .= (empty($sql_query) ? 'REPAIR TABLE ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]); + . Util::backquote($selected[$i]); $execute_query_later = true; break; case 'empty_tbl': $deletes = true; $a_query = 'TRUNCATE '; - $a_query .= PhpMyAdmin\Util::backquote($selected[$i]); + $a_query .= Util::backquote($selected[$i]); $run_parts = true; break; case 'drop_fld': PMA_relationsCleanupColumn($db, $table, $selected[$i]); $sql_query .= (empty($sql_query) - ? 'ALTER TABLE ' . PhpMyAdmin\Util::backquote($table) + ? 'ALTER TABLE ' . Util::backquote($table) : ',') - . ' DROP ' . PhpMyAdmin\Util::backquote($selected[$i]) + . ' DROP ' . Util::backquote($selected[$i]) . (($i == $selected_cnt-1) ? ';' : ''); break; case 'primary_fld': $sql_query .= (empty($sql_query) - ? 'ALTER TABLE ' . PhpMyAdmin\Util::backquote($table) + ? 'ALTER TABLE ' . Util::backquote($table) . (empty($primary) ? '' : ' DROP PRIMARY KEY,') . ' ADD PRIMARY KEY( ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]) + . Util::backquote($selected[$i]) . (($i == $selected_cnt-1) ? ');' : ''); break; case 'index_fld': $sql_query .= (empty($sql_query) - ? 'ALTER TABLE ' . PhpMyAdmin\Util::backquote($table) + ? 'ALTER TABLE ' . Util::backquote($table) . ' ADD INDEX( ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]) + . Util::backquote($selected[$i]) . (($i == $selected_cnt-1) ? ');' : ''); break; case 'unique_fld': $sql_query .= (empty($sql_query) - ? 'ALTER TABLE ' . PhpMyAdmin\Util::backquote($table) + ? 'ALTER TABLE ' . Util::backquote($table) . ' ADD UNIQUE( ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]) + . Util::backquote($selected[$i]) . (($i == $selected_cnt-1) ? ');' : ''); break; case 'spatial_fld': $sql_query .= (empty($sql_query) - ? 'ALTER TABLE ' . PhpMyAdmin\Util::backquote($table) + ? 'ALTER TABLE ' . Util::backquote($table) . ' ADD SPATIAL( ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]) + . Util::backquote($selected[$i]) . (($i == $selected_cnt-1) ? ');' : ''); break; case 'fulltext_fld': $sql_query .= (empty($sql_query) - ? 'ALTER TABLE ' . PhpMyAdmin\Util::backquote($table) + ? 'ALTER TABLE ' . Util::backquote($table) . ' ADD FULLTEXT( ' : ', ') - . PhpMyAdmin\Util::backquote($selected[$i]) + . Util::backquote($selected[$i]) . (($i == $selected_cnt-1) ? ');' : ''); break; @@ -232,9 +234,9 @@ function PMA_buildOrExecuteQueryForMulti( $newtablename = $_POST['add_prefix'] . $selected[$i]; // ADD PREFIX TO TABLE NAME $a_query = 'ALTER TABLE ' - . PhpMyAdmin\Util::backquote($selected[$i]) + . Util::backquote($selected[$i]) . ' RENAME ' - . PhpMyAdmin\Util::backquote($newtablename); + . Util::backquote($newtablename); $run_parts = true; break; @@ -256,9 +258,9 @@ function PMA_buildOrExecuteQueryForMulti( } // CHANGE PREFIX PATTERN $a_query = 'ALTER TABLE ' - . PhpMyAdmin\Util::backquote($selected[$i]) + . Util::backquote($selected[$i]) . ' RENAME ' - . PhpMyAdmin\Util::backquote($newtablename); + . Util::backquote($newtablename); $run_parts = true; break; @@ -282,8 +284,7 @@ function PMA_buildOrExecuteQueryForMulti( $copy_tbl = true; Table::moveCopy($db, $selected[$i], $_POST['target_db'], $selected[$i], $_POST['what'], false, 'one_table'); if (isset($_POST['adjust_privileges']) && !empty($_POST['adjust_privileges'])) { - include_once 'operations.lib.php'; - PMA_AdjustPrivileges_copyTable($db, $selected[$i], $_POST['target_db'], $selected[$i]); + Operations::adjustPrivilegesCopyTable($db, $selected[$i], $_POST['target_db'], $selected[$i]); } break; } // end switch @@ -454,7 +455,7 @@ function PMA_getHtmlForOtherActions($what, $action, $_url_params, $full_query) // Display option to disable foreign key checks while dropping tables if ($what === 'drop_tbl' || $what === 'empty_tbl' || $what === 'row_delete') { $html .= '
    '; - $html .= PhpMyAdmin\Util::getFKCheckbox(); + $html .= Util::getFKCheckbox(); $html .= '
    '; } $html .= ''; $reload = true; break; @@ -512,31 +513,31 @@ function PMA_getQueryFromSelected($what, $table, $selected, $views) $current = $sval; if (!empty($views) && in_array($current, $views)) { $full_query_views .= (empty($full_query_views) ? 'DROP VIEW ' : ', ') - . PhpMyAdmin\Util::backquote(htmlspecialchars($current)); + . Util::backquote(htmlspecialchars($current)); } else { $full_query .= (empty($full_query) ? 'DROP TABLE ' : ', ') - . PhpMyAdmin\Util::backquote(htmlspecialchars($current)); + . Util::backquote(htmlspecialchars($current)); } break; case 'empty_tbl': $full_query .= 'TRUNCATE '; - $full_query .= PhpMyAdmin\Util::backquote(htmlspecialchars($sval)) + $full_query .= Util::backquote(htmlspecialchars($sval)) . ';
    '; break; case 'primary_fld': if ($full_query == '') { $full_query .= 'ALTER TABLE ' - . PhpMyAdmin\Util::backquote(htmlspecialchars($table)) + . Util::backquote(htmlspecialchars($table)) . '
      DROP PRIMARY KEY,' . '
       ADD PRIMARY KEY(' . '
         ' - . PhpMyAdmin\Util::backquote(htmlspecialchars($sval)) + . Util::backquote(htmlspecialchars($sval)) . ','; } else { $full_query .= '
         ' - . PhpMyAdmin\Util::backquote(htmlspecialchars($sval)) + . Util::backquote(htmlspecialchars($sval)) . ','; } if ($i == $selected_cnt-1) { @@ -547,10 +548,10 @@ function PMA_getQueryFromSelected($what, $table, $selected, $views) case 'drop_fld': if ($full_query == '') { $full_query .= 'ALTER TABLE ' - . PhpMyAdmin\Util::backquote(htmlspecialchars($table)); + . Util::backquote(htmlspecialchars($table)); } $full_query .= '
      DROP ' - . PhpMyAdmin\Util::backquote(htmlspecialchars($sval)) + . Util::backquote(htmlspecialchars($sval)) . ','; if ($i == $selected_cnt - 1) { $full_query = preg_replace('@,$@', ';
    ', $full_query); diff --git a/libraries/operations.lib.php b/libraries/operations.lib.php deleted file mode 100644 index f5a57dc5c0..0000000000 --- a/libraries/operations.lib.php +++ /dev/null @@ -1,2121 +0,0 @@ -' - . '
    ' - . Url::getHiddenInputs($db) - . '
    ' - . ''; - if (Util::showIcons('ActionLinksMode')) { - $html_output .= Util::getImage('b_comment.png') . ' '; - } - $html_output .= __('Database comment'); - $html_output .= ''; - $html_output .= '' - . '
    '; - $html_output .= '
    ' - . '' - . '
    ' - . '
    ' - . ''; - - return $html_output; -} - -/** - * Get HTML output for rename database - * - * @param string $db database name - * - * @return string $html_output - */ -function PMA_getHtmlForRenameDatabase($db) -{ - $html_output = '
    ' - . '
    '; - if (isset($_REQUEST['db_collation'])) { - $html_output .= '' . "\n"; - } - $html_output .= '' - . '' - . Url::getHiddenInputs($db) - . '
    ' - . ''; - - if (Util::showIcons('ActionLinksMode')) { - $html_output .= Util::getImage('b_edit.png') . ' '; - } - $html_output .= __('Rename database to') - . ''; - - $html_output .= ''; - $html_output .= '
    '; - - if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] - && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $html_output .= ''; - } else { - $html_output .= ''; - } - - $html_output .= '
    '; - - $html_output .= '' - . '
    ' - . '
    ' - . '' - . '
    ' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get HTML for database drop link - * - * @param string $db database name - * - * @return string $html_output - */ -function PMA_getHtmlForDropDatabaseLink($db) -{ - $this_sql_query = 'DROP DATABASE ' . Util::backquote($db); - $this_url_params = array( - 'sql_query' => $this_sql_query, - 'back' => 'db_operations.php', - 'goto' => 'index.php', - 'reload' => '1', - 'purge' => '1', - 'message_to_show' => sprintf( - __('Database %s has been dropped.'), - htmlspecialchars(Util::backquote($db)) - ), - 'db' => null, - ); - - $html_output = '
    ' - . '
    '; - $html_output .= ''; - if (Util::showIcons('ActionLinksMode')) { - $html_output .= Util::getImage('b_deltbl.png') . ' '; - } - $html_output .= __('Remove database') - . ''; - $html_output .= '
      '; - $html_output .= PMA_getDeleteDataOrTablelink( - $this_url_params, - 'DROP_DATABASE', - __('Drop the database (DROP)'), - 'drop_db_anchor' - ); - $html_output .= '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get HTML snippet for copy database - * - * @param string $db database name - * - * @return string $html_output - */ -function PMA_getHtmlForCopyDatabase($db) -{ - $drop_clause = 'DROP TABLE / DROP VIEW'; - $choices = array( - 'structure' => __('Structure only'), - 'data' => __('Structure and data'), - 'dataonly' => __('Data only') - ); - - if (isset($_COOKIE) - && isset($_COOKIE['pma_switch_to_new']) - && $_COOKIE['pma_switch_to_new'] == 'true' - ) { - $pma_switch_to_new = 'true'; - } - - $html_output = '
    '; - $html_output .= '
    '; - - if (isset($_REQUEST['db_collation'])) { - $html_output .= '' . "\n"; - } - $html_output .= '' . "\n" - . Url::getHiddenInputs($db); - $html_output .= '
    ' - . ''; - - if (Util::showIcons('ActionLinksMode')) { - $html_output .= Util::getImage('b_edit.png') . ' '; - } - $html_output .= __('Copy database to') - . '' - . '
    ' - . Util::getRadioFields( - 'what', $choices, 'data', true - ); - $html_output .= '
    '; - $html_output .= ''; - $html_output .= '
    '; - $html_output .= ''; - $html_output .= '
    '; - $html_output .= ''; - $html_output .= '
    '; - $html_output .= ''; - $html_output .= '
    '; - $html_output .= '
    '; - - if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] - && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $html_output .= ''; - } else { - $html_output .= ''; - } - $html_output .= '
    '; - - $html_output .= ''; - $html_output .= '' - . '
    '; - $html_output .= '
    ' - . '' - . '
    ' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get HTML snippet for change database charset - * - * @param string $db database name - * @param string $table table name - * - * @return string $html_output - */ -function PMA_getHtmlForChangeDatabaseCharset($db, $table) -{ - $html_output = '
    ' - . '
    '; - if (Util::showIcons('ActionLinksMode')) { - $html_output .= Util::getImage('s_asci.png') . ' '; - } - $html_output .= '' . "\n" - . '' . "\n" - . Charsets::getCollationDropdownBox( - 'db_collation', - 'select_db_collation', - isset($_REQUEST['db_collation']) ? $_REQUEST['db_collation'] : '', - false - ) - . '' - . '
    ' - . '' . "\n" - . '
    ' . "\n" - . '
    ' . "\n"; - - return $html_output; -} - -/** - * Run the Procedure definitions and function definitions - * - * to avoid selecting alternatively the current and new db - * we would need to modify the CREATE definitions to qualify - * the db name - * - * @param string $db database name - * - * @return void - */ -function PMA_runProcedureAndFunctionDefinitions($db) -{ - $procedure_names = $GLOBALS['dbi']->getProceduresOrFunctions($db, 'PROCEDURE'); - if ($procedure_names) { - foreach ($procedure_names as $procedure_name) { - $GLOBALS['dbi']->selectDb($db); - $tmp_query = $GLOBALS['dbi']->getDefinition( - $db, 'PROCEDURE', $procedure_name - ); - // collect for later display - $GLOBALS['sql_query'] .= "\n" . $tmp_query; - $GLOBALS['dbi']->selectDb($_REQUEST['newname']); - $GLOBALS['dbi']->query($tmp_query); - } - } - - $function_names = $GLOBALS['dbi']->getProceduresOrFunctions($db, 'FUNCTION'); - if ($function_names) { - foreach ($function_names as $function_name) { - $GLOBALS['dbi']->selectDb($db); - $tmp_query = $GLOBALS['dbi']->getDefinition( - $db, 'FUNCTION', $function_name - ); - // collect for later display - $GLOBALS['sql_query'] .= "\n" . $tmp_query; - $GLOBALS['dbi']->selectDb($_REQUEST['newname']); - $GLOBALS['dbi']->query($tmp_query); - } - } -} - -/** - * Create database before copy - * - * @return void - */ -function PMA_createDbBeforeCopy() -{ - // lower_case_table_names=1 `DB` becomes `db` - if ($GLOBALS['dbi']->getLowerCaseNames() === '1') { - $_REQUEST['newname'] = mb_strtolower( - $_REQUEST['newname'] - ); - } - - $local_query = 'CREATE DATABASE IF NOT EXISTS ' - . Util::backquote($_REQUEST['newname']); - if (isset($_REQUEST['db_collation'])) { - $local_query .= ' DEFAULT' - . Util::getCharsetQueryPart($_REQUEST['db_collation']); - } - $local_query .= ';'; - $GLOBALS['sql_query'] .= $local_query; - - // save the original db name because Tracker.php which - // may be called under $GLOBALS['dbi']->query() changes $GLOBALS['db'] - // for some statements, one of which being CREATE DATABASE - $original_db = $GLOBALS['db']; - $GLOBALS['dbi']->query($local_query); - $GLOBALS['db'] = $original_db; - - // Set the SQL mode to NO_AUTO_VALUE_ON_ZERO to prevent MySQL from creating - // export statements it cannot import - $sql_set_mode = "SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO'"; - $GLOBALS['dbi']->query($sql_set_mode); - - // rebuild the database list because Table::moveCopy - // checks in this list if the target db exists - $GLOBALS['dblist']->databases->build(); -} - -/** - * Get views as an array and create SQL view stand-in - * - * @param array $tables_full array of all tables in given db or dbs - * @param ExportSql $export_sql_plugin export plugin instance - * @param string $db database name - * - * @return array $views - */ -function PMA_getViewsAndCreateSqlViewStandIn( - $tables_full, $export_sql_plugin, $db -) { - $views = array(); - foreach ($tables_full as $each_table => $tmp) { - // to be able to rename a db containing views, - // first all the views are collected and a stand-in is created - // the real views are created after the tables - if ($GLOBALS['dbi']->getTable($db, $each_table)->isView()) { - - // If view exists, and 'add drop view' is selected: Drop it! - if ($_REQUEST['what'] != 'nocopy' - && isset($_REQUEST['drop_if_exists']) - && $_REQUEST['drop_if_exists'] == 'true' - ) { - $drop_query = 'DROP VIEW IF EXISTS ' - . Util::backquote($_REQUEST['newname']) . '.' - . Util::backquote($each_table); - $GLOBALS['dbi']->query($drop_query); - - $GLOBALS['sql_query'] .= "\n" . $drop_query . ';'; - } - - $views[] = $each_table; - // Create stand-in definition to resolve view dependencies - $sql_view_standin = $export_sql_plugin->getTableDefStandIn( - $db, $each_table, "\n" - ); - $GLOBALS['dbi']->selectDb($_REQUEST['newname']); - $GLOBALS['dbi']->query($sql_view_standin); - $GLOBALS['sql_query'] .= "\n" . $sql_view_standin; - } - } - return $views; -} - -/** - * Get sql query for copy/rename table and boolean for whether copy/rename or not - * - * @param array $tables_full array of all tables in given db or dbs - * @param boolean $move whether database name is empty or not - * @param string $db database name - * - * @return array SQL queries for the constraints - */ -function PMA_copyTables($tables_full, $move, $db) -{ - $sqlContraints = array(); - foreach ($tables_full as $each_table => $tmp) { - // skip the views; we have created stand-in definitions - if ($GLOBALS['dbi']->getTable($db, $each_table)->isView()) { - continue; - } - - // value of $what for this table only - $this_what = $_REQUEST['what']; - - // do not copy the data from a Merge table - // note: on the calling FORM, 'data' means 'structure and data' - if ($GLOBALS['dbi']->getTable($db, $each_table)->isMerge()) { - if ($this_what == 'data') { - $this_what = 'structure'; - } - if ($this_what == 'dataonly') { - $this_what = 'nocopy'; - } - } - - if ($this_what != 'nocopy') { - // keep the triggers from the original db+table - // (third param is empty because delimiters are only intended - // for importing via the mysql client or our Import feature) - $triggers = $GLOBALS['dbi']->getTriggers($db, $each_table, ''); - - if (! Table::moveCopy( - $db, $each_table, $_REQUEST['newname'], $each_table, - (isset($this_what) ? $this_what : 'data'), - $move, 'db_copy' - )) { - $GLOBALS['_error'] = true; - break; - } - // apply the triggers to the destination db+table - if ($triggers) { - $GLOBALS['dbi']->selectDb($_REQUEST['newname']); - foreach ($triggers as $trigger) { - $GLOBALS['dbi']->query($trigger['create']); - $GLOBALS['sql_query'] .= "\n" . $trigger['create'] . ';'; - } - } - - // this does not apply to a rename operation - if (isset($_REQUEST['add_constraints']) - && ! empty($GLOBALS['sql_constraints_query']) - ) { - $sqlContraints[] = $GLOBALS['sql_constraints_query']; - unset($GLOBALS['sql_constraints_query']); - } - } - } - return $sqlContraints; -} - -/** - * Run the EVENT definition for selected database - * - * to avoid selecting alternatively the current and new db - * we would need to modify the CREATE definitions to qualify - * the db name - * - * @param string $db database name - * - * @return void - */ -function PMA_runEventDefinitionsForDb($db) -{ - $event_names = $GLOBALS['dbi']->fetchResult( - 'SELECT EVENT_NAME FROM information_schema.EVENTS WHERE EVENT_SCHEMA= \'' - . $GLOBALS['dbi']->escapeString($db) . '\';' - ); - if ($event_names) { - foreach ($event_names as $event_name) { - $GLOBALS['dbi']->selectDb($db); - $tmp_query = $GLOBALS['dbi']->getDefinition($db, 'EVENT', $event_name); - // collect for later display - $GLOBALS['sql_query'] .= "\n" . $tmp_query; - $GLOBALS['dbi']->selectDb($_REQUEST['newname']); - $GLOBALS['dbi']->query($tmp_query); - } - } -} - -/** - * Handle the views, return the boolean value whether table rename/copy or not - * - * @param array $views views as an array - * @param boolean $move whether database name is empty or not - * @param string $db database name - * - * @return void - */ -function PMA_handleTheViews($views, $move, $db) -{ - // temporarily force to add DROP IF EXIST to CREATE VIEW query, - // to remove stand-in VIEW that was created earlier - // ( $_REQUEST['drop_if_exists'] is used in moveCopy() ) - if (isset($_REQUEST['drop_if_exists'])) { - $temp_drop_if_exists = $_REQUEST['drop_if_exists']; - } - - $_REQUEST['drop_if_exists'] = 'true'; - foreach ($views as $view) { - $copying_succeeded = Table::moveCopy( - $db, $view, $_REQUEST['newname'], $view, 'structure', $move, 'db_copy' - ); - if (! $copying_succeeded) { - $GLOBALS['_error'] = true; - break; - } - } - unset($_REQUEST['drop_if_exists']); - - if (isset($temp_drop_if_exists)) { - // restore previous value - $_REQUEST['drop_if_exists'] = $temp_drop_if_exists; - } -} - -/** - * Adjust the privileges after Renaming the db - * - * @param string $oldDb Database name before renaming - * @param string $newname New Database name requested - * - * @return void - */ -function PMA_AdjustPrivileges_moveDB($oldDb, $newname) -{ - if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] - && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $GLOBALS['dbi']->selectDb('mysql'); - $newname = str_replace("_", "\_", $newname); - $oldDb = str_replace("_", "\_", $oldDb); - - // For Db specific privileges - $query_db_specific = 'UPDATE ' . Util::backquote('db') - . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) - . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; - $GLOBALS['dbi']->query($query_db_specific); - - // For table specific privileges - $query_table_specific = 'UPDATE ' . Util::backquote('tables_priv') - . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) - . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; - $GLOBALS['dbi']->query($query_table_specific); - - // For column specific privileges - $query_col_specific = 'UPDATE ' . Util::backquote('columns_priv') - . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) - . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; - $GLOBALS['dbi']->query($query_col_specific); - - // For procedures specific privileges - $query_proc_specific = 'UPDATE ' . Util::backquote('procs_priv') - . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newname) - . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\';'; - $GLOBALS['dbi']->query($query_proc_specific); - - // Finally FLUSH the new privileges - $flush_query = "FLUSH PRIVILEGES;"; - $GLOBALS['dbi']->query($flush_query); - } -} - -/** - * Adjust the privileges after Copying the db - * - * @param string $oldDb Database name before copying - * @param string $newname New Database name requested - * - * @return void - */ -function PMA_AdjustPrivileges_copyDB($oldDb, $newname) -{ - if ($GLOBALS['db_priv'] && $GLOBALS['table_priv'] - && $GLOBALS['col_priv'] && $GLOBALS['proc_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $GLOBALS['dbi']->selectDb('mysql'); - $newname = str_replace("_", "\_", $newname); - $oldDb = str_replace("_", "\_", $oldDb); - - $query_db_specific_old = 'SELECT * FROM ' - . Util::backquote('db') . ' WHERE ' - . 'Db = "' . $oldDb . '";'; - - $old_privs_db = $GLOBALS['dbi']->fetchResult($query_db_specific_old, 0); - - foreach ($old_privs_db as $old_priv) { - $newDb_db_privs_query = 'INSERT INTO ' . Util::backquote('db') - . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' - . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] - . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '", "' - . $old_priv[7] . '", "' . $old_priv[8] . '", "' . $old_priv[9] - . '", "' . $old_priv[10] . '", "' . $old_priv[11] . '", "' - . $old_priv[12] . '", "' . $old_priv[13] . '", "' . $old_priv[14] - . '", "' . $old_priv[15] . '", "' . $old_priv[16] . '", "' - . $old_priv[17] . '", "' . $old_priv[18] . '", "' . $old_priv[19] - . '", "' . $old_priv[20] . '", "' . $old_priv[21] . '");'; - - $GLOBALS['dbi']->query($newDb_db_privs_query); - } - - // For Table Specific privileges - $query_table_specific_old = 'SELECT * FROM ' - . Util::backquote('tables_priv') . ' WHERE ' - . 'Db = "' . $oldDb . '";'; - - $old_privs_table = $GLOBALS['dbi']->fetchResult( - $query_table_specific_old, - 0 - ); - - foreach ($old_privs_table as $old_priv) { - $newDb_table_privs_query = 'INSERT INTO ' . Util::backquote( - 'tables_priv' - ) . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' - . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] - . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '", "' - . $old_priv[7] . '");'; - - $GLOBALS['dbi']->query($newDb_table_privs_query); - } - - // For Column Specific privileges - $query_col_specific_old = 'SELECT * FROM ' - . Util::backquote('columns_priv') . ' WHERE ' - . 'Db = "' . $oldDb . '";'; - - $old_privs_col = $GLOBALS['dbi']->fetchResult( - $query_col_specific_old, - 0 - ); - - foreach ($old_privs_col as $old_priv) { - $newDb_col_privs_query = 'INSERT INTO ' . Util::backquote( - 'columns_priv' - ) . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' - . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] - . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '");'; - - $GLOBALS['dbi']->query($newDb_col_privs_query); - } - - // For Procedure Specific privileges - $query_proc_specific_old = 'SELECT * FROM ' - . Util::backquote('procs_priv') . ' WHERE ' - . 'Db = "' . $oldDb . '";'; - - $old_privs_proc = $GLOBALS['dbi']->fetchResult( - $query_proc_specific_old, - 0 - ); - - foreach ($old_privs_proc as $old_priv) { - $newDb_proc_privs_query = 'INSERT INTO ' . Util::backquote( - 'procs_priv' - ) . ' VALUES("' . $old_priv[0] . '", "' . $newname . '", "' - . $old_priv[2] . '", "' . $old_priv[3] . '", "' . $old_priv[4] - . '", "' . $old_priv[5] . '", "' . $old_priv[6] . '", "' - . $old_priv[7] . '");'; - - $GLOBALS['dbi']->query($newDb_proc_privs_query); - } - - // Finally FLUSH the new privileges - $flush_query = "FLUSH PRIVILEGES;"; - $GLOBALS['dbi']->query($flush_query); - } -} - -/** - * Create all accumulated constraints - * - * @param array $sqlConstratints array of sql constraints for the database - * - * @return void - */ -function PMA_createAllAccumulatedConstraints($sqlConstratints) -{ - $GLOBALS['dbi']->selectDb($_REQUEST['newname']); - foreach ($sqlConstratints as $one_query) { - $GLOBALS['dbi']->query($one_query); - // and prepare to display them - $GLOBALS['sql_query'] .= "\n" . $one_query; - } -} - -/** - * Duplicate the bookmarks for the db (done once for each db) - * - * @param boolean $_error whether table rename/copy or not - * @param string $db database name - * - * @return void - */ -function PMA_duplicateBookmarks($_error, $db) -{ - if (! $_error && $db != $_REQUEST['newname']) { - $get_fields = array('user', 'label', 'query'); - $where_fields = array('dbase' => $db); - $new_fields = array('dbase' => $_REQUEST['newname']); - Table::duplicateInfo( - 'bookmarkwork', 'bookmark', $get_fields, - $where_fields, $new_fields - ); - } -} - -/** - * Get the HTML snippet for order the table - * - * @param array $columns columns array - * - * @return string $html_out - */ -function PMA_getHtmlForOrderTheTable($columns) -{ - $html_output = '
    '; - $html_output .= '
    '; - $html_output .= Url::getHiddenInputs( - $GLOBALS['db'], $GLOBALS['table'] - ); - $html_output .= '
    ' - . '' . __('Alter table order by') . '' - . ' ' . __('(singly)') . ' ' - . '
    ' - . '' - . '' - . '' - . '' - . '
    ' - . '
    ' - . '' - . '' - . '
    ' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get the HTML snippet for move table - * - * @return string $html_output - */ -function PMA_getHtmlForMoveTable() -{ - $html_output = '
    '; - $html_output .= '
    ' - . Url::getHiddenInputs($GLOBALS['db'], $GLOBALS['table']); - - $html_output .= '' - . '' - . '
    '; - - $html_output .= '' . __('Move table to (database.table)') - . ''; - - if (count($GLOBALS['dblist']->databases) > $GLOBALS['cfg']['MaxDbList']) { - $html_output .= ''; - } else { - $html_output .= ''; - } - $html_output .= ' . '; - $html_output .= '
    '; - - // starting with MySQL 5.0.24, SHOW CREATE TABLE includes the AUTO_INCREMENT - // next value but users can decide if they want it or not for the operation - - $html_output .= '' - . '
    '; - - if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $html_output .= ''; - } else { - $html_output .= ''; - } - $html_output .= '
    '; - - $html_output .= '
    ' - . '' - . '
    ' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get the HTML div for Table option - * - * @param Table $pma_table Table object - * @param string $comment Comment - * @param array $tbl_collation table collation - * @param string $tbl_storage_engine table storage engine - * @param string $pack_keys pack keys - * @param string $auto_increment value of auto increment - * @param string $delay_key_write delay key write - * @param string $transactional value of transactional - * @param string $page_checksum value of page checksum - * @param string $checksum the checksum - * - * @return string $html_output - */ -function PMA_getTableOptionDiv($pma_table, $comment, $tbl_collation, $tbl_storage_engine, - $pack_keys, $auto_increment, $delay_key_write, - $transactional, $page_checksum, $checksum -) { - $html_output = '
    '; - $html_output .= '
    ' - . '' - . '' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get HTML for the rename table part of table options - * - * @return string $html_output - */ -function PMA_getHtmlForRenameTable() -{ - $html_output = '' . __('Rename table to') . '' - . '' - . '' - . '' - . ''; - - if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $html_output .= ''; - } else { - $html_output .= ''; - } - $html_output .= ''; - - $html_output .= ''; - return $html_output; -} - -/** - * Get HTML for the table comments part of table options - * - * @param string $current_value of the table comments - * - * @return string $html_output - */ -function PMA_getHtmlForTableComments($current_value) -{ - $commentLength = $GLOBALS['dbi']->getVersion() >= 50503 ? 2048 : 60; - $html_output = '' . __('Table comments') . '' - . '' - . '' - . '' - . ''; - - return $html_output; -} - -/** - * Get HTML for the PACK KEYS part of table options - * - * @param string $current_value of the pack keys option - * - * @return string $html_output - */ -function PMA_getHtmlForPackKeys($current_value) -{ - $html_output = '' - . '' - . '' - . '' - . ''; - - if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'ISAM'))) { - $html_output .= PMA_getHtmlForPackKeys($pack_keys); - } // end if (MYISAM|ISAM) - - if ($pma_table->isEngine(array('MYISAM', 'ARIA'))) { - $html_output .= PMA_getHtmlForTableRow( - 'new_checksum', - 'CHECKSUM', - $checksum - ); - - $html_output .= PMA_getHtmlForTableRow( - 'new_delay_key_write', - 'DELAY_KEY_WRITE', - $delay_key_write - ); - } // end if (MYISAM) - - if ($pma_table->isEngine('ARIA')) { - $html_output .= PMA_getHtmlForTableRow( - 'new_transactional', - 'TRANSACTIONAL', - $transactional - ); - - $html_output .= PMA_getHtmlForTableRow( - 'new_page_checksum', - 'PAGE_CHECKSUM', - $page_checksum - ); - } // end if (ARIA) - - if (strlen($auto_increment) > 0 - && $pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'PBXT')) - ) { - $html_output .= '' - . '' - . '' - . ' '; - } // end if (MYISAM|INNODB) - - $possible_row_formats = PMA_getPossibleRowFormat(); - - // for MYISAM there is also COMPRESSED but it can be set only by the - // myisampack utility, so don't offer here the choice because if we - // try it inside an ALTER TABLE, MySQL (at least in 5.1.23-maria) - // does not return a warning - // (if the table was compressed, it can be seen on the Structure page) - - if (isset($possible_row_formats[$tbl_storage_engine])) { - $current_row_format - = mb_strtoupper($GLOBALS['showtable']['Row_format']); - $html_output .= '' - . '' - . ''; - $html_output .= Util::getDropdown( - 'new_row_format', $possible_row_formats[$tbl_storage_engine], - $current_row_format, 'new_row_format' - ); - $html_output .= ''; - } - $html_output .= '' - . ''; - - return $html_output; -} - -/** - * Get the common HTML table row (tr) for new_checksum, new_delay_key_write, - * new_transactional and new_page_checksum - * - * @param string $attribute class, name and id attribute - * @param string $label label value - * @param string $val checksum, delay_key_write, transactional, page_checksum - * - * @return string $html_output - */ -function PMA_getHtmlForTableRow($attribute, $label, $val) -{ - return '' - . '' - . '' - . '' - . '' - . '' - . '' - . ''; -} - -/** - * Get array of possible row formats - * - * @return array $possible_row_formats - */ -function PMA_getPossibleRowFormat() -{ - // the outer array is for engines, the inner array contains the dropdown - // option values as keys then the dropdown option labels - - $possible_row_formats = array( - 'ARCHIVE' => array( - 'COMPRESSED' => 'COMPRESSED', - ), - 'ARIA' => array( - 'FIXED' => 'FIXED', - 'DYNAMIC' => 'DYNAMIC', - 'PAGE' => 'PAGE' - ), - 'MARIA' => array( - 'FIXED' => 'FIXED', - 'DYNAMIC' => 'DYNAMIC', - 'PAGE' => 'PAGE' - ), - 'MYISAM' => array( - 'FIXED' => 'FIXED', - 'DYNAMIC' => 'DYNAMIC' - ), - 'PBXT' => array( - 'FIXED' => 'FIXED', - 'DYNAMIC' => 'DYNAMIC' - ), - 'INNODB' => array( - 'COMPACT' => 'COMPACT', - 'REDUNDANT' => 'REDUNDANT' - ) - ); - - /** @var Innodb $innodbEnginePlugin */ - $innodbEnginePlugin = StorageEngine::getEngine('Innodb'); - $innodbPluginVersion = $innodbEnginePlugin->getInnodbPluginVersion(); - if (!empty($innodbPluginVersion)) { - $innodb_file_format = $innodbEnginePlugin->getInnodbFileFormat(); - } else { - $innodb_file_format = ''; - } - if ('Barracuda' == $innodb_file_format - && $innodbEnginePlugin->supportsFilePerTable() - ) { - $possible_row_formats['INNODB']['DYNAMIC'] = 'DYNAMIC'; - $possible_row_formats['INNODB']['COMPRESSED'] = 'COMPRESSED'; - } - - return $possible_row_formats; -} - -/** - * Get HTML div for copy table - * - * @return string $html_output - */ -function PMA_getHtmlForCopytable() -{ - $html_output = '
    '; - $html_output .= '
    ' - . Url::getHiddenInputs($GLOBALS['db'], $GLOBALS['table']) - . ''; - - $html_output .= '
    '; - $html_output .= '' - . __('Copy table to (database.table)') . ''; - - if (count($GLOBALS['dblist']->databases) > $GLOBALS['cfg']['MaxDbList']) { - $html_output .= ''; - } else { - $html_output .= ''; - } - $html_output .= ' . '; - $html_output .= '
    '; - - $choices = array( - 'structure' => __('Structure only'), - 'data' => __('Structure and data'), - 'dataonly' => __('Data only') - ); - - $html_output .= Util::getRadioFields( - 'what', $choices, 'data', true - ); - $html_output .= '
    '; - - $html_output .= '' - . '
    ' - . '' - . '
    '; - - // display "Add constraints" choice only if there are - // foreign keys - if (PMA_getForeigners($GLOBALS['db'], $GLOBALS['table'], '', 'foreign')) { - $html_output .= ''; - $html_output .= '
    '; - } // endif - - $html_output .= '
    '; - - if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $html_output .= ''; - } else { - $html_output .= ''; - } - $html_output .= '
    '; - - if (isset($_COOKIE['pma_switch_to_new']) - && $_COOKIE['pma_switch_to_new'] == 'true' - ) { - $pma_switch_to_new = 'true'; - } - - $html_output .= ''); - $html_output .= '' - . '
    '; - - $html_output .= '
    ' - . '' - . '
    ' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get HTML snippet for table maintenance - * - * @param Table $pma_table Table object - * @param array $url_params array of URL parameters - * - * @return string $html_output - */ -function PMA_getHtmlForTableMaintenance($pma_table, $url_params) -{ - $html_output = '
    '; - $html_output .= '
    ' - . '' . __('Table maintenance') . ''; - $html_output .= '
      '; - - // Note: BERKELEY (BDB) is no longer supported, starting with MySQL 5.1 - $html_output .= PMA_getListofMaintainActionLink($pma_table, $url_params); - - $html_output .= '
    ' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get HTML 'li' having a link of maintain action - * - * @param Table $pma_table Table object - * @param array $url_params Array of URL parameters - * - * @return string $html_output - */ -function PMA_getListofMaintainActionLink($pma_table, $url_params) -{ - $html_output = ''; - - // analyze table - if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'BERKELEYDB', 'TOKUDB'))) { - $params = array( - 'sql_query' => 'ANALYZE TABLE ' - . Util::backquote($GLOBALS['table']), - 'table_maintenance' => 'Go', - ); - $html_output .= PMA_getMaintainActionlink( - __('Analyze table'), - $params, - $url_params, - 'ANALYZE_TABLE' - ); - } - - // check table - if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'TOKUDB'))) { - $params = array( - 'sql_query' => 'CHECK TABLE ' - . Util::backquote($GLOBALS['table']), - 'table_maintenance' => 'Go', - ); - $html_output .= PMA_getMaintainActionlink( - __('Check table'), - $params, - $url_params, - 'CHECK_TABLE' - ); - } - - // checksum table - $params = array( - 'sql_query' => 'CHECKSUM TABLE ' - . Util::backquote($GLOBALS['table']), - 'table_maintenance' => 'Go', - ); - $html_output .= PMA_getMaintainActionlink( - __('Checksum table'), - $params, - $url_params, - 'CHECKSUM_TABLE' - ); - - // defragment table - if ($pma_table->isEngine(array('INNODB'))) { - $params = array( - 'sql_query' => 'ALTER TABLE ' - . Util::backquote($GLOBALS['table']) - . ' ENGINE = InnoDB;' - ); - $html_output .= PMA_getMaintainActionlink( - __('Defragment table'), - $params, - $url_params, - 'InnoDB_File_Defragmenting' - ); - } - - // flush table - $params = array( - 'sql_query' => 'FLUSH TABLE ' - . Util::backquote($GLOBALS['table']), - 'message_to_show' => sprintf( - __('Table %s has been flushed.'), - htmlspecialchars($GLOBALS['table']) - ), - 'reload' => 1, - ); - $html_output .= PMA_getMaintainActionlink( - __('Flush the table (FLUSH)'), - $params, - $url_params, - 'FLUSH' - ); - - // optimize table - if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'BERKELEYDB', 'TOKUDB'))) { - $params = array( - 'sql_query' => 'OPTIMIZE TABLE ' - . Util::backquote($GLOBALS['table']), - 'table_maintenance' => 'Go', - ); - $html_output .= PMA_getMaintainActionlink( - __('Optimize table'), - $params, - $url_params, - 'OPTIMIZE_TABLE' - ); - } - - // repair table - if ($pma_table->isEngine(array('MYISAM', 'ARIA'))) { - $params = array( - 'sql_query' => 'REPAIR TABLE ' - . Util::backquote($GLOBALS['table']), - 'table_maintenance' => 'Go', - ); - $html_output .= PMA_getMaintainActionlink( - __('Repair table'), - $params, - $url_params, - 'REPAIR_TABLE' - ); - } - - return $html_output; -} - -/** - * Get maintain action HTML link - * - * @param string $action_message action message - * @param array $params url parameters array - * @param array $url_params additional url parameters - * @param string $link contains name of page/anchor that is being linked - * - * @return string $html_output - */ -function PMA_getMaintainActionlink($action_message, $params, $url_params, $link) -{ - return '
  • ' - . '' - . $action_message - . '' - . Util::showMySQLDocu($link) - . '
  • '; -} - -/** - * Get HTML for Delete data or table (truncate table, drop table) - * - * @param array $truncate_table_url_params url parameter array for truncate table - * @param array $dropTableUrlParams url parameter array for drop table - * - * @return string $html_output - */ -function PMA_getHtmlForDeleteDataOrTable( - $truncate_table_url_params, - $dropTableUrlParams -) { - $html_output = '
    ' - . '
    ' - . '' . __('Delete data or table') . ''; - - $html_output .= '
      '; - - if (! empty($truncate_table_url_params)) { - $html_output .= PMA_getDeleteDataOrTablelink( - $truncate_table_url_params, - 'TRUNCATE_TABLE', - __('Empty the table (TRUNCATE)'), - 'truncate_tbl_anchor' - ); - } - if (!empty($dropTableUrlParams)) { - $html_output .= PMA_getDeleteDataOrTablelink( - $dropTableUrlParams, - 'DROP_TABLE', - __('Delete the table (DROP)'), - 'drop_tbl_anchor' - ); - } - $html_output .= '
    '; - - return $html_output; -} - -/** - * Get the HTML link for Truncate table, Drop table and Drop db - * - * @param array $url_params url parameter array for delete data or table - * @param string $syntax TRUNCATE_TABLE or DROP_TABLE or DROP_DATABASE - * @param string $link link to be shown - * @param string $htmlId id of the link - * - * @return String html output - */ -function PMA_getDeleteDataOrTablelink($url_params, $syntax, $link, $htmlId) -{ - return '
  • ' - . $link . '' - . Util::showMySQLDocu($syntax) - . '
  • '; -} - -/** - * Get HTML snippet for partition maintenance - * - * @param array $partition_names array of partition names for a specific db/table - * @param array $url_params url parameters - * - * @return string $html_output - */ -function PMA_getHtmlForPartitionMaintenance($partition_names, $url_params) -{ - $choices = array( - 'ANALYZE' => __('Analyze'), - 'CHECK' => __('Check'), - 'OPTIMIZE' => __('Optimize'), - 'REBUILD' => __('Rebuild'), - 'REPAIR' => __('Repair'), - 'TRUNCATE' => __('Truncate') - ); - - $partition_method = Partition::getPartitionMethod( - $GLOBALS['db'], $GLOBALS['table'] - ); - // add COALESCE or DROP option to choices array depeding on Partition method - if ($partition_method == 'RANGE' - || $partition_method == 'RANGE COLUMNS' - || $partition_method == 'LIST' - || $partition_method == 'LIST COLUMNS' - ) { - $choices['DROP'] = __('Drop'); - } else { - $choices['COALESCE'] = __('Coalesce'); - } - - $html_output = '
    ' - . '
    ' - . Url::getHiddenInputs($GLOBALS['db'], $GLOBALS['table']) - . '
    ' - . '' - . __('Partition maintenance') - . Util::showMySQLDocu('partitioning_maintenance') - . ''; - - $html_select = '' . "\n"; - $html_output .= sprintf(__('Partition %s'), $html_select); - - $html_output .= '
    '; - $html_output .= Util::getRadioFields( - 'partition_operation', $choices, 'ANALYZE', false, true, 'floatleft' - ); - $this_url_params = array_merge( - $url_params, - array( - 'sql_query' => 'ALTER TABLE ' - . Util::backquote($GLOBALS['table']) - . ' REMOVE PARTITIONING;' - ) - ); - $html_output .= '

    '; - - $html_output .= '' - . __('Remove partitioning') . ''; - - $html_output .= '
    ' - . '
    ' - . '' - . '' - . '
    ' - . '
    ' - . '
    '; - - return $html_output; -} - -/** - * Get the HTML for Referential Integrity check - * - * @param array $foreign all Relations to foreign tables for a given table - * or optionally a given column in a table - * @param array $url_params array of url parameters - * - * @return string $html_output - */ -function PMA_getHtmlForReferentialIntegrityCheck($foreign, $url_params) -{ - $html_output = '
    ' - . '
    ' - . '' . __('Check referential integrity:') . ''; - - $html_output .= '
      '; - - foreach ($foreign as $master => $arr) { - $join_query = 'SELECT ' - . Util::backquote($GLOBALS['table']) . '.*' - . ' FROM ' . Util::backquote($GLOBALS['table']) - . ' LEFT JOIN ' - . Util::backquote($arr['foreign_db']) - . '.' - . Util::backquote($arr['foreign_table']); - if ($arr['foreign_table'] == $GLOBALS['table']) { - $foreign_table = $GLOBALS['table'] . '1'; - $join_query .= ' AS ' . Util::backquote($foreign_table); - } else { - $foreign_table = $arr['foreign_table']; - } - $join_query .= ' ON ' - . Util::backquote($GLOBALS['table']) . '.' - . Util::backquote($master) - . ' = ' - . Util::backquote($arr['foreign_db']) - . '.' - . Util::backquote($foreign_table) . '.' - . Util::backquote($arr['foreign_field']) - . ' WHERE ' - . Util::backquote($arr['foreign_db']) - . '.' - . Util::backquote($foreign_table) . '.' - . Util::backquote($arr['foreign_field']) - . ' IS NULL AND ' - . Util::backquote($GLOBALS['table']) . '.' - . Util::backquote($master) - . ' IS NOT NULL'; - $this_url_params = array_merge( - $url_params, - array('sql_query' => $join_query) - ); - - $html_output .= '
    • ' - . '' - . $master . ' -> ' . $arr['foreign_db'] . '.' - . $arr['foreign_table'] . '.' . $arr['foreign_field'] - . '
    • ' . "\n"; - } // foreach $foreign - $html_output .= '
    '; - - return $html_output; -} - -/** - * Reorder table based on request params - * - * @return array SQL query and result - */ -function PMA_getQueryAndResultForReorderingTable() -{ - $sql_query = 'ALTER TABLE ' - . Util::backquote($GLOBALS['table']) - . ' ORDER BY ' - . Util::backquote(urldecode($_REQUEST['order_field'])); - if (isset($_REQUEST['order_order']) - && $_REQUEST['order_order'] === 'desc' - ) { - $sql_query .= ' DESC'; - } else { - $sql_query .= ' ASC'; - } - $sql_query .= ';'; - $result = $GLOBALS['dbi']->query($sql_query); - - return array($sql_query, $result); -} - -/** - * Get table alters array - * - * @param Table $pma_table The Table object - * @param string $pack_keys pack keys - * @param string $checksum value of checksum - * @param string $page_checksum value of page checksum - * @param string $delay_key_write delay key write - * @param string $row_format row format - * @param string $newTblStorageEngine table storage engine - * @param string $transactional value of transactional - * @param string $tbl_collation collation of the table - * - * @return array $table_alters - */ -function PMA_getTableAltersArray($pma_table, $pack_keys, - $checksum, $page_checksum, $delay_key_write, - $row_format, $newTblStorageEngine, $transactional, $tbl_collation -) { - global $auto_increment; - - $table_alters = array(); - - if (isset($_REQUEST['comment']) - && urldecode($_REQUEST['prev_comment']) !== $_REQUEST['comment'] - ) { - $table_alters[] = 'COMMENT = \'' - . $GLOBALS['dbi']->escapeString($_REQUEST['comment']) . '\''; - } - - if (! empty($newTblStorageEngine) - && mb_strtolower($newTblStorageEngine) !== mb_strtolower($GLOBALS['tbl_storage_engine']) - ) { - $table_alters[] = 'ENGINE = ' . $newTblStorageEngine; - } - if (! empty($_REQUEST['tbl_collation']) - && $_REQUEST['tbl_collation'] !== $tbl_collation - ) { - $table_alters[] = 'DEFAULT ' - . Util::getCharsetQueryPart($_REQUEST['tbl_collation']); - } - - if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'ISAM')) - && isset($_REQUEST['new_pack_keys']) - && $_REQUEST['new_pack_keys'] != (string)$pack_keys - ) { - $table_alters[] = 'pack_keys = ' . $_REQUEST['new_pack_keys']; - } - - $_REQUEST['new_checksum'] = empty($_REQUEST['new_checksum']) ? '0' : '1'; - if ($pma_table->isEngine(array('MYISAM', 'ARIA')) - && $_REQUEST['new_checksum'] !== $checksum - ) { - $table_alters[] = 'checksum = ' . $_REQUEST['new_checksum']; - } - - $_REQUEST['new_transactional'] - = empty($_REQUEST['new_transactional']) ? '0' : '1'; - if ($pma_table->isEngine('ARIA') - && $_REQUEST['new_transactional'] !== $transactional - ) { - $table_alters[] = 'TRANSACTIONAL = ' . $_REQUEST['new_transactional']; - } - - $_REQUEST['new_page_checksum'] - = empty($_REQUEST['new_page_checksum']) ? '0' : '1'; - if ($pma_table->isEngine('ARIA') - && $_REQUEST['new_page_checksum'] !== $page_checksum - ) { - $table_alters[] = 'PAGE_CHECKSUM = ' . $_REQUEST['new_page_checksum']; - } - - $_REQUEST['new_delay_key_write'] - = empty($_REQUEST['new_delay_key_write']) ? '0' : '1'; - if ($pma_table->isEngine(array('MYISAM', 'ARIA')) - && $_REQUEST['new_delay_key_write'] !== $delay_key_write - ) { - $table_alters[] = 'delay_key_write = ' . $_REQUEST['new_delay_key_write']; - } - - if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'PBXT')) - && ! empty($_REQUEST['new_auto_increment']) - && (! isset($auto_increment) - || $_REQUEST['new_auto_increment'] !== $auto_increment) - ) { - $table_alters[] = 'auto_increment = ' - . $GLOBALS['dbi']->escapeString($_REQUEST['new_auto_increment']); - } - - if (! empty($_REQUEST['new_row_format'])) { - $newRowFormat = $_REQUEST['new_row_format']; - $newRowFormatLower = mb_strtolower($newRowFormat); - if ($pma_table->isEngine(array('MYISAM', 'ARIA', 'INNODB', 'PBXT')) - && (strlen($row_format) === 0 - || $newRowFormatLower !== mb_strtolower($row_format)) - ) { - $table_alters[] = 'ROW_FORMAT = ' - . $GLOBALS['dbi']->escapeString($newRowFormat); - } - } - - return $table_alters; -} - -/** - * Get warning messages array - * - * @return array $warning_messages - */ -function PMA_getWarningMessagesArray() -{ - $warning_messages = array(); - foreach ($GLOBALS['dbi']->getWarnings() as $warning) { - // In MariaDB 5.1.44, when altering a table from Maria to MyISAM - // and if TRANSACTIONAL was set, the system reports an error; - // I discussed with a Maria developer and he agrees that this - // should not be reported with a Level of Error, so here - // I just ignore it. But there are other 1478 messages - // that it's better to show. - if (! ($_REQUEST['new_tbl_storage_engine'] == 'MyISAM' - && $warning['Code'] == '1478' - && $warning['Level'] == 'Error') - ) { - $warning_messages[] = $warning['Level'] . ': #' . $warning['Code'] - . ' ' . $warning['Message']; - } - } - return $warning_messages; -} - -/** - * Get SQL query and result after ran this SQL query for a partition operation - * has been requested by the user - * - * @return array $sql_query, $result - */ -function PMA_getQueryAndResultForPartition() -{ - $sql_query = 'ALTER TABLE ' - . Util::backquote($GLOBALS['table']) . ' ' - . $_REQUEST['partition_operation'] - . ' PARTITION '; - - if ($_REQUEST['partition_operation'] == 'COALESCE') { - $sql_query .= count($_REQUEST['partition_name']); - } else { - $sql_query .= implode(', ', $_REQUEST['partition_name']) . ';'; - } - - $result = $GLOBALS['dbi']->query($sql_query); - - return array($sql_query, $result); -} - -/** - * Adjust the privileges after renaming/moving a table - * - * @param string $oldDb Database name before table renaming/moving table - * @param string $oldTable Table name before table renaming/moving table - * @param string $newDb Database name after table renaming/ moving table - * @param string $newTable Table name after table renaming/moving table - * - * @return void - */ -function PMA_AdjustPrivileges_renameOrMoveTable($oldDb, $oldTable, $newDb, $newTable) -{ - if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $GLOBALS['dbi']->selectDb('mysql'); - - // For table specific privileges - $query_table_specific = 'UPDATE ' . Util::backquote('tables_priv') - . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newDb) . '\', Table_name = \'' . $GLOBALS['dbi']->escapeString($newTable) - . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\' AND Table_name = \'' . $GLOBALS['dbi']->escapeString($oldTable) - . '\';'; - $GLOBALS['dbi']->query($query_table_specific); - - // For column specific privileges - $query_col_specific = 'UPDATE ' . Util::backquote('columns_priv') - . 'SET Db = \'' . $GLOBALS['dbi']->escapeString($newDb) . '\', Table_name = \'' . $GLOBALS['dbi']->escapeString($newTable) - . '\' where Db = \'' . $GLOBALS['dbi']->escapeString($oldDb) . '\' AND Table_name = \'' . $GLOBALS['dbi']->escapeString($oldTable) - . '\';'; - $GLOBALS['dbi']->query($query_col_specific); - - // Finally FLUSH the new privileges - $flush_query = "FLUSH PRIVILEGES;"; - $GLOBALS['dbi']->query($flush_query); - } -} - -/** - * Adjust the privileges after copying a table - * - * @param string $oldDb Database name before table copying - * @param string $oldTable Table name before table copying - * @param string $newDb Database name after table copying - * @param string $newTable Table name after table copying - * - * @return void - */ -function PMA_AdjustPrivileges_copyTable($oldDb, $oldTable, $newDb, $newTable) -{ - if ($GLOBALS['table_priv'] && $GLOBALS['col_priv'] - && $GLOBALS['is_reload_priv'] - ) { - $GLOBALS['dbi']->selectDb('mysql'); - - // For Table Specific privileges - $query_table_specific_old = 'SELECT * FROM ' - . Util::backquote('tables_priv') . ' where ' - . 'Db = "' . $oldDb . '" AND Table_name = "' . $oldTable . '";'; - - $old_privs_table = $GLOBALS['dbi']->fetchResult( - $query_table_specific_old, - 0 - ); - - foreach ($old_privs_table as $old_priv) { - $newDb_table_privs_query = 'INSERT INTO ' - . Util::backquote('tables_priv') . ' VALUES("' - . $old_priv[0] . '", "' . $newDb . '", "' . $old_priv[2] . '", "' - . $newTable . '", "' . $old_priv[4] . '", "' . $old_priv[5] - . '", "' . $old_priv[6] . '", "' . $old_priv[7] . '");'; - - $GLOBALS['dbi']->query($newDb_table_privs_query); - } - - // For Column Specific privileges - $query_col_specific_old = 'SELECT * FROM ' - . Util::backquote('columns_priv') . ' WHERE ' - . 'Db = "' . $oldDb . '" AND Table_name = "' . $oldTable . '";'; - - $old_privs_col = $GLOBALS['dbi']->fetchResult( - $query_col_specific_old, - 0 - ); - - foreach ($old_privs_col as $old_priv) { - $newDb_col_privs_query = 'INSERT INTO ' - . Util::backquote('columns_priv') . ' VALUES("' - . $old_priv[0] . '", "' . $newDb . '", "' . $old_priv[2] . '", "' - . $newTable . '", "' . $old_priv[4] . '", "' . $old_priv[5] - . '", "' . $old_priv[6] . '");'; - - $GLOBALS['dbi']->query($newDb_col_privs_query); - } - - // Finally FLUSH the new privileges - $flush_query = "FLUSH PRIVILEGES;"; - $GLOBALS['dbi']->query($flush_query); - } -} - -/** - * Change all collations and character sets of all columns in table - * - * @param string $db Database name - * @param string $table Table name - * @param string $tbl_collation Collation Name - * - * @return void - */ -function PMA_changeAllColumnsCollation($db, $table, $tbl_collation) -{ - $GLOBALS['dbi']->selectDb($db); - - $change_all_collations_query = 'ALTER TABLE ' - . Util::backquote($table) - . ' CONVERT TO'; - - list($charset) = explode('_', $tbl_collation); - - $change_all_collations_query .= ' CHARACTER SET ' . $charset - . ($charset == $tbl_collation ? '' : ' COLLATE ' . $tbl_collation); - - $GLOBALS['dbi']->query($change_all_collations_query); -} - -/** - * Move or copy a table - * - * @param string $db current database name - * @param string $table current table name - * - * @return void - */ -function PMA_moveOrCopyTable($db, $table) -{ - /** - * Selects the database to work with - */ - $GLOBALS['dbi']->selectDb($db); - - /** - * $_REQUEST['target_db'] could be empty in case we came from an input field - * (when there are many databases, no drop-down) - */ - if (empty($_REQUEST['target_db'])) { - $_REQUEST['target_db'] = $db; - } - - /** - * A target table name has been sent to this script -> do the work - */ - if (Core::isValid($_REQUEST['new_name'])) { - if ($db == $_REQUEST['target_db'] && $table == $_REQUEST['new_name']) { - if (isset($_REQUEST['submit_move'])) { - $message = Message::error(__('Can\'t move table to same one!')); - } else { - $message = Message::error(__('Can\'t copy table to same one!')); - } - } else { - Table::moveCopy( - $db, $table, $_REQUEST['target_db'], $_REQUEST['new_name'], - $_REQUEST['what'], isset($_REQUEST['submit_move']), 'one_table' - ); - - if (isset($_REQUEST['adjust_privileges']) - && ! empty($_REQUEST['adjust_privileges']) - ) { - if (isset($_REQUEST['submit_move'])) { - PMA_AdjustPrivileges_renameOrMoveTable( - $db, $table, $_REQUEST['target_db'], $_REQUEST['new_name'] - ); - } else { - PMA_AdjustPrivileges_copyTable( - $db, $table, $_REQUEST['target_db'], $_REQUEST['new_name'] - ); - } - - if (isset($_REQUEST['submit_move'])) { - $message = Message::success( - __( - 'Table %s has been moved to %s. Privileges have been ' - . 'adjusted.' - ) - ); - } else { - $message = Message::success( - __( - 'Table %s has been copied to %s. Privileges have been ' - . 'adjusted.' - ) - ); - } - - } else { - if (isset($_REQUEST['submit_move'])) { - $message = Message::success( - __('Table %s has been moved to %s.') - ); - } else { - $message = Message::success( - __('Table %s has been copied to %s.') - ); - } - } - - $old = Util::backquote($db) . '.' - . Util::backquote($table); - $message->addParam($old); - - $new_name = $_REQUEST['new_name']; - if ($GLOBALS['dbi']->getLowerCaseNames() === '1') { - $new_name = strtolower($new_name); - } - - $new = Util::backquote($_REQUEST['target_db']) . '.' - . Util::backquote($new_name); - $message->addParam($new); - - /* Check: Work on new table or on old table? */ - if (isset($_REQUEST['submit_move']) - || Core::isValid($_REQUEST['switch_to_new']) - ) { - } - } - } else { - /** - * No new name for the table! - */ - $message = Message::error(__('The table name is empty!')); - } - - $response = Response::getInstance(); - if ($response->isAjax()) { - $response->addJSON('message', $message); - if ($message->isSuccess()) { - $response->addJSON('db', $GLOBALS['db']); - } else { - $response->setRequestStatus(false); - } - exit; - } -} diff --git a/tbl_operations.php b/tbl_operations.php index 3208a20e54..c6b0f8046c 100644 --- a/tbl_operations.php +++ b/tbl_operations.php @@ -5,9 +5,13 @@ * * @package PhpMyAdmin */ +use PhpMyAdmin\Index; +use PhpMyAdmin\Message; use PhpMyAdmin\Partition; -use PhpMyAdmin\Table; +use PhpMyAdmin\Operations; use PhpMyAdmin\Response; +use PhpMyAdmin\Table; +use PhpMyAdmin\Util; /** * @@ -18,7 +22,6 @@ require_once 'libraries/common.inc.php'; * functions implementation for this script */ require_once 'libraries/check_user_privileges.lib.php'; -require_once 'libraries/operations.lib.php'; $pma_table = new Table($GLOBALS['table'], $GLOBALS['db']); @@ -95,7 +98,7 @@ $table_alters = array(); */ if (isset($_REQUEST['submit_move']) || isset($_REQUEST['submit_copy'])) { //$_message = ''; - PMA_moveOrCopyTable($db, $table); + Operations::moveOrCopyTable($db, $table); // This was ended in an Ajax call exit; } @@ -122,7 +125,7 @@ if (isset($_REQUEST['submitoptions'])) { if (isset($_REQUEST['adjust_privileges']) && ! empty($_REQUEST['adjust_privileges']) ) { - PMA_AdjustPrivileges_renameOrMoveTable( + Operations::adjustPrivilegesRenameOrMoveTable( $oldDb, $oldTable, $_REQUEST['db'], $_REQUEST['new_name'] ); } @@ -160,7 +163,7 @@ if (isset($_REQUEST['submitoptions'])) { ? $create_options['row_format'] : $pma_table->getRowFormat(); - $table_alters = PMA_getTableAltersArray( + $table_alters = Operations::getTableAltersArray( $pma_table, $create_options['pack_keys'], (empty($create_options['checksum']) ? '0' : '1'), @@ -174,13 +177,13 @@ if (isset($_REQUEST['submitoptions'])) { if (count($table_alters) > 0) { $sql_query = 'ALTER TABLE ' - . PhpMyAdmin\Util::backquote($GLOBALS['table']); + . Util::backquote($GLOBALS['table']); $sql_query .= "\r\n" . implode("\r\n", $table_alters); $sql_query .= ';'; $result .= $GLOBALS['dbi']->query($sql_query) ? true : false; $reread_info = true; unset($table_alters); - $warning_messages = PMA_getWarningMessagesArray(); + $warning_messages = Operations::getWarningMessagesArray(); } if (isset($_REQUEST['tbl_collation']) @@ -188,7 +191,7 @@ if (isset($_REQUEST['submitoptions'])) { && isset($_REQUEST['change_all_collations']) && ! empty($_REQUEST['change_all_collations']) ) { - PMA_changeAllColumnsCollation( + Operations::changeAllColumnsCollation( $GLOBALS['db'], $GLOBALS['table'], $_REQUEST['tbl_collation'] ); } @@ -197,7 +200,7 @@ if (isset($_REQUEST['submitoptions'])) { * Reordering the table has been requested by the user */ if (isset($_REQUEST['submitorderby']) && ! empty($_REQUEST['order_field'])) { - list($sql_query, $result) = PMA_getQueryAndResultForReorderingTable(); + list($sql_query, $result) = Operations::getQueryAndResultForReorderingTable(); } // end if /** @@ -206,7 +209,7 @@ if (isset($_REQUEST['submitorderby']) && ! empty($_REQUEST['order_field'])) { if (isset($_REQUEST['submit_partition']) && ! empty($_REQUEST['partition_operation']) ) { - list($sql_query, $result) = PMA_getQueryAndResultForPartition(); + list($sql_query, $result) = Operations::getQueryAndResultForPartition(); } // end if if ($reread_info) { @@ -235,11 +238,11 @@ unset($reread_info); if (isset($result) && empty($message_to_show)) { if (empty($_message)) { if (empty($sql_query)) { - $_message = PhpMyAdmin\Message::success(__('No change')); + $_message = Message::success(__('No change')); } else { $_message = $result - ? PhpMyAdmin\Message::success() - : PhpMyAdmin\Message::error(); + ? Message::success() + : Message::error(); } if ($response->isAjax()) { @@ -247,19 +250,19 @@ if (isset($result) && empty($message_to_show)) { $response->addJSON('message', $_message); if (!empty($sql_query)) { $response->addJSON( - 'sql_query', PhpMyAdmin\Util::getMessage(null, $sql_query) + 'sql_query', Util::getMessage(null, $sql_query) ); } exit; } } else { $_message = $result - ? PhpMyAdmin\Message::success($_message) - : PhpMyAdmin\Message::error($_message); + ? Message::success($_message) + : Message::error($_message); } if (! empty($warning_messages)) { - $_message = new PhpMyAdmin\Message; + $_message = new Message; $_message->addMessagesString($warning_messages); $_message->isError(true); if ($response->isAjax()) { @@ -267,7 +270,7 @@ if (isset($result) && empty($message_to_show)) { $response->addJSON('message', $_message); if (!empty($sql_query)) { $response->addJSON( - 'sql_query', PhpMyAdmin\Util::getMessage(null, $sql_query) + 'sql_query', Util::getMessage(null, $sql_query) ); } exit; @@ -281,7 +284,7 @@ if (isset($result) && empty($message_to_show)) { ); } else { $response->addHTML( - PhpMyAdmin\Util::getMessage($_message, $sql_query) + Util::getMessage($_message, $sql_query) ); } unset($_message); @@ -308,7 +311,7 @@ $hideOrderTable = false; // a user-defined clustered index (PRIMARY KEY or NOT NULL UNIQUE index). // InnoDB always orders table rows according to such an index if one is present. if ($tbl_storage_engine == 'INNODB') { - $indexes = PhpMyAdmin\Index::getFromTable($GLOBALS['table'], $GLOBALS['db']); + $indexes = Index::getFromTable($GLOBALS['table'], $GLOBALS['db']); foreach ($indexes as $name => $idx) { if ($name == 'PRIMARY') { $hideOrderTable = true; @@ -329,13 +332,13 @@ if ($tbl_storage_engine == 'INNODB') { } } if (! $hideOrderTable) { - $response->addHTML(PMA_getHtmlForOrderTheTable($columns)); + $response->addHTML(Operations::getHtmlForOrderTheTable($columns)); } /** * Move table */ -$response->addHTML(PMA_getHtmlForMoveTable()); +$response->addHTML(Operations::getHtmlForMoveTable()); if (mb_strstr($show_comment, '; InnoDB free') === false) { if (mb_strstr($show_comment, 'InnoDB free') === false) { @@ -359,7 +362,7 @@ if (mb_strstr($show_comment, '; InnoDB free') === false) { // check for version $response->addHTML( - PMA_getTableOptionDiv( + Operations::getTableOptionDiv( $pma_table, $comment, $tbl_collation, $tbl_storage_engine, $create_options['pack_keys'], $auto_increment, @@ -373,13 +376,13 @@ $response->addHTML( /** * Copy table */ -$response->addHTML(PMA_getHtmlForCopytable()); +$response->addHTML(Operations::getHtmlForCopytable()); /** * Table maintenance */ $response->addHTML( - PMA_getHtmlForTableMaintenance($pma_table, $url_params) + Operations::getHtmlForTableMaintenance($pma_table, $url_params) ); if (! (isset($db_is_system_schema) && $db_is_system_schema)) { @@ -390,7 +393,7 @@ if (! (isset($db_is_system_schema) && $db_is_system_schema)) { && ! (isset($db_is_system_schema) && $db_is_system_schema) ) { $this_sql_query = 'TRUNCATE TABLE ' - . PhpMyAdmin\Util::backquote($GLOBALS['table']); + . Util::backquote($GLOBALS['table']); $truncate_table_url_params = array_merge( $url_params, array( @@ -406,7 +409,7 @@ if (! (isset($db_is_system_schema) && $db_is_system_schema)) { } if (! (isset($db_is_system_schema) && $db_is_system_schema)) { $this_sql_query = 'DROP TABLE ' - . PhpMyAdmin\Util::backquote($GLOBALS['table']); + . Util::backquote($GLOBALS['table']); $drop_table_url_params = array_merge( $url_params, array( @@ -428,7 +431,7 @@ if (! (isset($db_is_system_schema) && $db_is_system_schema)) { ); } $response->addHTML( - PMA_getHtmlForDeleteDataOrTable( + Operations::getHtmlForDeleteDataOrTable( $truncate_table_url_params, $drop_table_url_params ) @@ -440,7 +443,7 @@ if (Partition::havePartitioning()) { // show the Partition maintenance section only if we detect a partition if (! is_null($partition_names[0])) { $response->addHTML( - PMA_getHtmlForPartitionMaintenance($partition_names, $url_params) + Operations::getHtmlForPartitionMaintenance($partition_names, $url_params) ); } // end if } // end if @@ -458,7 +461,7 @@ if ($cfgRelation['relwork'] && ! $pma_table->isEngine("INNODB")) { if (! empty($foreign)) { $response->addHTML( - PMA_getHtmlForReferentialIntegrityCheck($foreign, $url_params) + Operations::getHtmlForReferentialIntegrityCheck($foreign, $url_params) ); } // end if ($foreign) diff --git a/test/libraries/PMA_operations_test.php b/test/classes/OperationsTest.php similarity index 76% rename from test/libraries/PMA_operations_test.php rename to test/classes/OperationsTest.php index 63af5ed2c9..159c67ed64 100644 --- a/test/libraries/PMA_operations_test.php +++ b/test/classes/OperationsTest.php @@ -5,17 +5,12 @@ * * @package PhpMyAdmin-test */ +namespace PhpMyAdmin\Tests; -/* - * Include to test. - */ - +use PhpMyAdmin\Operations; use PhpMyAdmin\Theme; -$GLOBALS['server'] = 1; -require_once 'libraries/operations.lib.php'; require_once 'libraries/relation.lib.php'; - require_once 'libraries/database_interface.inc.php'; /** @@ -23,7 +18,7 @@ require_once 'libraries/database_interface.inc.php'; * * @package PhpMyAdmin-test */ -class PMA_Operations_Test extends PHPUnit_Framework_TestCase +class OperationsTest extends \PHPUnit_Framework_TestCase { /** * Set up global environment. @@ -32,6 +27,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase */ public function setup() { + $GLOBALS['server'] = 1; $GLOBALS['table'] = 'table'; $GLOBALS['db'] = 'db'; $GLOBALS['cfg'] = array( @@ -49,7 +45,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase } /** - * Test for PMA_getHtmlForDatabaseComment + * Test for Operations::getHtmlForDatabaseComment * * @return void */ @@ -58,12 +54,12 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertRegExp( '/.*db_operations.php(.|[\n])*Database comment.*name="comment"([\n]|.)*/m', - PMA_getHtmlForDatabaseComment("pma") + Operations::getHtmlForDatabaseComment("pma") ); } /** - * Test for PMA_getHtmlForRenameDatabase + * Test for Operations::getHtmlForRenameDatabase * * @return void */ @@ -71,7 +67,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase { $_REQUEST['db_collation'] = 'db1'; - $html = PMA_getHtmlForRenameDatabase("pma"); + $html = Operations::getHtmlForRenameDatabase("pma"); $this->assertContains('db_operations.php', $html); $this->assertRegExp( '/.*db_rename.*Rename database to.*/', @@ -80,7 +76,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase } /** - * Test for PMA_getHtmlForDropDatabaseLink + * Test for Operations::getHtmlForDropDatabaseLink * * @return void */ @@ -89,26 +85,26 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertRegExp( '/.*DROP.DATABASE.*db_operations.php.*Drop the database.*/', - PMA_getHtmlForDropDatabaseLink("pma") + Operations::getHtmlForDropDatabaseLink("pma") ); } /** - * Test for PMA_getHtmlForCopyDatabase + * Test for Operations::getHtmlForCopyDatabase * * @return void */ public function testGetHtmlForCopyDatabase() { $_REQUEST['db_collation'] = 'db1'; - $html = PMA_getHtmlForCopyDatabase("pma"); + $html = Operations::getHtmlForCopyDatabase("pma"); $this->assertRegExp('/.*db_operations.php.*/', $html); $this->assertRegExp('/.*db_copy.*/', $html); $this->assertRegExp('/.*Copy database to.*/', $html); } /** - * Test for PMA_getHtmlForChangeDatabaseCharset + * Test for Operations::getHtmlForChangeDatabaseCharset * * @return void */ @@ -116,7 +112,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase { $_REQUEST['db_collation'] = 'db1'; - $result = PMA_getHtmlForChangeDatabaseCharset("pma", "bookmark"); + $result = Operations::getHtmlForChangeDatabaseCharset("pma", "bookmark"); $this->assertRegExp( '/.*select_db_collation.*Collation.*/m', $result ); @@ -126,7 +122,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase } /** - * Test for PMA_getHtmlForOrderTheTable + * Test for Operations::getHtmlForOrderTheTable * * @return void */ @@ -135,14 +131,14 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertRegExp( '/.*tbl_operations.php(.|[\n])*Alter table order by([\n]|.)*order_order.*/m', - PMA_getHtmlForOrderTheTable( + Operations::getHtmlForOrderTheTable( array(array('Field' => "column1"), array('Field' => "column2")) ) ); } /** - * Test for PMA_getHtmlForTableRow + * Test for Operations::getHtmlForTableRow * * @return void */ @@ -151,12 +147,12 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertEquals( '', - PMA_getHtmlForTableRow("name", "lable", "value") + Operations::getHtmlForTableRow("name", "lable", "value") ); } /** - * Test for PMA_getMaintainActionlink + * Test for Operations::getMaintainActionlink * * @return void */ @@ -165,7 +161,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertRegExp( '/.*href="sql.php.*post.*/', - PMA_getMaintainActionlink( + Operations::getMaintainActionlink( "post", array("name" => 'foo', "value" => 'bar'), array(), @@ -175,7 +171,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase } /** - * Test for PMA_getHtmlForDeleteDataOrTable + * Test for Operations::getHtmlForDeleteDataOrTable * * @return void */ @@ -184,14 +180,14 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertRegExp( '/.*Delete data or table.*Empty the table.*Delete the table.*/m', - PMA_getHtmlForDeleteDataOrTable( + Operations::getHtmlForDeleteDataOrTable( array("truncate" => 'foo'), array("drop" => 'bar') ) ); } /** - * Test for PMA_getDeleteDataOrTablelink + * Test for Operations::getDeleteDataOrTablelink * * @return void */ @@ -200,7 +196,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertRegExp( '/.*TRUNCATE.TABLE.foo.*id_truncate.*Truncate table.*/m', - PMA_getDeleteDataOrTablelink( + Operations::getDeleteDataOrTablelink( array("sql" => 'TRUNCATE TABLE foo'), "TRUNCATE_TABLE", "Truncate table", @@ -210,13 +206,13 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase } /** - * Test for PMA_getHtmlForPartitionMaintenance + * Test for Operations::getHtmlForPartitionMaintenance * * @return void */ public function testGetHtmlForPartitionMaintenance() { - $html = PMA_getHtmlForPartitionMaintenance( + $html = Operations::getHtmlForPartitionMaintenance( array("partition1", "partion2"), array("param1" => 'foo', "param2" => 'bar') ); @@ -226,7 +222,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase } /** - * Test for PMA_getHtmlForReferentialIntegrityCheck + * Test for Operations::getHtmlForReferentialIntegrityCheck * * @return void */ @@ -235,7 +231,7 @@ class PMA_Operations_Test extends PHPUnit_Framework_TestCase $this->assertRegExp( '/.*Check referential integrity.*href="sql.php(.|[\n])*/m', - PMA_getHtmlForReferentialIntegrityCheck( + Operations::getHtmlForReferentialIntegrityCheck( array( array( 'foreign_db' => 'db1', diff --git a/view_operations.php b/view_operations.php index 529ee2cbb7..9eb54d5318 100644 --- a/view_operations.php +++ b/view_operations.php @@ -5,9 +5,12 @@ * * @package PhpMyAdmin */ -use PhpMyAdmin\Table; +use PhpMyAdmin\Message; +use PhpMyAdmin\Operations; use PhpMyAdmin\Response; +use PhpMyAdmin\Table; use PhpMyAdmin\Url; +use PhpMyAdmin\Util; /** * @@ -16,11 +19,6 @@ require_once './libraries/common.inc.php'; $pma_table = new Table($GLOBALS['table'], $GLOBALS['db']); -/** - * functions implementation for this script - */ -require_once 'libraries/operations.lib.php'; - /** * Load JavaScript files */ @@ -39,7 +37,7 @@ $url_params['goto'] = $url_params['back'] = 'view_operations.php'; /** * Updates if required */ -$_message = new PhpMyAdmin\Message; +$_message = new Message; $_type = 'success'; if (isset($_REQUEST['submitoptions'])) { @@ -57,7 +55,7 @@ if (isset($_REQUEST['submitoptions'])) { } } - $warning_messages = PMA_getWarningMessagesArray(); + $warning_messages = Operations::getWarningMessagesArray(); } if (isset($result)) { @@ -79,7 +77,7 @@ if (isset($result)) { $_message->isError(true); unset($warning_messages); } - echo PhpMyAdmin\Util::getMessage( + echo Util::getMessage( $_message, $sql_query, $_type ); } @@ -120,7 +118,7 @@ $url_params['back'] = 'view_operations.php'; $drop_view_url_params = array_merge( $url_params, array( - 'sql_query' => 'DROP VIEW ' . PhpMyAdmin\Util::backquote( + 'sql_query' => 'DROP VIEW ' . Util::backquote( $GLOBALS['table'] ), 'goto' => 'tbl_structure.php', @@ -138,7 +136,7 @@ echo '
    '; echo '' , __('Delete data or table') , ''; echo '
      '; -echo PMA_getDeleteDataOrTableLink( +echo Operations::getDeleteDataOrTablelink( $drop_view_url_params, 'DROP VIEW', __('Delete the view (DROP)'),