Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpmyadmin/phpmyadmin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurício Meneghini Fauth <mauricio@fauth.dev>2022-09-11 23:32:44 +0300
committerMaurício Meneghini Fauth <mauricio@fauth.dev>2022-09-11 23:32:44 +0300
commite96fab654df405595b9f42c5a4eba04f80344cc1 (patch)
tree983c3c570d2e6ea5114d84123dc4fca20ec0b38c
parent7975f5fb05befd63e10408a9c34a3ffff56a2515 (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.php40
-rw-r--r--libraries/classes/DatabaseInterface.php27
-rw-r--r--libraries/classes/Dbal/DbalInterface.php15
-rw-r--r--libraries/classes/Operations.php4
-rw-r--r--libraries/classes/Plugins/Export/ExportSql.php4
-rw-r--r--libraries/classes/Plugins/Export/ExportXml.php4
-rw-r--r--psalm-baseline.xml13
-rw-r--r--test/classes/Database/RoutinesTest.php80
-rw-r--r--test/classes/Plugins/Export/ExportXmlTest.php13
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-&gt;links[$link]</code>
<code>$this-&gt;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-&gt;fetchResult($sql, null, 'Field', $link)</code>
<code>$this-&gt;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')