Skip to content

Commit e53c76d

Browse files
Merge pull request #18857 from kamil-tekiela/SqlAutoCompleteController
New implementation for SqlAutoCompleteController
2 parents f43da40 + 3225c6d commit e53c76d

4 files changed

Lines changed: 43 additions & 48 deletions

File tree

app/services_controllers.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,12 @@
225225
],
226226
Database\SqlAutoCompleteController::class => [
227227
'class' => Database\SqlAutoCompleteController::class,
228-
'arguments' => ['$response' => '@response', '$template' => '@template', '$dbi' => '@dbi'],
228+
'arguments' => [
229+
'$response' => '@response',
230+
'$template' => '@template',
231+
'$dbi' => '@dbi',
232+
'$config' => '@config',
233+
],
229234
],
230235
Database\SqlController::class => [
231236
'class' => Database\SqlController::class,

phpstan-baseline.neon

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,21 +1985,6 @@ parameters:
19851985
count: 1
19861986
path: src/Controllers/Database/SearchController.php
19871987

1988-
-
1989-
message: "#^Only booleans are allowed in an if condition, mixed given\\.$#"
1990-
count: 1
1991-
path: src/Controllers/Database/SqlAutoCompleteController.php
1992-
1993-
-
1994-
message: "#^Parameter \\#1 \\$database of method PhpMyAdmin\\\\DatabaseInterface\\:\\:getColumns\\(\\) expects string, mixed given\\.$#"
1995-
count: 1
1996-
path: src/Controllers/Database/SqlAutoCompleteController.php
1997-
1998-
-
1999-
message: "#^Parameter \\#1 \\$database of method PhpMyAdmin\\\\DatabaseInterface\\:\\:getTables\\(\\) expects string, mixed given\\.$#"
2000-
count: 1
2001-
path: src/Controllers/Database/SqlAutoCompleteController.php
2002-
20031988
-
20041989
message: "#^Parameter \\#1 \\$string of function htmlspecialchars expects string, mixed given\\.$#"
20051990
count: 1

psalm-baseline.xml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,15 +1279,6 @@
12791279
</PossiblyUnusedMethod>
12801280
</file>
12811281
<file src="src/Controllers/Database/SqlAutoCompleteController.php">
1282-
<DeprecatedMethod>
1283-
<code>Config::getInstance()</code>
1284-
</DeprecatedMethod>
1285-
<MixedArgument>
1286-
<code>$db</code>
1287-
</MixedArgument>
1288-
<MixedAssignment>
1289-
<code>$db</code>
1290-
</MixedAssignment>
12911282
<PossiblyUnusedMethod>
12921283
<code>__construct</code>
12931284
</PossiblyUnusedMethod>

src/Controllers/Database/SqlAutoCompleteController.php

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,65 @@
44

55
namespace PhpMyAdmin\Controllers\Database;
66

7-
use PhpMyAdmin\Column;
87
use PhpMyAdmin\Config;
98
use PhpMyAdmin\Controllers\AbstractController;
10-
use PhpMyAdmin\Current;
119
use PhpMyAdmin\DatabaseInterface;
1210
use PhpMyAdmin\Http\ServerRequest;
11+
use PhpMyAdmin\Identifiers\DatabaseName;
1312
use PhpMyAdmin\ResponseRenderer;
1413
use PhpMyAdmin\Template;
1514

16-
use function array_map;
17-
use function array_values;
15+
use function sprintf;
1816

1917
/**
2018
* Table/Column autocomplete in SQL editors.
2119
*/
2220
class SqlAutoCompleteController extends AbstractController
2321
{
24-
public function __construct(ResponseRenderer $response, Template $template, private DatabaseInterface $dbi)
25-
{
22+
public function __construct(
23+
ResponseRenderer $response,
24+
Template $template,
25+
private readonly DatabaseInterface $dbi,
26+
private readonly Config $config,
27+
) {
2628
parent::__construct($response, $template);
2729
}
2830

2931
public function __invoke(ServerRequest $request): void
3032
{
3133
$sqlAutocomplete = [];
32-
if (Config::getInstance()->settings['EnableAutocompleteForTablesAndColumns']) {
33-
$db = $request->getParam('db', Current::$database);
34-
if ($db) {
35-
$tableNames = $this->dbi->getTables($db);
36-
foreach ($tableNames as $tableName) {
37-
$sqlAutocomplete[$tableName] = array_map(
38-
static fn (Column $field): array => [
39-
'field' => $field->field,
40-
'columnHint' => $field->type . match ($field->key) {
41-
'PRI' => ' | Primary',
42-
'UNI' => ' | Unique',
43-
default=> ''
44-
},
45-
],
46-
array_values($this->dbi->getColumns($db, $tableName)),
47-
);
48-
}
34+
if ($this->config->settings['EnableAutocompleteForTablesAndColumns']) {
35+
$db = DatabaseName::tryFrom($request->getParam('db'));
36+
if ($db !== null) {
37+
$sqlAutocomplete = $this->getColumnList($db);
4938
}
5039
}
5140

5241
$this->response->addJSON(['tables' => $sqlAutocomplete]);
5342
}
43+
44+
/** @return string[][][] */
45+
private function getColumnList(DatabaseName $db): array
46+
{
47+
$columns = $this->dbi->query(sprintf(
48+
'SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_KEY ' .
49+
'FROM information_schema.columns WHERE table_schema = %s',
50+
$this->dbi->quoteString($db->getName()),
51+
));
52+
53+
$autocompleteList = [];
54+
/** @var array{TABLE_NAME:string, COLUMN_NAME:string, COLUMN_TYPE:string, COLUMN_KEY:string} $columnInfo */
55+
foreach ($columns as $columnInfo) {
56+
$autocompleteList[$columnInfo['TABLE_NAME']][] = [
57+
'field' => $columnInfo['COLUMN_NAME'],
58+
'columnHint' => $columnInfo['COLUMN_TYPE'] . match ($columnInfo['COLUMN_KEY']) {
59+
'PRI' => ' | Primary',
60+
'UNI' => ' | Unique',
61+
default=> ''
62+
},
63+
];
64+
}
65+
66+
return $autocompleteList;
67+
}
5468
}

0 commit comments

Comments
 (0)