Skip to content

Commit 79ca4a4

Browse files
committed
added Connection::getLastQuery(), Result::getQuery(), DriverException::getQuery(), replaces getSql() and getParameters() pairs
1 parent 8fdcc0d commit 79ca4a4

File tree

12 files changed

+77
-49
lines changed

12 files changed

+77
-49
lines changed

src/Bridges/DatabaseTracy/ConnectionPanel.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ private function logQuery(Connection $connection, $result): void
8686
if ($result instanceof Result) {
8787
$this->totalTime += $result->getTime();
8888
if ($this->count < $this->maxQueries) {
89-
$this->events[] = [$connection, $result->getQueryString(), $result->getParameters(), $trace, $result->getTime(), $result->getRowCount(), null];
89+
$this->events[] = [$connection, $result->getQuery(), $trace, $result->getTime(), $result->getRowCount(), null];
9090
}
9191
} elseif ($result instanceof DriverException && $this->count < $this->maxQueries) {
92-
$this->events[] = [$connection, $result->getQueryString(), null, $trace, null, null, $result->getMessage()];
92+
$this->events[] = [$connection, $result->getQuery(), $trace, null, null, $result->getMessage()];
9393
}
9494
}
9595

@@ -100,10 +100,9 @@ public static function renderException(?\Throwable $e): ?array
100100
return null;
101101
}
102102

103-
$sql = $e->getQueryString();
104-
return $sql ? [
103+
return $e->getQuery() ? [
105104
'tab' => 'SQL',
106-
'panel' => Helpers::dumpSql($sql, $e->params ?? []),
105+
'panel' => Helpers::dumpSql($e->getQuery()),
107106
] : null;
108107
}
109108

@@ -127,8 +126,9 @@ public function getPanel(): ?string
127126

128127
$events = [];
129128
foreach ($this->events as $event) {
130-
[$connection, $sql, $params, , , , $error] = $event;
129+
[$connection, $query, , , , $error] = $event;
131130
$explain = null;
131+
$sql = $query->getSql();
132132
$command = preg_match('#\s*\(?\s*(SELECT|INSERT|UPDATE|DELETE)\s#iA', $sql, $m)
133133
? strtolower($m[1])
134134
: null;
@@ -137,7 +137,7 @@ public function getPanel(): ?string
137137
$cmd = is_string($this->explain)
138138
? $this->explain
139139
: 'EXPLAIN';
140-
$rows = $connection->getConnection()->query("$cmd $sql", $params);
140+
$rows = $connection->getConnection()->query("$cmd $sql", $query->getParameters());
141141
for ($explain = []; $row = $rows->fetch(); $explain[] = $row);
142142
} catch (DriverException) {
143143
}

src/Bridges/DatabaseTracy/dist/panel.phtml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ declare(strict_types=1);
2424
<th style="width: 1%">Rows</th>
2525
</tr>
2626

27-
<?php foreach ($events as [$connection, $sql, $params, $trace, $time, $rows, $error, $command, $explain]): ?> <tr>
27+
<?php foreach ($events as [$connection, $query, $trace, $time, $rows, $error, $command, $explain]): ?> <tr>
2828
<td style="background:rgba(255, 95, 23, <?= Tracy\Helpers::escapeHtml(sprintf('%0.3f', log($time * 1000 + 1, 10) * $performanceScale)) ?>
2929
)" data-order="<?= Tracy\Helpers::escapeHtml((float) $time) ?>
3030
">
@@ -44,7 +44,7 @@ declare(strict_types=1);
4444

4545
<td class="nette-DbConnectionPanel-sql nette-DbConnectionPanel-sql-<?= Tracy\Helpers::escapeHtml($command) ?>
4646
">
47-
<?= Nette\Database\Helpers::dumpSql($sql, $params, $connection) ?>
47+
<?= Nette\Database\Helpers::dumpSql($query, $connection) ?>
4848

4949

5050
<?php if ($explain): ?> <table class="tracy-collapsed nette-DbConnectionPanel-explain">

src/Bridges/DatabaseTracy/panel.latte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<th style="width: 1%">Rows</th>
1818
</tr>
1919

20-
{foreach $events as [$connection, $sql, $params, $trace, $time, $rows, $error, $command, $explain]}
20+
{foreach $events as [$connection, $query, $trace, $time, $rows, $error, $command, $explain]}
2121
<tr>
2222
<td style="background:rgba(255, 95, 23, {sprintf('%0.3f', log($time * 1000 + 1, 10) * $performanceScale)})" data-order="{=(float) $time}">
2323
{if $error}
@@ -30,7 +30,7 @@
3030
</td>
3131

3232
<td class="nette-DbConnectionPanel-sql nette-DbConnectionPanel-sql-{$command}">
33-
{Nette\Database\Helpers::dumpSql($sql, $params, $connection)|noescape}
33+
{Nette\Database\Helpers::dumpSql($query, $connection)|noescape}
3434

3535
{if $explain}
3636
<table class="tracy-collapsed nette-DbConnectionPanel-explain">

src/Database/Connection.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class Connection
4040
private Drivers\Engine $engine;
4141
private SqlPreprocessor $preprocessor;
4242
private TypeConverter $typeConverter;
43-
private ?string $sql = null;
43+
private ?SqlLiteral $lastQuery = null;
4444
private int $transactionDepth = 0;
4545

4646

@@ -268,10 +268,10 @@ public function transaction(callable $callback): mixed
268268
*/
269269
public function query(#[Language('SQL')] string $sql, #[Language('GenericSQL')] ...$params): Result
270270
{
271-
[$this->sql, $params] = $this->preprocess($sql, ...$params);
271+
[$sql, $params] = $this->preprocess($sql, ...$params);
272272
return $this->logOperation(
273-
fn() => $this->connection->query($this->sql, $params),
274-
new SqlLiteral($this->sql, $params),
273+
fn() => $this->connection->query($sql, $params),
274+
$this->lastQuery = new SqlLiteral($sql, $params),
275275
);
276276
}
277277

@@ -310,15 +310,23 @@ private function logOperation(\Closure $callback, SqlLiteral $query): Result
310310
throw $e;
311311
}
312312

313-
$result = new Result($this, $query->getSql(), $query->getParameters(), $result, $time);
313+
$result = new Result($this, $query, $result, $time);
314314
Arrays::invoke($this->onQuery, $this, $result);
315315
return $result;
316316
}
317317

318318

319+
public function getLastQuery(): ?SqlLiteral
320+
{
321+
return $this->lastQuery;
322+
}
323+
324+
325+
/** @deprecated use getLastQuery()->getSql() */
319326
public function getLastQueryString(): ?string
320327
{
321-
return $this->sql;
328+
trigger_error(__METHOD__ . '() is deprecated, use getLastQuery()->getSql()', E_USER_DEPRECATED);
329+
return $this->lastQuery?->getSql();
322330
}
323331

324332

src/Database/DriverException.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,20 @@ public function getSqlState(): ?string
4545
}
4646

4747

48+
public function getQuery(): ?SqlLiteral
49+
{
50+
return $this->query;
51+
}
52+
53+
54+
/** @deprecated use getQuery()->getSql() */
4855
public function getQueryString(): ?string
4956
{
5057
return $this->query?->getSql();
5158
}
5259

5360

61+
/** @deprecated use getQuery()->getParameters() */
5462
public function getParameters(): ?array
5563
{
5664
return $this->query?->getParameters();

src/Database/Helpers.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Helpers
3030
*/
3131
public static function dumpResult(Result $result): void
3232
{
33-
echo "\n<table class=\"dump\">\n<caption>" . htmlspecialchars($result->getQueryString(), ENT_IGNORE, 'UTF-8') . "</caption>\n";
33+
echo "\n<table class=\"dump\">\n<caption>" . htmlspecialchars($result->getQuery()->getSql(), ENT_IGNORE, 'UTF-8') . "</caption>\n";
3434
if (!$result->getColumnCount()) {
3535
echo "\t<tr>\n\t\t<th>Affected rows:</th>\n\t\t<td>", $result->getRowCount(), "</td>\n\t</tr>\n</table>\n";
3636
return;
@@ -75,12 +75,13 @@ public static function dumpResult(Result $result): void
7575
/**
7676
* Returns syntax highlighted SQL command.
7777
*/
78-
public static function dumpSql(string $sql, ?array $params = null, ?Connection $connection = null): string
78+
public static function dumpSql(SqlLiteral $query, ?Connection $connection = null): string
7979
{
8080
$keywords1 = 'SELECT|(?:ON\s+DUPLICATE\s+KEY)?UPDATE|INSERT(?:\s+INTO)?|REPLACE(?:\s+INTO)?|DELETE|CALL|UNION|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|OFFSET|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN|TRUNCATE';
8181
$keywords2 = 'ALL|DISTINCT|DISTINCTROW|IGNORE|AS|USING|ON|AND|OR|IN|IS|NOT|NULL|[RI]?LIKE|REGEXP|TRUE|FALSE';
8282

8383
// insert new lines
84+
$sql = $query->getSql();
8485
$sql = " $sql ";
8586
$sql = preg_replace("#(?<=[\\s,(])($keywords1)(?=[\\s,)])#i", "\n\$1", $sql);
8687

@@ -108,14 +109,14 @@ public static function dumpSql(string $sql, ?array $params = null, ?Connection $
108109
}, $sql);
109110

110111
// parameters
112+
$params = $query->getParameters();
111113
$sql = preg_replace_callback('#\?#', function () use ($params, $connection): string {
112114
static $i = 0;
113-
if (!isset($params[$i])) {
115+
$param = $params[$i++] ?? null;
116+
if ($param === null) {
114117
return '?';
115-
}
116118

117-
$param = $params[$i++];
118-
if (
119+
} elseif (
119120
is_string($param)
120121
&& (
121122
preg_match('#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u', $param)

src/Database/Result.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ class Result implements \Iterator
2828

2929
public function __construct(
3030
private readonly Connection $connection,
31-
private readonly string $queryString,
32-
private readonly array $params,
31+
private readonly SqlLiteral $query,
3332
private readonly ?Drivers\Result $result,
3433
private float $time,
3534
) {
@@ -44,15 +43,23 @@ public function getConnection(): Connection
4443
}
4544

4645

46+
public function getQuery(): SqlLiteral
47+
{
48+
return $this->query;
49+
}
50+
51+
52+
/** @deprecated use getQuery()->getSql() */
4753
public function getQueryString(): string
4854
{
49-
return $this->queryString;
55+
return $this->query->getSql();
5056
}
5157

5258

59+
/** @deprecated use getQuery()->getParameters() */
5360
public function getParameters(): array
5461
{
55-
return $this->params;
62+
return $this->query->getParameters();
5663
}
5764

5865

tests/Database/Connection.query.phpt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@ Nette\Database\Helpers::loadFromFile($connection, __DIR__ . "/files/{$driverName
1818
test('executes parameterized query and returns ResultSet', function () use ($connection) {
1919
$res = $connection->query('SELECT id FROM author WHERE id = ?', 11);
2020
Assert::type(Nette\Database\Result::class, $res);
21-
Assert::same('SELECT id FROM author WHERE id = ?', $res->getQueryString());
22-
Assert::same([11], $res->getParameters());
23-
Assert::same('SELECT id FROM author WHERE id = ?', $connection->getLastQueryString());
21+
Assert::same('SELECT id FROM author WHERE id = ?', $res->getQuery()->getSql());
22+
Assert::same([11], $res->getQuery()->getParameters());
23+
Assert::same('SELECT id FROM author WHERE id = ?', $connection->getLastQuery()->getSql());
2424
});
2525

2626

2727
test('multiple query parameters', function () use ($connection) {
2828
$res = $connection->query('SELECT id FROM author WHERE id = ? OR id = ?', 11, 12);
29-
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQueryString());
30-
Assert::same([11, 12], $res->getParameters());
29+
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQuery()->getSql());
30+
Assert::same([11, 12], $res->getQuery()->getParameters());
3131
});
3232

3333

3434
test('query with array of parameters', function () use ($connection) {
3535
$res = @$connection->queryArgs('SELECT id FROM author WHERE id = ? OR id = ?', [11, 12]); // is deprecated
36-
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQueryString());
37-
Assert::same([11, 12], $res->getParameters());
36+
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQuery()->getSql());
37+
Assert::same([11, 12], $res->getQuery()->getParameters());
3838
});

tests/Database/Explorer.query.phpt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,20 @@ Nette\Database\Helpers::loadFromFile($connection, __DIR__ . "/files/{$driverName
2020
test('parameterized query through explorer', function () use ($explorer) {
2121
$res = $explorer->query('SELECT id FROM author WHERE id = ?', 11);
2222
Assert::type(Nette\Database\Result::class, $res);
23-
Assert::same('SELECT id FROM author WHERE id = ?', $res->getQueryString());
24-
Assert::same([11], $res->getParameters());
23+
Assert::same('SELECT id FROM author WHERE id = ?', $res->getQuery()->getSql());
24+
Assert::same([11], $res->getQuery()->getParameters());
2525
});
2626

2727

2828
test('multiple parameters in explorer query', function () use ($explorer) {
2929
$res = $explorer->query('SELECT id FROM author WHERE id = ? OR id = ?', 11, 12);
30-
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQueryString());
31-
Assert::same([11, 12], $res->getParameters());
30+
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQuery()->getSql());
31+
Assert::same([11, 12], $res->getQuery()->getParameters());
3232
});
3333

3434

3535
test('explorer query with array of parameters', function () use ($explorer) {
3636
$res = @$explorer->queryArgs('SELECT id FROM author WHERE id = ? OR id = ?', [11, 12]); // is deprecated
37-
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQueryString());
38-
Assert::same([11, 12], $res->getParameters());
37+
Assert::same('SELECT id FROM author WHERE id = ? OR id = ?', $res->getQuery()->getSql());
38+
Assert::same([11, 12], $res->getQuery()->getParameters());
3939
});

tests/Database/Explorer/Explorer.cache.observer.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ $explorer = new Nette\Database\Explorer($connection, $explorer->getStructure(),
2727

2828
$queries = 0;
2929
$connection->onQuery[] = function ($dao, Result $result) use (&$queries) {
30-
if (!preg_match('#SHOW|CONSTRAINT_NAME|information_schema|pg_catalog|sys\.|SET|PRAGMA|FROM sqlite_#i', $result->getQueryString())) {
30+
if (!preg_match('#SHOW|CONSTRAINT_NAME|information_schema|pg_catalog|sys\.|SET|PRAGMA|FROM sqlite_#i', $result->getQuery()->getSql())) {
3131
$queries++;
3232
}
3333
};

0 commit comments

Comments
 (0)