Merge pull request #18047 from kamil-tekiela/columnMap

Move getColumnMapFromSql() to SystemDatabase
This commit is contained in:
Maurício Meneghini Fauth 2023-02-15 10:54:57 -03:00 committed by GitHub
commit 4d756588d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 87 additions and 143 deletions

View File

@ -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,

View File

@ -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<array<string, mixed>>
*/
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

View File

@ -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

View File

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
namespace PhpMyAdmin;
class SystemColumn
{
public function __construct(
public readonly string $tableName,
public readonly string $referringColumn,
public readonly ?string $realColumn
) {
}
}

View File

@ -58,7 +58,7 @@ class SystemDatabase
* Get SQL query for store new transformation details of a VIEW
*
* @param ResultInterface $transformationData Result set of SQL execution
* @param array $columnMap Details of VIEW columns
* @param SystemColumn[] $columnMap Details of VIEW columns
* @param string $viewName Name of the VIEW
* @param string $db Database name of the VIEW
*
@ -91,8 +91,8 @@ class SystemDatabase
while ($dataRow = $transformationData->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<SystemColumn>
*/
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;
}
}

View File

@ -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

View File

@ -6901,7 +6901,6 @@
<code>$aLength</code>
<code>$bLength</code>
<code>$keyIndex</code>
<code>$map['real_column']</code>
<code>$resultRows[$row[$key]]</code>
<code>$resultTarget</code>
<code>$resultTarget</code>
@ -14960,18 +14959,6 @@
</PossiblyNullArrayOffset>
</file>
<file src="libraries/classes/SystemDatabase.php">
<MixedArgument>
<code>$column['real_column'] ?? $column['refering_column']</code>
</MixedArgument>
<MixedArrayAccess>
<code>$column['real_column']</code>
<code>$column['refering_column']</code>
<code>$column['refering_column']</code>
<code>$column['table_name']</code>
</MixedArrayAccess>
<MixedAssignment>
<code>$column</code>
</MixedAssignment>
<PossiblyNullArgument>
<code>$dataRow['comment']</code>
<code>$dataRow['mimetype']</code>

View File

@ -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.
*/

View File

@ -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();
}
}