Merge pull request #18047 from kamil-tekiela/columnMap
Move getColumnMapFromSql() to SystemDatabase
This commit is contained in:
commit
4d756588d3
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
15
libraries/classes/SystemColumn.php
Normal file
15
libraries/classes/SystemColumn.php
Normal 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
|
||||
) {
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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.
|
||||
*/
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user