Skip to content

Commit 403c915

Browse files
committed
added Connection::getLastQuery(), Result::getQuery(), DriverException::getQuery(), replaces getSql() and getParameters() pairs
1 parent afe5813 commit 403c915

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
@@ -87,10 +87,10 @@ private function logQuery(Connection $connection, $result): void
8787
if ($result instanceof Result) {
8888
$this->totalTime += $result->getTime();
8989
if ($this->count < $this->maxQueries) {
90-
$this->events[] = [$connection, $result->getQueryString(), $result->getParameters(), $trace, $result->getTime(), $result->getRowCount(), null];
90+
$this->events[] = [$connection, $result->getQuery(), $trace, $result->getTime(), $result->getRowCount(), null];
9191
}
9292
} elseif ($result instanceof DriverException && $this->count < $this->maxQueries) {
93-
$this->events[] = [$connection, $result->getQueryString(), null, $trace, null, null, $result->getMessage()];
93+
$this->events[] = [$connection, $result->getQuery(), $trace, null, null, $result->getMessage()];
9494
}
9595
}
9696

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

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

@@ -128,8 +127,9 @@ public function getPanel(): ?string
128127

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

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
@@ -41,7 +41,7 @@ class Connection
4141
private Drivers\Engine $engine;
4242
private SqlPreprocessor $preprocessor;
4343
private TypeConverter $typeConverter;
44-
private ?string $sql = null;
44+
private ?SqlLiteral $lastQuery = null;
4545
private int $transactionDepth = 0;
4646

4747

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

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

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

319319

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

325333

src/Database/DriverException.php

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

4949

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

5562

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

src/Database/Helpers.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Helpers
3232
*/
3333
public static function dumpResult(Result $result): void
3434
{
35-
echo "\n<table class=\"dump\">\n<caption>" . htmlspecialchars($result->getQueryString(), ENT_IGNORE, 'UTF-8') . "</caption>\n";
35+
echo "\n<table class=\"dump\">\n<caption>" . htmlspecialchars($result->getQuery()->getSql(), ENT_IGNORE, 'UTF-8') . "</caption>\n";
3636
if (!$result->getColumnCount()) {
3737
echo "\t<tr>\n\t\t<th>Affected rows:</th>\n\t\t<td>", $result->getRowCount(), "</td>\n\t</tr>\n</table>\n";
3838
return;
@@ -77,12 +77,13 @@ public static function dumpResult(Result $result): void
7777
/**
7878
* Returns syntax highlighted SQL command.
7979
*/
80-
public static function dumpSql(string $sql, ?array $params = null, ?Connection $connection = null): string
80+
public static function dumpSql(SqlLiteral $query, ?Connection $connection = null): string
8181
{
8282
$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';
8383
$keywords2 = 'ALL|DISTINCT|DISTINCTROW|IGNORE|AS|USING|ON|AND|OR|IN|IS|NOT|NULL|[RI]?LIKE|REGEXP|TRUE|FALSE';
8484

8585
// insert new lines
86+
$sql = $query->getSql();
8687
$sql = " $sql ";
8788
$sql = preg_replace("#(?<=[\\s,(])($keywords1)(?=[\\s,)])#i", "\n\$1", $sql);
8889

@@ -110,14 +111,14 @@ public static function dumpSql(string $sql, ?array $params = null, ?Connection $
110111
}, $sql);
111112

112113
// parameters
114+
$params = $query->getParameters();
113115
$sql = preg_replace_callback('#\?#', function () use ($params, $connection): string {
114116
static $i = 0;
115-
if (!isset($params[$i])) {
117+
$param = $params[$i++] ?? null;
118+
if ($param === null) {
116119
return '?';
117-
}
118120

119-
$param = $params[$i++];
120-
if (
121+
} elseif (
121122
is_string($param)
122123
&& (
123124
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
@@ -29,8 +29,7 @@ class Result implements \Iterator
2929

3030
public function __construct(
3131
private readonly Connection $connection,
32-
private readonly string $queryString,
33-
private readonly array $params,
32+
private readonly SqlLiteral $query,
3433
private readonly ?Drivers\Result $result,
3534
private float $time,
3635
) {
@@ -45,15 +44,23 @@ public function getConnection(): Connection
4544
}
4645

4746

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

5359

60+
/** @deprecated use getQuery()->getParameters() */
5461
public function getParameters(): array
5562
{
56-
return $this->params;
63+
return $this->query->getParameters();
5764
}
5865

5966

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)