Add QueryLogger interface to allow apps to get a list of used queries

This commit is contained in:
Robin Appelman 2014-10-03 01:35:07 +02:00
parent d38050cf52
commit b71d1d3616
7 changed files with 217 additions and 0 deletions

View File

@ -0,0 +1,31 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Debug;
use OCP\Debug\IQueryLogger;
class DummyQueryLogger implements IQueryLogger {
/**
* @param string $sql
* @param array $params
* @param array $types
*/
public function startQuery($sql, array $params = null, array $types = null) {
}
public function stopQuery() {
}
/**
* @return \OCP\Debug\IQuery[]
*/
public function getQueries() {
return array();
}
}

View File

@ -0,0 +1,57 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Debug;
use OCP\Debug\IQuery;
class Query implements IQuery {
private $sql;
private $params;
private $start;
private $end;
/**
* @param string $sql
* @param array $params
* @param int $start
*/
public function __construct($sql, $params, $start) {
$this->sql = $sql;
$this->params = $params;
$this->start = $start;
}
public function end($time) {
$this->end = $time;
}
/**
* @return array
*/
public function getParams() {
return $this->params;
}
/**
* @return string
*/
public function getSql() {
return $this->sql;
}
/**
* @return int
*/
public function getDuration() {
return $this->end - $this->start;
}
}

View File

@ -0,0 +1,47 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Debug;
use OCP\Debug\IQueryLogger;
class QueryLogger implements IQueryLogger {
/**
* @var \OC\Debug\Query
*/
protected $activeQuery;
/**
* @var \OC\Debug\Query[]
*/
protected $queries = array();
/**
* @param string $sql
* @param array $params
* @param array $types
*/
public function startQuery($sql, array $params = null, array $types = null) {
$this->activeQuery = new Query($sql, $params, microtime(true));
}
public function stopQuery() {
if ($this->activeQuery) {
$this->activeQuery->end(microtime(true));
$this->queries[] = $this->activeQuery;
$this->activeQuery = null;
}
}
/**
* @return \OCP\Debug\IQuery[]
*/
public function getQueries() {
return $this->queries;
}
}

View File

@ -6,7 +6,9 @@ use OC\AppFramework\Http\Request;
use OC\AppFramework\Db\Db;
use OC\AppFramework\Utility\SimpleContainer;
use OC\Cache\UserCache;
use OC\Debug\DummyQueryLogger;
use OC\Debug\EventLogger;
use OC\Debug\QueryLogger;
use OC\Security\CertificateManager;
use OC\DB\ConnectionWrapper;
use OC\Files\Node\Root;
@ -229,6 +231,13 @@ class Server extends SimpleContainer implements IServerContainer {
return new DummyEventLogger();
}
});
$this->registerService('QueryLogger', function ($c) {
if (defined('DEBUG') and DEBUG) {
return new QueryLogger();
} else {
return new DummyQueryLogger();
}
});
}
/**
@ -579,4 +588,15 @@ class Server extends SimpleContainer implements IServerContainer {
function getEventLogger() {
return $this->query('EventLogger');
}
/**
* Get the active query logger
*
* The returned logger only logs data when debug mode is enabled
*
* @return \OCP\Debug\IQueryLogger
*/
function getQueryLogger() {
return $this->query('EventLogger');
}
}

View File

@ -0,0 +1,26 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Debug;
interface IQuery {
/**
* @return string
*/
public function getSql();
/**
* @return array
*/
public function getParams();
/**
* @return float
*/
public function getDuration();
}

View File

@ -0,0 +1,27 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Debug;
use Doctrine\DBAL\Logging\SQLLogger;
interface IQueryLogger extends SQLLogger {
/**
* @param string $sql
* @param array $params
* @param array $types
*/
public function startQuery($sql, array $params = null, array $types = null);
public function stopQuery();
/**
* @return \OCP\Debug\IQuery[]
*/
public function getQueries();
}

View File

@ -255,4 +255,13 @@ interface IServerContainer {
* @return \OCP\Debug\IEventLogger
*/
function getEventLogger();
/**
* Get the active query logger
*
* The returned logger only logs data when debug mode is enabled
*
* @return \OCP\Debug\IQueryLogger
*/
function getQueryLogger();
}