From b71d1d3616115653eb928489093fc2581d830cf5 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 3 Oct 2014 01:35:07 +0200 Subject: [PATCH] Add QueryLogger interface to allow apps to get a list of used queries --- lib/private/debug/dummyquerylogger.php | 31 ++++++++++++++ lib/private/debug/query.php | 57 ++++++++++++++++++++++++++ lib/private/debug/querylogger.php | 47 +++++++++++++++++++++ lib/private/server.php | 20 +++++++++ lib/public/debug/iquery.php | 26 ++++++++++++ lib/public/debug/iquerylogger.php | 27 ++++++++++++ lib/public/iservercontainer.php | 9 ++++ 7 files changed, 217 insertions(+) create mode 100644 lib/private/debug/dummyquerylogger.php create mode 100644 lib/private/debug/query.php create mode 100644 lib/private/debug/querylogger.php create mode 100644 lib/public/debug/iquery.php create mode 100644 lib/public/debug/iquerylogger.php diff --git a/lib/private/debug/dummyquerylogger.php b/lib/private/debug/dummyquerylogger.php new file mode 100644 index 0000000000..0c2664e400 --- /dev/null +++ b/lib/private/debug/dummyquerylogger.php @@ -0,0 +1,31 @@ + + * 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(); + } +} diff --git a/lib/private/debug/query.php b/lib/private/debug/query.php new file mode 100644 index 0000000000..351c7d9dac --- /dev/null +++ b/lib/private/debug/query.php @@ -0,0 +1,57 @@ + + * 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; + } +} diff --git a/lib/private/debug/querylogger.php b/lib/private/debug/querylogger.php new file mode 100644 index 0000000000..990188da97 --- /dev/null +++ b/lib/private/debug/querylogger.php @@ -0,0 +1,47 @@ + + * 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; + } +} diff --git a/lib/private/server.php b/lib/private/server.php index 263f991902..c0b94a5b4c 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -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'); + } } diff --git a/lib/public/debug/iquery.php b/lib/public/debug/iquery.php new file mode 100644 index 0000000000..070c4d6119 --- /dev/null +++ b/lib/public/debug/iquery.php @@ -0,0 +1,26 @@ + + * 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(); +} diff --git a/lib/public/debug/iquerylogger.php b/lib/public/debug/iquerylogger.php new file mode 100644 index 0000000000..fe8eae089d --- /dev/null +++ b/lib/public/debug/iquerylogger.php @@ -0,0 +1,27 @@ + + * 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(); +} diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 57bbf62899..97ff74385a 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -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(); }