<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace DebugKit\Panel;
use Cake\Core\Configure;
use Cake\Datasource\ConnectionManager;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
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
{
/**
* Loggers connected
*
* @var array
*/
protected $_loggers = [];
/**
* Initialize hook - configures logger.
*
* This will unfortunately build all the connections, but they
* won't connect until used.
*
* @return void
*/
public function initialize()
{
$configs = ConnectionManager::configured();
$includeSchemaReflection = (bool)Configure::read('DebugKit.includeSchemaReflection');
foreach ($configs as $name) {
$connection = ConnectionManager::get($name);
if ($connection->configName() === 'debug_kit') {
continue;
}
$logger = null;
if ($connection->isQueryLoggingEnabled()) {
$logger = $connection->getLogger();
}
if ($logger instanceof DebugLog) {
$logger->setIncludeSchema($includeSchemaReflection);
$this->_loggers[] = $logger;
continue;
}
$logger = new DebugLog($logger, $name, $includeSchemaReflection);
$connection->enableQueryLogging(true);
if (method_exists($connection, 'setLogger')) {
$connection->setLogger($logger);
} else {
$connection->logger($logger);
}
$this->_loggers[] = $logger;
}
}
/**
* Get the data this panel wants to store.
*
* @return array
*/
public function data()
{
return [
'tables' => array_map(function (Table $table) {
return $table->getAlias();
}, TableRegistry::getTableLocator()->genericInstances()),
'loggers' => $this->_loggers,
];
}
/**
* Get summary data from the queries run.
*
* @return string
*/
public function summary()
{
$count = $time = 0;
foreach ($this->_loggers as $logger) {
$count += count($logger->queries());
$time += $logger->totalTime();
}
if (!$count) {
return '0';
}
return "$count / $time ms";
}
}