forked from cakephp/debug_kit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSqlLogPanel.php
More file actions
131 lines (114 loc) · 3.43 KB
/
SqlLogPanel.php
File metadata and controls
131 lines (114 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
declare(strict_types=1);
/**
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
* @link https://cakephp.org CakePHP(tm) Project
* @license https://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace DebugKit\Panel;
use Cake\Core\Configure;
use Cake\Database\Driver;
use Cake\Datasource\ConnectionManager;
use Cake\ORM\Locator\LocatorAwareTrait;
use Cake\ORM\Table;
use DebugKit\Database\Log\DebugLog;
use DebugKit\DebugPanel;
/**
* Provides debug information on the SQL logs and provides links to an ajax explain interface.
*/
class SqlLogPanel extends DebugPanel
{
use LocatorAwareTrait;
/**
* Loggers connected
*
* @var array
*/
protected static array $_loggers = [];
/**
* Initialize hook - configures logger.
*
* This will unfortunately build all the connections, but they
* won't connect until used.
*
* @return void
*/
public function initialize(): void
{
$configs = ConnectionManager::configured();
foreach ($configs as $name) {
static::addConnection($name);
}
}
/**
* Add a connection to the list of loggers.
*
* @param string $name The name of the connection to add.
* @return void
*/
public static function addConnection(string $name): void
{
$includeSchemaReflection = (bool)Configure::read('DebugKit.includeSchemaReflection');
$connection = ConnectionManager::get($name);
if ($connection->configName() === 'debug_kit') {
return;
}
$driver = $connection->getDriver();
if (!method_exists($driver, 'setLogger')) {
return;
}
$logger = null;
if ($driver instanceof Driver) {
$logger = $driver->getLogger();
} elseif (method_exists($connection, 'getLogger')) {
// ElasticSearch connection holds the logger, not the Elastica Driver
$logger = $connection->getLogger();
}
if ($logger instanceof DebugLog) {
$logger->setIncludeSchema($includeSchemaReflection);
static::$_loggers[] = $logger;
return;
}
$logger = new DebugLog($logger, $name, $includeSchemaReflection);
/** @var \Cake\Database\Driver $driver */
$driver->setLogger($logger);
static::$_loggers[] = $logger;
}
/**
* Get the data this panel wants to store.
*
* @return array
*/
public function data(): array
{
return [
'tables' => array_map(function (Table $table) {
return $table->getAlias();
}, $this->getTableLocator()->genericInstances()),
'loggers' => static::$_loggers,
];
}
/**
* Get summary data from the queries run.
*
* @return string
*/
public function summary(): string
{
$count = $time = 0;
foreach (static::$_loggers as $logger) {
$count += count($logger->queries());
$time += $logger->totalTime();
}
if (!$count) {
return '0';
}
return "$count / $time ms";
}
}