diff options
Diffstat (limited to 'lib/private/Diagnostics/QueryLogger.php')
-rw-r--r-- | lib/private/Diagnostics/QueryLogger.php | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/lib/private/Diagnostics/QueryLogger.php b/lib/private/Diagnostics/QueryLogger.php new file mode 100644 index 00000000000..5efe99d1a74 --- /dev/null +++ b/lib/private/Diagnostics/QueryLogger.php @@ -0,0 +1,74 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +namespace OC\Diagnostics; + +use OCP\Cache\CappedMemoryCache; +use OCP\Diagnostics\IQueryLogger; + +class QueryLogger implements IQueryLogger { + protected int $index = 0; + protected ?Query $activeQuery = null; + /** @var CappedMemoryCache<Query> */ + protected CappedMemoryCache $queries; + + /** + * QueryLogger constructor. + */ + public function __construct() { + $this->queries = new CappedMemoryCache(1024); + } + + + /** + * @var bool - Module needs to be activated by some app + */ + private $activated = false; + + /** + * @inheritdoc + */ + public function startQuery($sql, ?array $params = null, ?array $types = null) { + if ($this->activated) { + $this->activeQuery = new Query($sql, $params, microtime(true), $this->getStack()); + } + } + + private function getStack() { + $stack = debug_backtrace(); + array_shift($stack); + array_shift($stack); + array_shift($stack); + return $stack; + } + + /** + * @inheritdoc + */ + public function stopQuery() { + if ($this->activated && $this->activeQuery) { + $this->activeQuery->end(microtime(true)); + $this->queries[(string)$this->index] = $this->activeQuery; + $this->index++; + $this->activeQuery = null; + } + } + + /** + * @inheritdoc + */ + public function getQueries() { + return $this->queries->getData(); + } + + /** + * @inheritdoc + */ + public function activate() { + $this->activated = true; + } +} |