diff options
-rw-r--r-- | libraries/rte/rte_routines.lib.php | 94 | ||||
-rw-r--r-- | test/libraries/rte/PMA_RTN_ParameterParser_test.php | 66 |
2 files changed, 16 insertions, 144 deletions
diff --git a/libraries/rte/rte_routines.lib.php b/libraries/rte/rte_routines.lib.php index b16926001f..342bfe29a6 100644 --- a/libraries/rte/rte_routines.lib.php +++ b/libraries/rte/rte_routines.lib.php @@ -9,6 +9,8 @@ if (! defined('PHPMYADMIN')) { exit; } +require_once 'libraries/Template.class.php'; + /** * Sets required globals * @@ -80,42 +82,6 @@ function PMA_RTN_main($type) } // end PMA_RTN_main() /** - * This function looks through the contents of a parsed - * SHOW CREATE [PROCEDURE | FUNCTION] query and extracts - * information about the routine's definer. - * - * @param array $parsed_query Parsed query, returned by PMA_SQP_parse() - * - * @return string The definer of a routine. - */ -function PMA_RTN_parseRoutineDefiner($parsed_query) -{ - $retval = ''; - $fetching = false; - for ($i = 0; $i < $parsed_query['len']; $i++) { - if ($parsed_query[$i]['type'] == 'alpha_reservedWord' - && $parsed_query[$i]['data'] == 'DEFINER' - ) { - $fetching = true; - } else if ($fetching == true - && $parsed_query[$i]['type'] != 'quote_backtick' - && /*overload*/mb_substr($parsed_query[$i]['type'], 0, 5) != 'punct' - ) { - break; - } else if ($fetching == true - && $parsed_query[$i]['type'] == 'quote_backtick' - ) { - $retval .= PMA_Util::unQuote( - $parsed_query[$i]['data'] - ); - } else if ($fetching == true && $parsed_query[$i]['type'] == 'punct_user') { - $retval .= $parsed_query[$i]['data']; - } - } - return $retval; -} // end PMA_RTN_parseRoutineDefiner() - -/** * Handles editor requests for adding or editing an item * * @return void @@ -543,12 +509,15 @@ function PMA_RTN_getDataFromName($name, $type, $all = true) // Get required data $retval['item_name'] = $routine['SPECIFIC_NAME']; $retval['item_type'] = $routine['ROUTINE_TYPE']; + $parser = new SqlParser\Parser($GLOBALS['dbi']->getDefinition( $db, $routine['ROUTINE_TYPE'], $routine['SPECIFIC_NAME'] )); - $params = SqlParser\Utils\Routine::getParameters($parser->statements[0]); + $routineStatement = $parser->statements[0]; + + $params = SqlParser\Utils\Routine::getParameters($routineStatement); $retval['item_num_params'] = $params['num']; $retval['item_param_dir'] = $params['dir']; $retval['item_param_name'] = $params['name']; @@ -571,51 +540,20 @@ function PMA_RTN_getDataFromName($name, $type, $all = true) $retval['item_returnlength'] = ''; $retval['item_returnopts_num'] = ''; $retval['item_returnopts_text'] = ''; + if (! empty($routine['DTD_IDENTIFIER'])) { - if (/*overload*/mb_strlen($routine['DTD_IDENTIFIER']) > 63) { - // If the DTD_IDENTIFIER string from INFORMATION_SCHEMA is - // at least 64 characters, then it may actually have been - // chopped because that column is a varchar(64), so we will - // parse the output of SHOW CREATE query to get accurate - // information about the return variable. - $dtd = ''; - $fetching = false; - for ($i = 0; $i < $parsed_query['len']; $i++) { - if ($parsed_query[$i]['type'] == 'alpha_reservedWord' - && /*overload*/mb_strtoupper($parsed_query[$i]['data']) == 'RETURNS' - ) { - $fetching = true; - } else if ($fetching == true - && $parsed_query[$i]['type'] == 'alpha_reservedWord' - ) { - // We will not be looking for options such as UNSIGNED - // or ZEROFILL because there is no way that a numeric - // field's DTD_IDENTIFIER can be longer than 64 - // characters. We can safely assume that the return - // datatype is either ENUM or SET, so we only look - // for CHARSET. - $word = /*overload*/mb_strtoupper($parsed_query[$i]['data']); - if ($word == 'CHARSET' - && ($parsed_query[$i+1]['type'] == 'alpha_charset' - || $parsed_query[$i+1]['type'] == 'alpha_identifier') - ) { - $dtd .= $word . ' ' . $parsed_query[$i + 1]['data']; - } - break; - } else if ($fetching == true) { - $dtd .= $parsed_query[$i]['data'] . ' '; - } - } - $routine['DTD_IDENTIFIER'] = $dtd; + $options = array(); + foreach ($routineStatement->return->options->options as $opt) { + $options[] = is_string($opt) ? $opt : $opt['value']; } - $returnparam = SqlParser\Utils\Routine::getReturnType($routine['DTD_IDENTIFIER']); - $retval['item_returntype'] = $returnparam[2]; - $retval['item_returnlength'] = $returnparam[3]; - $retval['item_returnopts_num'] = $returnparam[4]; - $retval['item_returnopts_text'] = $returnparam[4]; + + $retval['item_returntype'] = $routineStatement->return->name; + $retval['item_returnlength'] = implode(',', $routineStatement->return->size); + $retval['item_returnopts_num'] = implode(' ', $options); + $retval['item_returnopts_text'] = implode(' ', $options); } - $retval['item_definer'] = PMA_RTN_parseRoutineDefiner($parsed_query); + $retval['item_definer'] = $routineStatement->options->has('DEFINER'); $retval['item_definition'] = $routine['ROUTINE_DEFINITION']; $retval['item_isdeterministic'] = ''; if ($routine['IS_DETERMINISTIC'] == 'YES') { diff --git a/test/libraries/rte/PMA_RTN_ParameterParser_test.php b/test/libraries/rte/PMA_RTN_ParameterParser_test.php deleted file mode 100644 index d94e6c0b96..0000000000 --- a/test/libraries/rte/PMA_RTN_ParameterParser_test.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/* vim: set expandtab sw=4 ts=4 sts=4: */ -/** - * Test for parsing of Routine parameters - * - * @package PhpMyAdmin-test - */ - -/* - * Needed for PMA_Util::unQuote() and PMA_SQP_parse() - */ -require_once 'libraries/Util.class.php'; -require_once 'libraries/sqlparser.lib.php'; - -/* - * Include to test. - */ -require_once 'libraries/rte/rte_routines.lib.php'; - -/** - * Test for parsing of Routine parameters - * - * @package PhpMyAdmin-test - */ -class PMA_RTN_ParameterParser_Test extends PHPUnit_Framework_TestCase -{ - /** - * Test for PMA_RTN_parseRoutineDefiner - * - * @param string $source Source - * @param array $target Expected output - * - * @return void - * - * @dataProvider definerProvider - */ - public function testParseDefiner($source, $target) - { - PMA_RTN_setGlobals(); - $this->assertEquals( - $target, - PMA_RTN_parseRoutineDefiner(PMA_SQP_parse($source)) - ); - } - - /** - * Data provider for testParseDefiner - * - * @return array - */ - public function definerProvider() - { - return array( - array('CREATE PROCEDURE FOO() SELECT NULL', ''), - array( - 'CREATE DEFINER=`root`@`localhost` PROCEDURE FOO() SELECT NULL', - 'root@localhost' - ), - array( - 'CREATE DEFINER=`root\\`@`localhost` PROCEDURE FOO() SELECT NULL', - 'root\\@localhost' - ), - ); - } -} -?> |