diff options
author | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2022-09-11 23:32:44 +0300 |
---|---|---|
committer | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2022-09-11 23:32:44 +0300 |
commit | e96fab654df405595b9f42c5a4eba04f80344cc1 (patch) | |
tree | 983c3c570d2e6ea5114d84123dc4fca20ec0b38c | |
parent | 7975f5fb05befd63e10408a9c34a3ffff56a2515 (diff) |
Move DBI's getProceduresOrFunctions into Routines class
Splits the method into Routines::getFunctionNames and
Routines::getProcedureNames and adds tests.
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
-rw-r--r-- | libraries/classes/Database/Routines.php | 40 | ||||
-rw-r--r-- | libraries/classes/DatabaseInterface.php | 27 | ||||
-rw-r--r-- | libraries/classes/Dbal/DbalInterface.php | 15 | ||||
-rw-r--r-- | libraries/classes/Operations.php | 4 | ||||
-rw-r--r-- | libraries/classes/Plugins/Export/ExportSql.php | 4 | ||||
-rw-r--r-- | libraries/classes/Plugins/Export/ExportXml.php | 4 | ||||
-rw-r--r-- | psalm-baseline.xml | 13 | ||||
-rw-r--r-- | test/classes/Database/RoutinesTest.php | 80 | ||||
-rw-r--r-- | test/classes/Plugins/Export/ExportXmlTest.php | 13 |
9 files changed, 133 insertions, 67 deletions
diff --git a/libraries/classes/Database/Routines.php b/libraries/classes/Database/Routines.php index a8e9a0860a..9e41943696 100644 --- a/libraries/classes/Database/Routines.php +++ b/libraries/classes/Database/Routines.php @@ -1692,4 +1692,44 @@ class Routines return is_string($result) ? $result : null; } + + /** + * @return array<int, string> + * @psalm-return list<non-empty-string> + */ + public static function getFunctionNames(DatabaseInterface $dbi, string $db): array + { + /** @psalm-var list<array{Db: string, Name: string, Type: string}> $functions */ + $functions = $dbi->fetchResult('SHOW FUNCTION STATUS;'); + $names = []; + foreach ($functions as $function) { + if ($function['Db'] !== $db || $function['Type'] !== 'FUNCTION' || $function['Name'] === '') { + continue; + } + + $names[] = $function['Name']; + } + + return $names; + } + + /** + * @return array<int, string> + * @psalm-return list<non-empty-string> + */ + public static function getProcedureNames(DatabaseInterface $dbi, string $db): array + { + /** @psalm-var list<array{Db: string, Name: string, Type: string}> $procedures */ + $procedures = $dbi->fetchResult('SHOW PROCEDURE STATUS;'); + $names = []; + foreach ($procedures as $procedure) { + if ($procedure['Db'] !== $db || $procedure['Type'] !== 'PROCEDURE' || $procedure['Name'] === '') { + continue; + } + + $names[] = $procedure['Name']; + } + + return $names; + } } diff --git a/libraries/classes/DatabaseInterface.php b/libraries/classes/DatabaseInterface.php index 1f7454513d..9fcc247508 100644 --- a/libraries/classes/DatabaseInterface.php +++ b/libraries/classes/DatabaseInterface.php @@ -1466,33 +1466,6 @@ class DatabaseInterface implements DbalInterface } /** - * returns an array of PROCEDURE or FUNCTION names for a db - * - * @param string $db db name - * @param string $which PROCEDURE | FUNCTION - * @param int $link link type - * - * @return string[] the procedure names or function names - */ - public function getProceduresOrFunctions( - string $db, - string $which, - $link = self::CONNECT_USER - ): array { - $shows = $this->fetchResult('SHOW ' . $which . ' STATUS;', null, null, $link); - $result = []; - foreach ($shows as $oneShow) { - if ($oneShow['Db'] != $db || $oneShow['Type'] != $which) { - continue; - } - - $result[] = $oneShow['Name']; - } - - return $result; - } - - /** * gets the current user with host * * @return string the current user i.e. user@host diff --git a/libraries/classes/Dbal/DbalInterface.php b/libraries/classes/Dbal/DbalInterface.php index bf073afe9a..e51a504c53 100644 --- a/libraries/classes/Dbal/DbalInterface.php +++ b/libraries/classes/Dbal/DbalInterface.php @@ -430,21 +430,6 @@ interface DbalInterface public function getWarnings($link = DatabaseInterface::CONNECT_USER): array; /** - * returns an array of PROCEDURE or FUNCTION names for a db - * - * @param string $db db name - * @param string $which PROCEDURE | FUNCTION - * @param int $link link type - * - * @return string[] the procedure names or function names - */ - public function getProceduresOrFunctions( - string $db, - string $which, - $link = DatabaseInterface::CONNECT_USER - ): array; - - /** * gets the current user with host * * @return string the current user i.e. user@host diff --git a/libraries/classes/Operations.php b/libraries/classes/Operations.php index 3e88d03c7d..18a8572387 100644 --- a/libraries/classes/Operations.php +++ b/libraries/classes/Operations.php @@ -57,7 +57,7 @@ class Operations */ public function runProcedureAndFunctionDefinitions($db): void { - $procedure_names = $this->dbi->getProceduresOrFunctions($db, 'PROCEDURE'); + $procedure_names = Routines::getProcedureNames($this->dbi, $db); if ($procedure_names) { foreach ($procedure_names as $procedure_name) { $this->dbi->selectDb($db); @@ -73,7 +73,7 @@ class Operations } } - $function_names = $this->dbi->getProceduresOrFunctions($db, 'FUNCTION'); + $function_names = Routines::getFunctionNames($this->dbi, $db); if (! $function_names) { return; } diff --git a/libraries/classes/Plugins/Export/ExportSql.php b/libraries/classes/Plugins/Export/ExportSql.php index 0a48ed46d0..ed29f70463 100644 --- a/libraries/classes/Plugins/Export/ExportSql.php +++ b/libraries/classes/Plugins/Export/ExportSql.php @@ -611,8 +611,8 @@ class ExportSql extends ExportPlugin $text = ''; $delimiter = '$$'; - $procedureNames = $GLOBALS['dbi']->getProceduresOrFunctions($db, 'PROCEDURE'); - $functionNames = $GLOBALS['dbi']->getProceduresOrFunctions($db, 'FUNCTION'); + $procedureNames = Routines::getProcedureNames($GLOBALS['dbi'], $db); + $functionNames = Routines::getFunctionNames($GLOBALS['dbi'], $db); if ($procedureNames || $functionNames) { $text .= $GLOBALS['crlf'] diff --git a/libraries/classes/Plugins/Export/ExportXml.php b/libraries/classes/Plugins/Export/ExportXml.php index f31ecd496b..473e8ed2ba 100644 --- a/libraries/classes/Plugins/Export/ExportXml.php +++ b/libraries/classes/Plugins/Export/ExportXml.php @@ -323,7 +323,7 @@ class ExportXml extends ExportPlugin $head .= $this->exportDefinitions( $GLOBALS['db'], 'function', - $GLOBALS['dbi']->getProceduresOrFunctions($GLOBALS['db'], 'FUNCTION') + Routines::getFunctionNames($GLOBALS['dbi'], $GLOBALS['db']) ); } @@ -331,7 +331,7 @@ class ExportXml extends ExportPlugin $head .= $this->exportDefinitions( $GLOBALS['db'], 'procedure', - $GLOBALS['dbi']->getProceduresOrFunctions($GLOBALS['db'], 'PROCEDURE') + Routines::getProcedureNames($GLOBALS['dbi'], $GLOBALS['db']) ); } diff --git a/psalm-baseline.xml b/psalm-baseline.xml index d6182431d5..17521d4cbd 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -5673,11 +5673,8 @@ <code>uksort($eachTables, 'strnatcasecmp')</code> <code>usort($tables, 'strnatcasecmp')</code> </MixedArgumentTypeCoercion> - <MixedArrayAccess occurrences="8"> + <MixedArrayAccess occurrences="5"> <code>$link</code> - <code>$oneShow['Db']</code> - <code>$oneShow['Name']</code> - <code>$oneShow['Type']</code> <code>$tableData[$sortBy]</code> <code>$tableData['Data_length']</code> <code>$tableData['Engine']</code> @@ -5695,7 +5692,7 @@ <code>$this->links[$link]</code> <code>$this->links[$link]</code> </MixedArrayOffset> - <MixedAssignment occurrences="21"> + <MixedAssignment occurrences="19"> <code>$aLength</code> <code>$bLength</code> <code>$database</code> @@ -5705,11 +5702,9 @@ <code>$grant</code> <code>$keyIndex</code> <code>$map['real_column']</code> - <code>$oneShow</code> <code>$resultRows[$row[$key]]</code> <code>$resultRows[]</code> <code>$resultTarget</code> - <code>$result[]</code> <code>$table</code> <code>$tableData</code> <code>$tableData</code> @@ -5734,12 +5729,10 @@ <code>SessionCache::get('mysql_cur_user')</code> <code>reset($columns)</code> </MixedReturnStatement> - <MixedReturnTypeCoercion occurrences="6"> - <code>$result</code> + <MixedReturnTypeCoercion occurrences="4"> <code>$this->fetchResult($sql, null, 'Field', $link)</code> <code>$this->fetchResult($sql, null, null, $link)</code> <code>string[]</code> - <code>string[]</code> </MixedReturnTypeCoercion> <NullableReturnStatement occurrences="2"> <code>$user</code> diff --git a/test/classes/Database/RoutinesTest.php b/test/classes/Database/RoutinesTest.php index 9b166c7837..aac3f5997e 100644 --- a/test/classes/Database/RoutinesTest.php +++ b/test/classes/Database/RoutinesTest.php @@ -1433,4 +1433,84 @@ class RoutinesTest extends AbstractTestCase ], ]; } + + public function testGetFunctionNames(): void + { + $dbiDummy = $this->createDbiDummy(); + $dbiDummy->addResult( + 'SHOW FUNCTION STATUS;', + [ + ['db_test', 'test_func', 'FUNCTION'], + ['test_db', 'test_func1', 'FUNCTION'], + ['test_db', '', 'FUNCTION'], + ['test_db', 'test_func2', 'FUNCTION'], + ['test_db', 'test_func', 'PROCEDURE'], + ], + ['Db', 'Name', 'Type'] + ); + + $names = Routines::getFunctionNames($this->createDatabaseInterface($dbiDummy), 'test_db'); + $this->assertSame(['test_func1', 'test_func2'], $names); + + $dbiDummy->assertAllQueriesConsumed(); + } + + public function testGetFunctionNamesWithEmptyReturn(): void + { + $dbiDummy = $this->createDbiDummy(); + $dbiDummy->addResult( + 'SHOW FUNCTION STATUS;', + [ + ['db_test', 'test_func', 'FUNCTION'], + ['test_db', '', 'FUNCTION'], + ['test_db', 'test_func', 'PROCEDURE'], + ], + ['Db', 'Name', 'Type'] + ); + + $names = Routines::getFunctionNames($this->createDatabaseInterface($dbiDummy), 'test_db'); + $this->assertSame([], $names); + + $dbiDummy->assertAllQueriesConsumed(); + } + + public function testGetProcedureNames(): void + { + $dbiDummy = $this->createDbiDummy(); + $dbiDummy->addResult( + 'SHOW PROCEDURE STATUS;', + [ + ['db_test', 'test_proc', 'PROCEDURE'], + ['test_db', 'test_proc1', 'PROCEDURE'], + ['test_db', '', 'PROCEDURE'], + ['test_db', 'test_proc2', 'PROCEDURE'], + ['test_db', 'test_proc', 'FUNCTION'], + ], + ['Db', 'Name', 'Type'] + ); + + $names = Routines::getProcedureNames($this->createDatabaseInterface($dbiDummy), 'test_db'); + $this->assertSame(['test_proc1', 'test_proc2'], $names); + + $dbiDummy->assertAllQueriesConsumed(); + } + + public function testGetProcedureNamesWithEmptyReturn(): void + { + $dbiDummy = $this->createDbiDummy(); + $dbiDummy->addResult( + 'SHOW PROCEDURE STATUS;', + [ + ['db_test', 'test_proc', 'PROCEDURE'], + ['test_db', '', 'PROCEDURE'], + ['test_db', 'test_proc', 'FUNCTION'], + ], + ['Db', 'Name', 'Type'] + ); + + $names = Routines::getProcedureNames($this->createDatabaseInterface($dbiDummy), 'test_db'); + $this->assertSame([], $names); + + $dbiDummy->assertAllQueriesConsumed(); + } } diff --git a/test/classes/Plugins/Export/ExportXmlTest.php b/test/classes/Plugins/Export/ExportXmlTest.php index a2bff35a19..d5b66a9072 100644 --- a/test/classes/Plugins/Export/ExportXmlTest.php +++ b/test/classes/Plugins/Export/ExportXmlTest.php @@ -215,17 +215,12 @@ class ExportXmlTest extends AbstractTestCase 'DEFINER' => 'test_user@localhost', ], ]; + $functions = [['Db' => 'd<"b', 'Name' => 'fn', 'Type' => 'FUNCTION']]; + $procedures = [['Db' => 'd<"b', 'Name' => 'pr', 'Type' => 'PROCEDURE']]; - $dbi->expects($this->exactly(4)) + $dbi->expects($this->exactly(6)) ->method('fetchResult') - ->willReturnOnConsecutiveCalls($result, $result, [], $triggers); - - $dbi->expects($this->exactly(2)) - ->method('getProceduresOrFunctions') - ->willReturnOnConsecutiveCalls( - ['fn'], - ['pr'] - ); + ->willReturnOnConsecutiveCalls($result, $result, [], $triggers, $functions, $procedures); $dbi->expects($this->exactly(2)) ->method('fetchValue') |