Skip to content

Commit

Permalink
ConnectionPanel: added whole stack trace listing
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Jan 12, 2025
1 parent 3f5cd3a commit 486db4c
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 13 deletions.
10 changes: 5 additions & 5 deletions src/Bridges/DatabaseTracy/ConnectionPanel.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,24 +70,24 @@ private function logQuery(Connection $connection, $result): void

$this->count++;

$source = null;
$trace = $result instanceof \PDOException
? $result->getTrace()
? array_map(fn($row) => array_diff_key($row, ['args' => null]), $result->getTrace())
: debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);

foreach ($trace as $row) {
if (preg_match('~\.(php.?|phtml)$~', $row['file'] ?? '') && !$this->blueScreen->isCollapsed($row['file'])) {
$source = [$row['file'], (int) $row['line']];
break;
}
array_shift($trace);
}

if ($result instanceof Nette\Database\ResultSet) {
$this->totalTime += $result->getTime();
if ($this->count < $this->maxQueries) {
$this->queries[] = [$connection, $result->getQueryString(), $result->getParameters(), $source, $result->getTime(), $result->getRowCount(), null];
$this->queries[] = [$connection, $result->getQueryString(), $result->getParameters(), $trace, $result->getTime(), $result->getRowCount(), null];
}
} elseif ($result instanceof \PDOException && $this->count < $this->maxQueries) {
$this->queries[] = [$connection, $result->queryString, null, $source, null, null, $result->getMessage()];
$this->queries[] = [$connection, $result->queryString, null, $trace, null, null, $result->getMessage()];
}
}

Expand Down
16 changes: 14 additions & 2 deletions src/Bridges/DatabaseTracy/dist/panel.phtml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ declare(strict_types=1);
<th style="width: 1%">Rows</th>
</tr>

<?php foreach ($queries as [$connection, $sql, $params, $source, $time, $rows, $error, $command, $explain]): ?>
<?php foreach ($queries as [$connection, $sql, $params, $trace, $time, $rows, $error, $command, $explain]): ?>
<tr>
<td style="background:rgba(255, 95, 23, <?= Tracy\Helpers::escapeHtml(sprintf('%0.3f', log($time * 1000 + 1, 10) * $performanceScale)) ?>)" data-order="<?= Tracy\Helpers::escapeHtml((float) $time) ?>">
<?php if ($error): ?>
Expand All @@ -31,6 +31,8 @@ declare(strict_types=1);

<?php if ($explain): ?> <br/><a class="tracy-toggle tracy-collapsed" data-tracy-ref="^tr .nette-DbConnectionPanel-explain">explain</a><?php endif ?>

<?php if ($trace): ?> <br/><a class="tracy-toggle tracy-collapsed" data-tracy-ref="^tr .nette-DbConnectionPanel-trace">trace</a><?php endif ?>

</td>

<td class="nette-DbConnectionPanel-sql nette-DbConnectionPanel-sql-<?= Tracy\Helpers::escapeHtml($command) ?>">
Expand All @@ -54,8 +56,18 @@ declare(strict_types=1);
</table>
<?php endif ?>

<?php if ($source): ?> <?= substr_replace(Tracy\Helpers::editorLink($source[0], $source[1]), ' class="nette-DbConnectionPanel-source"', 2, 0) ?><?php endif ?>
<?php if ($trace): ?>
<?= substr_replace(Tracy\Helpers::editorLink($trace[0]['file'], $trace[0]['line']), ' class="nette-DbConnectionPanel-source"', 2, 0) ?>

<table class="tracy-collapsed nette-DbConnectionPanel-trace">
<?php foreach ($trace as $row): ?>
<tr>
<td><?= isset($row['file']) ? Tracy\Helpers::editorLink($row['file'], $row['line']) : '' ?></td>
<td><?= Tracy\Helpers::escapeHtml($row['class'] ?? '') ?><?= Tracy\Helpers::escapeHtml($row['type'] ?? '') ?><?= Tracy\Helpers::escapeHtml($row['function']) ?>()</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
</td>

<td><?= Tracy\Helpers::escapeHtml($rows) ?></td>
Expand Down
15 changes: 13 additions & 2 deletions src/Bridges/DatabaseTracy/panel.latte
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<th style="width: 1%">Rows</th>
</tr>

{foreach $queries as [$connection, $sql, $params, $source, $time, $rows, $error, $command, $explain]}
{foreach $queries as [$connection, $sql, $params, $trace, $time, $rows, $error, $command, $explain]}
<tr>
<td style="background:rgba(255, 95, 23, {sprintf('%0.3f', log($time * 1000 + 1, 10) * $performanceScale)})" data-order="{=(float) $time}">
{if $error}
Expand All @@ -26,6 +26,7 @@
{/if}

{if $explain}<br/><a class="tracy-toggle tracy-collapsed" data-tracy-ref="^tr .nette-DbConnectionPanel-explain">explain</a>{/if}
{if $trace}<br/><a class="tracy-toggle tracy-collapsed" data-tracy-ref="^tr .nette-DbConnectionPanel-trace">trace</a>{/if}
</td>

<td class="nette-DbConnectionPanel-sql nette-DbConnectionPanel-sql-{$command}">
Expand All @@ -48,7 +49,17 @@
</table>
{/if}

{if $source}{substr_replace(Tracy\Helpers::editorLink($source[0], $source[1]), ' class="nette-DbConnectionPanel-source"', 2, 0)}{/if}
{if $trace}
{substr_replace(Tracy\Helpers::editorLink($trace[0][file], $trace[0][line]), ' class="nette-DbConnectionPanel-source"', 2, 0)}
<table class="tracy-collapsed nette-DbConnectionPanel-trace">
{foreach $trace as $row}
<tr>
<td>{isset($row[file]) ? Tracy\Helpers::editorLink($row[file], $row[line]) : ''}</td>
<td>{$row[class] ?? ''}{$row[type] ?? ''}{$row[function]}()</td>
</tr>
{/foreach}
</table>
{/if}
</td>

<td>{$rows}</td>
Expand Down
19 changes: 15 additions & 4 deletions tests/Database.Tracy/panel.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,14 @@ <h1 title="sqlite::memory:">Queries: 4, time: %a% ms, foo</h1>
<td class="nette-DbConnectionPanel-sql nette-DbConnectionPanel-sql-">
<pre class="dump">::beginTransaction</pre>

<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%Connection.php:%d%" class="tracy-editor">%a%<b>Connection.php</b>:%d%</a>
<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%Connection.php:%d%" class="tracy-editor">%a%<b>Connection.php</b>:%d%</a>
<table class="tracy-collapsed nette-DbConnectionPanel-trace">
<tr>
<td><a href="%a%" title="%a%Connection.php:%d%" class="tracy-editor">%a%<b>Connection.php</b>:%d%</a></td>
<td>Nette\Utils\Arrays::invoke()</td>
</tr>
%A%
</table>
</td>

<td></td>
Expand All @@ -21,7 +28,8 @@ <h1 title="sqlite::memory:">Queries: 4, time: %a% ms, foo</h1>
<pre class="dump"><strong style="color:blue">SELECT</strong> 1</pre>

<table class="tracy-collapsed nette-DbConnectionPanel-explain">%A%</table>
<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%Connection.php:%d%" class="tracy-editor">%a%<b>Connection.php</b>:%d%</a>
<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%Connection.php:%d%" class="tracy-editor">%a%<b>Connection.php</b>:%d%</a>
<table class="tracy-collapsed nette-DbConnectionPanel-trace">%A%</table>
</td>

<td>0</td>
Expand All @@ -32,7 +40,8 @@ <h1 title="sqlite::memory:">Queries: 4, time: %a% ms, foo</h1>
<td class="nette-DbConnectionPanel-sql nette-DbConnectionPanel-sql-">
<pre class="dump">::commit</pre>

<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%Connection.php:%d%" class="tracy-editor">%a%<b>Connection.php</b>:%d%</a>
<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%Connection.php:%d%" class="tracy-editor">%a%<b>Connection.php</b>:%d%</a>
<table class="tracy-collapsed nette-DbConnectionPanel-trace">%A%</table>
</td>

<td></td>
Expand All @@ -41,12 +50,14 @@ <h1 title="sqlite::memory:">Queries: 4, time: %a% ms, foo</h1>
<td %a%>
<span title="SQLSTATE[HY000]: General error: 1 incomplete input">ERROR</span>

<br/><a class="tracy-toggle tracy-collapsed" data-tracy-ref="^tr .nette-DbConnectionPanel-trace">trace</a>
</td>

<td class="nette-DbConnectionPanel-sql nette-DbConnectionPanel-sql-">
<pre class="dump"><strong style="color:blue">SELECT</strong></pre>

<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%SqliteDriver.php:%d%" class="tracy-editor">%a%<b>SqliteDriver.php</b>:%d%</a>
<a class="nette-DbConnectionPanel-source" href="%a%" title="%a%SqliteDriver.php:%d%" class="tracy-editor">%a%<b>SqliteDriver.php</b>:%d%</a>
<table class="tracy-collapsed nette-DbConnectionPanel-trace">%A%</table>
</td>

<td></td>
Expand Down

0 comments on commit 486db4c

Please sign in to comment.