From 164bf08f4cf996860f3ed2d9947e6f59bb4b4f11 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sat, 28 Jan 2023 23:22:31 +0000 Subject: [PATCH] Move getColumnMapFromSql() to SystemDatabase Signed-off-by: Kamil Tekiela --- .../Controllers/View/CreateController.php | 3 +- libraries/classes/DatabaseInterface.php | 38 -------------- libraries/classes/Dbal/DbalInterface.php | 10 ---- libraries/classes/SystemColumn.php | 15 ++++++ libraries/classes/SystemDatabase.php | 31 +++++++++-- phpstan-baseline.neon | 20 ------- psalm-baseline.xml | 13 ----- test/classes/DatabaseInterfaceTest.php | 52 ------------------- test/classes/SystemDatabaseTest.php | 48 +++++++++++++++-- 9 files changed, 87 insertions(+), 143 deletions(-) create mode 100644 libraries/classes/SystemColumn.php diff --git a/libraries/classes/Controllers/View/CreateController.php b/libraries/classes/Controllers/View/CreateController.php index 9768dbdd1c..ba8a034d48 100644 --- a/libraries/classes/Controllers/View/CreateController.php +++ b/libraries/classes/Controllers/View/CreateController.php @@ -170,12 +170,11 @@ class CreateController extends AbstractController $viewColumns = explode(',', $view['column_names']); } - $columnMap = $this->dbi->getColumnMapFromSql($view['as'], $viewColumns); - $systemDb = $this->dbi->getSystemDatabase(); $pmaTransformationData = $systemDb->getExistingTransformationData($GLOBALS['db']); if ($pmaTransformationData !== false) { + $columnMap = $systemDb->getColumnMapFromSql($view['as'], $viewColumns); // SQL for store new transformation details of VIEW $newTransformationsSql = $systemDb->getNewTransformationDataSql( $pmaTransformationData, diff --git a/libraries/classes/DatabaseInterface.php b/libraries/classes/DatabaseInterface.php index e4898b55d3..ace236a418 100644 --- a/libraries/classes/DatabaseInterface.php +++ b/libraries/classes/DatabaseInterface.php @@ -765,44 +765,6 @@ class DatabaseInterface implements DbalInterface return $databases; } - /** - * returns detailed array with all columns for sql - * - * @param string $sqlQuery target SQL query to get columns - * @param array $viewColumns alias for columns - * - * @return array - * @psalm-return list> - */ - public function getColumnMapFromSql(string $sqlQuery, array $viewColumns = []): array - { - $result = $this->tryQuery($sqlQuery); - - if ($result === false) { - return []; - } - - $meta = $this->getFieldsMeta($result); - - $columnMap = []; - $nbColumns = count($viewColumns); - - foreach ($meta as $i => $field) { - $map = [ - 'table_name' => $field->table, - 'refering_column' => $field->name, - ]; - - if ($nbColumns >= $i) { - $map['real_column'] = $viewColumns[$i]; - } - - $columnMap[] = $map; - } - - return $columnMap; - } - /** * returns detailed array with all columns for given table in database, * or all tables/databases diff --git a/libraries/classes/Dbal/DbalInterface.php b/libraries/classes/Dbal/DbalInterface.php index 04808a6509..d151b09ba1 100644 --- a/libraries/classes/Dbal/DbalInterface.php +++ b/libraries/classes/Dbal/DbalInterface.php @@ -147,16 +147,6 @@ interface DbalInterface $limitCount = false ): array; - /** - * returns detailed array with all columns for sql - * - * @param string $sqlQuery target SQL query to get columns - * @param array $viewColumns alias for columns - * - * @return array - */ - public function getColumnMapFromSql(string $sqlQuery, array $viewColumns = []): array; - /** * returns detailed array with all columns for given table in database, * or all tables/databases diff --git a/libraries/classes/SystemColumn.php b/libraries/classes/SystemColumn.php new file mode 100644 index 0000000000..f1192ff3bd --- /dev/null +++ b/libraries/classes/SystemColumn.php @@ -0,0 +1,15 @@ +fetchAssoc()) { foreach ($columnMap as $column) { if ( - $dataRow['table_name'] != $column['table_name'] - || $dataRow['column_name'] != $column['refering_column'] + $dataRow['table_name'] != $column->tableName + || $dataRow['column_name'] != $column->referringColumn ) { continue; } @@ -102,7 +102,7 @@ class SystemDatabase $addComma ? ', ' : '', $this->dbi->quoteString($db), $this->dbi->quoteString($viewName), - $this->dbi->quoteString($column['real_column'] ?? $column['refering_column']), + $this->dbi->quoteString($column->realColumn ?? $column->referringColumn), $this->dbi->quoteString($dataRow['comment']), $this->dbi->quoteString($dataRow['mimetype']), $this->dbi->quoteString($dataRow['transformation']), @@ -121,4 +121,27 @@ class SystemDatabase return $columnCount > 0 ? $newTransformationsSql : ''; } + + /** + * @param string[] $viewColumns + * + * @return SystemColumn[] + * @psalm-return list + */ + public function getColumnMapFromSql(string $sqlQuery, array $viewColumns): array + { + $result = $this->dbi->tryQuery($sqlQuery); + + if ($result === false) { + return []; + } + + $columnMap = []; + + foreach ($this->dbi->getFieldsMeta($result) as $i => $field) { + $columnMap[] = new SystemColumn($field->table, $field->name, $viewColumns[$i] ?? null); + } + + return $columnMap; + } } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 8a2240fc41..d78de806a8 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -3440,11 +3440,6 @@ parameters: count: 1 path: libraries/classes/DatabaseInterface.php - - - message: "#^Method PhpMyAdmin\\\\DatabaseInterface\\:\\:getColumnMapFromSql\\(\\) has parameter \\$viewColumns with no value type specified in iterable type array\\.$#" - count: 1 - path: libraries/classes/DatabaseInterface.php - - message: "#^Method PhpMyAdmin\\\\DatabaseInterface\\:\\:getColumns\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -3525,16 +3520,6 @@ parameters: count: 1 path: libraries/classes/Dbal/DbalInterface.php - - - message: "#^Method PhpMyAdmin\\\\Dbal\\\\DbalInterface\\:\\:getColumnMapFromSql\\(\\) has parameter \\$viewColumns with no value type specified in iterable type array\\.$#" - count: 1 - path: libraries/classes/Dbal/DbalInterface.php - - - - message: "#^Method PhpMyAdmin\\\\Dbal\\\\DbalInterface\\:\\:getColumnMapFromSql\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: libraries/classes/Dbal/DbalInterface.php - - message: "#^Method PhpMyAdmin\\\\Dbal\\\\DbalInterface\\:\\:getColumns\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -8630,11 +8615,6 @@ parameters: count: 1 path: libraries/classes/StorageEngine.php - - - message: "#^Method PhpMyAdmin\\\\SystemDatabase\\:\\:getNewTransformationDataSql\\(\\) has parameter \\$columnMap with no value type specified in iterable type array\\.$#" - count: 1 - path: libraries/classes/SystemDatabase.php - - message: "#^Parameter \\#1 \\$str of method PhpMyAdmin\\\\DatabaseInterface\\:\\:quoteString\\(\\) expects string, string\\|null given\\.$#" count: 4 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 208c9b0cde..28d4bfebd8 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -6901,7 +6901,6 @@ $aLength $bLength $keyIndex - $map['real_column'] $resultRows[$row[$key]] $resultTarget $resultTarget @@ -14960,18 +14959,6 @@ - - $column['real_column'] ?? $column['refering_column'] - - - $column['real_column'] - $column['refering_column'] - $column['refering_column'] - $column['table_name'] - - - $column - $dataRow['comment'] $dataRow['mimetype'] diff --git a/test/classes/DatabaseInterfaceTest.php b/test/classes/DatabaseInterfaceTest.php index 676fa66ac9..db9226dbf9 100644 --- a/test/classes/DatabaseInterfaceTest.php +++ b/test/classes/DatabaseInterfaceTest.php @@ -106,58 +106,6 @@ class DatabaseInterfaceTest extends AbstractTestCase ]; } - /** - * Tests for DBI::getColumnMapFromSql() method. - */ - public function testPMAGetColumnMap(): void - { - $dummyDbi = $this->createDbiDummy(); - $dbi = $this->createDatabaseInterface($dummyDbi); - - $dummyDbi->addResult( - 'PMA_sql_query', - [true], - [], - [ - (object) [ - 'table' => 'meta1_table', - 'name' => 'meta1_name', - ], - (object) [ - 'table' => 'meta2_table', - 'name' => 'meta2_name', - ], - ] - ); - - $sql_query = 'PMA_sql_query'; - $view_columns = [ - 'view_columns1', - 'view_columns2', - ]; - - $column_map = $dbi->getColumnMapFromSql($sql_query, $view_columns); - - $this->assertEquals( - [ - 'table_name' => 'meta1_table', - 'refering_column' => 'meta1_name', - 'real_column' => 'view_columns1', - ], - $column_map[0] - ); - $this->assertEquals( - [ - 'table_name' => 'meta2_table', - 'refering_column' => 'meta2_name', - 'real_column' => 'view_columns2', - ], - $column_map[1] - ); - - $dummyDbi->assertAllQueriesConsumed(); - } - /** * Tests for DBI::getSystemDatabase() method. */ diff --git a/test/classes/SystemDatabaseTest.php b/test/classes/SystemDatabaseTest.php index 74902b4ec6..25796fbda7 100644 --- a/test/classes/SystemDatabaseTest.php +++ b/test/classes/SystemDatabaseTest.php @@ -6,6 +6,7 @@ namespace PhpMyAdmin\Tests; use PhpMyAdmin\ConfigStorage\RelationParameters; use PhpMyAdmin\DatabaseInterface; +use PhpMyAdmin\SystemColumn; use PhpMyAdmin\SystemDatabase; use PhpMyAdmin\Tests\Stubs\DummyResult; @@ -102,10 +103,7 @@ class SystemDatabaseTest extends AbstractTestCase $db = 'PMA_db'; $column_map = [ - [ - 'table_name' => 'table_name', - 'refering_column' => 'column_name', - ], + new SystemColumn('table_name', 'column_name', null), ]; $view_name = 'view_name'; @@ -124,4 +122,46 @@ class SystemDatabaseTest extends AbstractTestCase $this->assertEquals($sql, $ret); } + + public function testGetColumnMapFromSql(): void + { + $dummyDbi = $this->createDbiDummy(); + $dbi = $this->createDatabaseInterface($dummyDbi); + + $dummyDbi->addResult( + 'PMA_sql_query', + [true], + [], + [ + (object) [ + 'table' => 'meta1_table', + 'name' => 'meta1_name', + ], + (object) [ + 'table' => 'meta2_table', + 'name' => 'meta2_name', + ], + ] + ); + + $sql_query = 'PMA_sql_query'; + $view_columns = [ + 'view_columns1', + 'view_columns2', + ]; + + $systemDatabase = new SystemDatabase($dbi); + $column_map = $systemDatabase->getColumnMapFromSql($sql_query, $view_columns); + + $this->assertEquals( + new SystemColumn('meta1_table', 'meta1_name', 'view_columns1'), + $column_map[0] + ); + $this->assertEquals( + new SystemColumn('meta2_table', 'meta2_name', 'view_columns2'), + $column_map[1] + ); + + $dummyDbi->assertAllQueriesConsumed(); + } }