diff --git a/libraries/rte/rte_routines.lib.php b/libraries/rte/rte_routines.lib.php index 7bc516ecf8..52b8db2afd 100644 --- a/libraries/rte/rte_routines.lib.php +++ b/libraries/rte/rte_routines.lib.php @@ -105,6 +105,7 @@ function PMA_RTN_handleEditor() $_REQUEST['item_original_type'], array('PROCEDURE', 'FUNCTION') ); + if (!$isProcOrFunc) { $errors[] = sprintf( __('Invalid routine type: "%s"'), @@ -117,28 +118,7 @@ function PMA_RTN_handleEditor() $_REQUEST['item_original_name'] ); - if (! defined('PMA_DRIZZLE') || ! PMA_DRIZZLE) { - if (isset($GLOBALS['proc_priv']) && $GLOBALS['proc_priv'] - && isset($GLOBALS['flush_priv']) && $GLOBALS['flush_priv'] - ) { - // Backup the Old Privileges before dropping - // if $_REQUEST['item_adjust_privileges'] set - $privilegesBackup = array(); - if (isset($_REQUEST['item_adjust_privileges']) - && ! empty($_REQUEST['item_adjust_privileges']) - ) { - $privilegesBackupQuery = 'SELECT * FROM ' . PMA_Util::backquote('mysql') - . '.' . PMA_Util::backquote('procs_priv') - . ' where Routine_name = "' . $_REQUEST['item_original_name'] - . '" AND Routine_type = "' . $_REQUEST['item_original_type'] - . '";'; - - $privilegesBackup = $GLOBALS['dbi']->fetchResult( - $privilegesBackupQuery, 0 - ); - } - } - } + $privilegesBackup = PMA_RTN_backupPrivileges(); $drop_routine = "DROP {$_REQUEST['item_original_type']} " . PMA_Util::backquote($_REQUEST['item_original_name']) @@ -152,75 +132,13 @@ function PMA_RTN_handleEditor() . '
' . __('MySQL said: ') . $GLOBALS['dbi']->getError(null); } else { - $result = $GLOBALS['dbi']->tryQuery($routine_query); - if (! $result) { - $errors[] = sprintf( - __('The following query has failed: "%s"'), - htmlspecialchars($routine_query) - ) - . '
' - . __('MySQL said: ') . $GLOBALS['dbi']->getError(null); - // We dropped the old routine, - // but were unable to create the new one - // Try to restore the backup query - $result = $GLOBALS['dbi']->tryQuery($create_routine); - $errors = checkResult( - $result, - __( - 'Sorry, we failed to restore' - . ' the dropped routine.' - ), - $create_routine, - $errors - ); - } else { - // Default value - $resultAdjust = false; - - if (! defined('PMA_DRIZZLE') || ! PMA_DRIZZLE) { - if (isset($GLOBALS['proc_priv']) && $GLOBALS['proc_priv'] - && isset($GLOBALS['flush_priv']) && $GLOBALS['flush_priv'] - ) { - // Insert all the previous privileges - // but with the new name and the new type - foreach ($privilegesBackup as $priv) { - $adjustProcPrivilege = 'INSERT INTO ' - . PMA_Util::backquote('mysql') . '.' - . PMA_Util::backquote('procs_priv') - . ' VALUES("' . $priv[0] . '", "' - . $priv[1] . '", "' . $priv[2] . '", "' - . $_REQUEST['item_name'] . '", "' - . $_REQUEST['item_type'] . '", "' - . $priv[5] . '", "' - . $priv[6] . '", "' - . $priv[7] . '");'; - $resultAdjust = $GLOBALS['dbi']->query( - $adjustProcPrivilege - ); - } - } - } - - if ($resultAdjust) { - // Flush the Privileges - $flushPrivQuery = 'FLUSH PRIVILEGES;'; - $GLOBALS['dbi']->query($flushPrivQuery); - - $message = PMA_Message::success( - __( - 'Routine %1$s has been modified. Privileges have been adjusted.' - ) - ); - } else { - $message = PMA_Message::success( - __('Routine %1$s has been modified.') - ); - } - $message->addParam( - PMA_Util::backquote($_REQUEST['item_name']) - ); - $sql_query = $drop_routine . $routine_query; - } + list($errors, $message, $sql_query) = PMA_RTN_createRoutine( + $routine_query, + $errors, + $create_routine, + $privilegesBackup, + $drop_routine + ); } } } else { @@ -359,6 +277,154 @@ function PMA_RTN_handleEditor() } } } +} + +/** + * Backup the privileges + * + * @return array + */ +function PMA_RTN_backupPrivileges() +{ + if (defined('PMA_DRIZZLE') && PMA_DRIZZLE) { + return array(); + } + + if (!(isset($GLOBALS['proc_priv']) && $GLOBALS['proc_priv'] + && isset($GLOBALS['flush_priv']) + && $GLOBALS['flush_priv'] + )) { + return array(); + } + + // Backup the Old Privileges before dropping + // if $_REQUEST['item_adjust_privileges'] set + if (!isset($_REQUEST['item_adjust_privileges']) + || empty($_REQUEST['item_adjust_privileges']) + ) { + return array(); + } + + $privilegesBackupQuery = 'SELECT * FROM ' . PMA_Util::backquote( + 'mysql' + ) + . '.' . PMA_Util::backquote('procs_priv') + . ' where Routine_name = "' . $_REQUEST['item_original_name'] + . '" AND Routine_type = "' . $_REQUEST['item_original_type'] + . '";'; + + $privilegesBackup = $GLOBALS['dbi']->fetchResult( + $privilegesBackupQuery, + 0 + ); + + return $privilegesBackup; +} + +/** + * Create the routine + * + * @param string $routine_query Query to create routine + * @param array $errors Errors + * @param string $create_routine Query to restore routine + * @param $privilegesBackup + * @param $drop_routine + * + * @return array + */ +function PMA_RTN_createRoutine( + $routine_query, + $errors, + $create_routine, + $privilegesBackup, + $drop_routine +) { + $result = $GLOBALS['dbi']->tryQuery($routine_query); + if (!$result) { + $errors[] = sprintf( + __('The following query has failed: "%s"'), + htmlspecialchars($routine_query) + ) + . '
' + . __('MySQL said: ') . $GLOBALS['dbi']->getError(null); + // We dropped the old routine, + // but were unable to create the new one + // Try to restore the backup query + $result = $GLOBALS['dbi']->tryQuery($create_routine); + $errors = checkResult( + $result, + __( + 'Sorry, we failed to restore' + . ' the dropped routine.' + ), + $create_routine, + $errors + ); + + return array($errors, $message, $sql_query); + } + + // Default value + $resultAdjust = false; + + if (!defined('PMA_DRIZZLE') || !PMA_DRIZZLE) { + if (isset($GLOBALS['proc_priv']) && $GLOBALS['proc_priv'] + && isset($GLOBALS['flush_priv']) + && $GLOBALS['flush_priv'] + ) { + // Insert all the previous privileges + // but with the new name and the new type + foreach ($privilegesBackup as $priv) { + $adjustProcPrivilege = 'INSERT INTO ' + . PMA_Util::backquote('mysql') . '.' + . PMA_Util::backquote('procs_priv') + . ' VALUES("' . $priv[0] . '", "' + . $priv[1] . '", "' . $priv[2] . '", "' + . $_REQUEST['item_name'] . '", "' + . $_REQUEST['item_type'] . '", "' + . $priv[5] . '", "' + . $priv[6] . '", "' + . $priv[7] . '");'; + $resultAdjust = $GLOBALS['dbi']->query( + $adjustProcPrivilege + ); + } + } + } + + $message = PMA_RTN_flushPrivileges($resultAdjust); + $sql_query = $drop_routine . $routine_query; + + return array($errors, $message, $sql_query); +} + +/** + * @param $resultAdjust + * + * @return PMA_Message + */ +function PMA_RTN_flushPrivileges($resultAdjust) +{ + if ($resultAdjust) { + // Flush the Privileges + $flushPrivQuery = 'FLUSH PRIVILEGES;'; + $GLOBALS['dbi']->query($flushPrivQuery); + + $message = PMA_Message::success( + __( + 'Routine %1$s has been modified. Privileges have been adjusted.' + ) + ); + } else { + $message = PMA_Message::success( + __('Routine %1$s has been modified.') + ); + } + $message->addParam( + PMA_Util::backquote($_REQUEST['item_name']) + ); + + return $message; } // end PMA_RTN_handleEditor() /**