diff --git a/composer.json b/composer.json index d30bcb3..6dd06e9 100644 --- a/composer.json +++ b/composer.json @@ -3,6 +3,7 @@ "description": "Returns all SQL queries in the browser.", "type": "library", "require": { + "php": "^8.0", "monolog/monolog": "^1", "nilportugues/sql-query-formatter": "^1.2.2", "firephp/firephp-core": "^0.5.3" diff --git a/example/simple.php b/example/simple.php index 67cc38c..dc80829 100644 --- a/example/simple.php +++ b/example/simple.php @@ -1,5 +1,7 @@ - * @link http://www.oxidmodule.com + * @author D3 Data Development - Daniel Seifert + * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\OxidSqlLogger\Extensions; use D3\OxidSqlLogger\Handler\d3FirePHPHandler; @@ -32,7 +32,7 @@ class d3FirePHP extends FirePHP * @param boolean $autoCreate * @return FirePHP */ - public static function getInstance($autoCreate = false) + public static function getInstance($autoCreate = false): FirePHP { if ($autoCreate === true && !self::$instance) { self::init(); @@ -45,7 +45,7 @@ class d3FirePHP extends FirePHP * * @return FirePHP */ - public static function init() + public static function init(): FirePHP { return self::setInstance(new self()); } @@ -71,7 +71,7 @@ class d3FirePHP extends FirePHP * @return true * @throws Exception */ - public function trace($label) + public function trace($label): bool { return $this->fb($label, $label, FirePHP::TRACE, array( 'trace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) diff --git a/src/Handler/d3FirePHPHandler.php b/src/Handler/d3FirePHPHandler.php index 86871d0..e866647 100644 --- a/src/Handler/d3FirePHPHandler.php +++ b/src/Handler/d3FirePHPHandler.php @@ -1,18 +1,18 @@ - * @link http://www.oxidmodule.com + * @author D3 Data Development - Daniel Seifert + * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\OxidSqlLogger\Handler; use D3\OxidSqlLogger\Extensions\d3FirePHP; diff --git a/src/LoggerFactory.php b/src/LoggerFactory.php index a905cf6..8cb8f4c 100644 --- a/src/LoggerFactory.php +++ b/src/LoggerFactory.php @@ -5,23 +5,21 @@ * @author D3 Data Development - Daniel Seifert */ +declare(strict_types=1); + namespace D3\OxidSqlLogger; use Monolog; use OxidEsales\Eshop\Core\Registry; use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Traversable; -/** - * Class Factory - */ class LoggerFactory { /** * @param $name * @return Monolog\Logger */ - public function create($name) + public function create($name): Monolog\Logger { return new Monolog\Logger($name, $this->getHandlers(), $this->getProcessors()); } @@ -29,12 +27,12 @@ class LoggerFactory /** * @return array */ - private function getHandlers() + private function getHandlers(): array { if (PHP_SAPI == 'cli') { $configuredHandlers = Registry::getConfig()->getConfigParam('SqlLoggerCLIHandlers'); - $handlers = (isset($configuredHandlers) && $this->is_iterable($configuredHandlers)) ? + $handlers = (isset($configuredHandlers) && is_iterable($configuredHandlers)) ? $this->getInstancesFromHandlerList($configuredHandlers) : [ $this->getStreamHandler() @@ -42,7 +40,7 @@ class LoggerFactory } else { $configuredHandlers = Registry::getConfig()->getConfigParam('SqlLoggerGUIHandlers'); - $handlers = (isset($configuredHandlers) && $this->is_iterable($configuredHandlers)) ? + $handlers = (isset($configuredHandlers) && is_iterable($configuredHandlers)) ? $this->getInstancesFromHandlerList($configuredHandlers) : [ $this->getBrowserConsoleHandler(), @@ -58,7 +56,7 @@ class LoggerFactory * * @return array */ - private function getInstancesFromHandlerList(array $classNames) + private function getInstancesFromHandlerList(array $classNames): array { return array_map( function($className){ @@ -68,23 +66,10 @@ class LoggerFactory ); } - /** - * polyfill for is_iterable() - available from PHP 7.1 - * @param $obj - * - * @return bool - */ - private function is_iterable($obj) - { - return function_exists('is_iterable') ? - is_iterable($obj) : - is_array($obj) || ( $obj instanceof Traversable); - } - /** * @return Monolog\Handler\StreamHandler */ - private function getStreamHandler() + private function getStreamHandler(): Monolog\Handler\StreamHandler { $streamHandler = new Monolog\Handler\StreamHandler('php://stderr'); @@ -111,7 +96,7 @@ class LoggerFactory /** * @return Monolog\Handler\BrowserConsoleHandler */ - private function getBrowserConsoleHandler() + private function getBrowserConsoleHandler(): Monolog\Handler\BrowserConsoleHandler { return new Monolog\Handler\BrowserConsoleHandler(); } @@ -119,7 +104,7 @@ class LoggerFactory /** * @return Monolog\Handler\FirePHPHandler */ - private function getFirePHPHandler() + private function getFirePHPHandler(): Monolog\Handler\FirePHPHandler { return new Monolog\Handler\FirePHPHandler(); } @@ -127,10 +112,17 @@ class LoggerFactory /** * @return array */ - private function getProcessors() + private function getProcessors(): array { return [ - new Monolog\Processor\IntrospectionProcessor(Monolog\Logger::DEBUG, ['D3\\OxidSqlLogger', 'Doctrine\\DBAL\\Connection', 'OxidEsales\\EshopCommunity\\Core\\Database\\Adapter\\Doctrine\\Database']), + new Monolog\Processor\IntrospectionProcessor( + Monolog\Logger::DEBUG, + [ + 'D3\\OxidSqlLogger', + 'Doctrine\\DBAL\\Connection', + 'OxidEsales\\EshopCommunity\\Core\\Database\\Adapter\\Doctrine\\Database' + ] + ), new Monolog\Processor\PsrLogMessageProcessor(), ]; } diff --git a/src/OxidEsalesDatabase.php b/src/OxidEsalesDatabase.php index a72db7e..5bd993b 100644 --- a/src/OxidEsalesDatabase.php +++ b/src/OxidEsalesDatabase.php @@ -5,46 +5,35 @@ * @author D3 Data Development - Daniel Seifert */ +declare(strict_types=1); + namespace D3\OxidSqlLogger; use Doctrine\DBAL\Configuration; use Doctrine\DBAL\Logging\SQLLogger; use OxidEsales\Eshop\Core\Database\Adapter\Doctrine\Database; -use OxidEsales\Eshop\Core\DatabaseProvider; -use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; +use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory; +use OxidEsales\EshopCommunity\Internal\Framework\Database\ConnectionProviderInterface; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; -/** - * Class OxidEsalesDatabase - * Is a depenction injection Helper Class - */ class OxidEsalesDatabase extends Database { /** - * @param null $message + * @param string|null $message * - * @throws DatabaseConnectionException - * @deprecated use non static d3EnableLogger method or D3StartSQLLog function + * @return void + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ - public static function enableLogger($message = null) + public function d3EnableLogger(string $message = null): void { - $database = oxNew(OxidEsalesDatabase::class); - $database->d3EnableLogger($message); - } + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - /** - * @throws DatabaseConnectionException - */ - public function d3EnableLogger($message) - { - $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS); - - $database = DatabaseProvider::getDb( DatabaseProvider::FETCH_MODE_ASSOC); - /** @var Configuration $dbalConfig */ - $dbalConfig = $database->getConnection()->getConfiguration(); - $dbalConfig->setSQLLogger( + $this->d3GetConfiguration()->setSQLLogger( new OxidSQLLogger( $trace[1]['file'] ?? null, - $trace[1]['line'] ?? null, + (int) $trace[1]['line'] ?? null, $trace[2]['class'] ?? null, $trace[2]['function'] ?? null, $message @@ -54,45 +43,31 @@ class OxidEsalesDatabase extends Database /** * @return SQLLogger|null - * @throws DatabaseConnectionException - * @deprecated use non static d3GetLogger method + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ - public static function getLogger() + public function d3GetLogger(): ?SQLLogger { - $database = oxNew(OxidEsalesDatabase::class); - return $database->d3GetLogger(); + return $this->d3GetConfiguration()->getSQLLogger(); } /** - * @return SQLLogger|null - * @throws DatabaseConnectionException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ - public function d3GetLogger() + public function d3DisableLogger(): void { - $database = DatabaseProvider::getDb( DatabaseProvider::FETCH_MODE_ASSOC); - /** @var Configuration $dbalConfig */ - $dbalConfig = $database->getConnection()->getConfiguration(); - return $dbalConfig->getSQLLogger(); + $this->d3GetConfiguration()->setSQLLogger(); } /** - * @throws DatabaseConnectionException - * @deprecated use non static d3DisableLogger method or D3StopSQLLog function + * @return Configuration|null + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ - public static function disableLogger() + protected function d3GetConfiguration(): ?Configuration { - $database = oxNew(OxidEsalesDatabase::class); - $database->d3DisableLogger(); - } - - /** - * @throws DatabaseConnectionException - */ - public function d3DisableLogger() - { - $database = DatabaseProvider::getDb( DatabaseProvider::FETCH_MODE_ASSOC); - /** @var Configuration $dbalConfig */ - $dbalConfig = $database->getConnection()->getConfiguration(); - $dbalConfig->setSQLLogger(); + return ContainerFactory::getInstance()->getContainer() + ->get(ConnectionProviderInterface::class)->get()->getConfiguration(); } } diff --git a/src/OxidSQLLogger.php b/src/OxidSQLLogger.php index 2af674a..c6c6b69 100644 --- a/src/OxidSQLLogger.php +++ b/src/OxidSQLLogger.php @@ -5,44 +5,39 @@ * @author D3 Data Development - Daniel Seifert */ +declare(strict_types=1); + namespace D3\OxidSqlLogger; use D3\ModCfg\Application\Model\d3database; use Doctrine\DBAL\Logging\SQLLogger; use Monolog; use NilPortugues\Sql\QueryFormatter\Formatter; -use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; -/** - * Class OxidSQLLogger - */ class OxidSQLLogger implements SQLLogger { - public $message; - public $logStartingFile; - public $logStartingLine; - public $logStartingClass; - public $logStartingFunction; + public string $message; + public string $logStartingFile; + public int $logStartingLine; + public string $logStartingClass; + public string $logStartingFunction; + + private SQLQuery|null $SQLQuery = null; /** - * @var SQLQuery + * @param string $file + * @param int $line + * @param string $class + * @param string $function + * @param string|null $message */ - private $SQLQuery = null; - - /** - * @param $file - * @param $line - * @param $class - * @param $function - * @param null $message - */ - public function __construct($file, $line, $class, $function, $message = null) + public function __construct(string $file, int $line, string $class, string $function, string $message = null) { if (!Monolog\Registry::hasLogger('sql')) { Monolog\Registry::addLogger((new LoggerFactory())->create('sql')); } - $this->message = $message; + $this->message = $message; $this->logStartingFile = $file; $this->logStartingLine = $line; $this->logStartingClass = $class; @@ -53,39 +48,36 @@ class OxidSQLLogger implements SQLLogger * @param string $sql * @param array|null $params * @param array|null $types - * - * @throws DatabaseConnectionException */ - public function startQuery($sql, array $params = null, array $types = null) + public function startQuery($sql, ?array $params = null, ?array $types = null): void { if ($this->SQLQuery) { $this->SQLQuery->setCanceled(); $this->stopQuery(); } - $this->getPreparedStatementQuery($sql, $params ?? []); + $this->getPreparedStatementQuery( $sql, $params ?? [], $types ?? []); - $this->SQLQuery = (new SQLQuery()) ->setSql($sql) - ->setParams($params) - ->setTypes($types) - ->setLogStartingFile($this->logStartingFile) - ->setLogStartingLine($this->logStartingLine) - ->setLogStartingClass($this->logStartingClass) - ->setLogStartingFunction($this->logStartingFunction); + $this->SQLQuery = (new SQLQuery())->setSql($sql) + ->setParams($params) + ->setTypes($types) + ->setLogStartingFile($this->logStartingFile) + ->setLogStartingLine($this->logStartingLine) + ->setLogStartingClass($this->logStartingClass) + ->setLogStartingFunction($this->logStartingFunction); } /** * @param string $sql - * @param array $params - * @throws DatabaseConnectionException + * @param array $params + * @param array $types */ - public function getPreparedStatementQuery(&$sql, array $params = []) + public function getPreparedStatementQuery(string &$sql, array $params = [], array $types = []): void { if (class_exists(d3database::class) && method_exists(d3database::class, 'getPreparedStatementQuery') - && is_array($params) && count($params) - && ($query = d3database::getInstance()->getPreparedStatementQuery($sql, $params)) + && ($query = d3database::getInstance()->getPreparedStatementQuery($sql, $params, $types)) && strlen(trim($query)) ) { $sql = $query; @@ -95,13 +87,13 @@ class OxidSQLLogger implements SQLLogger /** * @inheritDoc */ - public function stopQuery() + public function stopQuery(): void { if ($this->SQLQuery) { $formatter = new Formatter(); Monolog\Registry::sql()->addDebug( - '['.$this->SQLQuery->getReadableElapsedTime().'] ' . ( $this->message ?: $this->SQLQuery->getSql() ), + '['.$this->SQLQuery->getReadableElapsedTime().'] ' . ($this->message ?: $this->SQLQuery->getSql()), [ 'query' => $formatter->format($this->SQLQuery->getSql()), 'params' => $this->SQLQuery->getParams(), diff --git a/src/SQLQuery.php b/src/SQLQuery.php index 3f17d36..5866612 100644 --- a/src/SQLQuery.php +++ b/src/SQLQuery.php @@ -1,50 +1,42 @@ - * Date: 2019-08-20 - * Time: 21:56 + * @author Tobias Matthaiou + * @author D3 Data Development - Daniel Seifert */ +declare(strict_types=1); + namespace D3\OxidSqlLogger; -/** - * Class SQLQuery - * @package tm\oxid\sql\logger - */ class SQLQuery { /** - * @var float|null + * @var float */ - private $start_time; + private float $start_time; /** - * @var float|null + * @var float */ - private $stop_time = null; + private float $stop_time = 0.0; /** * @var string */ - private $sql = ''; + private string $sql = ''; - /** - * @var null - */ - private $params = null; + private ?array $parameters = null; - /** - * @var null - */ - private $types = null; + private ?array $parameterTypes = null; - private $logStartingFile; + private string $logStartingFile; - private $logStartingLine; + private int $logStartingLine; - private $logStartingClass; + private string $logStartingClass; - private $logStartingFunction; + private string $logStartingFunction; public function __construct() { @@ -54,7 +46,7 @@ class SQLQuery /** * @return string */ - public function getSql() + public function getSql(): string { return $this->sql; } @@ -63,79 +55,79 @@ class SQLQuery * @param string $sql * @return SQLQuery */ - public function setSql($sql) + public function setSql(string $sql): static { $this->sql = $sql; return $this; } /** - * @return null + * @return array|null */ - public function getParams() + public function getParams(): ?array { - return $this->params; + return $this->parameters; } /** - * @param null $params + * @param array|null $params + * * @return SQLQuery */ - public function setParams($params) + public function setParams(array $params = null): static { - $this->params = $params; + $this->parameters = $params; return $this; } /** - * @return null + * @return array|null */ - public function getTypes() + public function getTypes(): ?array { - return $this->types; + return $this->parameterTypes; } /** - * @param null $types + * @param array|null $types + * * @return SQLQuery */ - public function setTypes($types) + public function setTypes(array $types = null): static { - $this->types = $types; + $this->parameterTypes = $types; return $this; } /** * @return string */ - public function getLogStartingFile() + public function getLogStartingFile(): string { return $this->logStartingFile; } /** - * @param $file + * @param string $file * @return SQLQuery */ - public function setLogStartingFile($file) + public function setLogStartingFile(string $file): static { $this->logStartingFile = $file; return $this; } - /** - * @return string - */ - public function getLogStartingLine() + public function getLogStartingLine(): int { return $this->logStartingLine; } - + /** - * @param $line + * @param int $line + * * @return SQLQuery */ - public function setLogStartingLine($line) + public function setLogStartingLine(int $line): static { $this->logStartingLine = $line; return $this; @@ -144,16 +136,17 @@ class SQLQuery /** * @return string */ - public function getLogStartingClass() + public function getLogStartingClass(): string { return $this->logStartingClass; } - + /** - * @param $classname + * @param string $classname + * * @return SQLQuery */ - public function setLogStartingClass($classname) + public function setLogStartingClass(string $classname): static { $this->logStartingClass = $classname; return $this; @@ -162,16 +155,17 @@ class SQLQuery /** * @return string */ - public function getLogStartingFunction() + public function getLogStartingFunction(): string { return $this->logStartingFunction; } - + /** - * @param $functionname + * @param string $functionname + * * @return SQLQuery */ - public function setLogStartingFunction($functionname) + public function setLogStartingFunction(string $functionname): static { $this->logStartingFunction = $functionname; return $this; @@ -180,25 +174,25 @@ class SQLQuery /** * Statement was cancelled prematurely, an error was thrown. * - * @return $this + * @return SQLQuery */ - public function setCanceled() + public function setCanceled(): static { - $this->start_time = null; + $this->start_time = 0.0; return $this; } /** - * Returns elapsed time - * @return float|string + * Return elapsed time + * @return float */ - public function getElapsedTime() + public function getElapsedTime(): float { - if ($this->start_time === null) { - return 'Statement canceled'; + if ($this->start_time === 0.0) { + return 0.0; } - if ($this->stop_time === null) { + if ($this->stop_time === 0.0) { $end_time = microtime(true); $this->stop_time = $end_time - $this->start_time; } @@ -207,29 +201,25 @@ class SQLQuery } /** - * Returns a human readable elapsed time + * Returns a human-readable elapsed time * * @return string */ - public function getReadableElapsedTime() + public function getReadableElapsedTime(): string { return $this->readableElapsedTime($this->getElapsedTime()); } /** - * Returns a human readable elapsed time + * Returns a human-readable elapsed time * * @param float $microtime * @param string $format The format to display (printf format) * @param int $round * @return string */ - private function readableElapsedTime($microtime, $format = '%.3f%s', $round = 3) + protected function readableElapsedTime(float $microtime, string $format = '%.3f%s', int $round = 3): string { - if (is_string($microtime)) { - return $microtime; - } - if ($microtime >= 1) { $unit = 's'; $time = round($microtime, $round); @@ -237,7 +227,7 @@ class SQLQuery $unit = 'ms'; $time = round($microtime*1000); - $format = preg_replace('/(%.[\d]+f)/', '%d', $format); + $format = preg_replace('/(%.\d+f)/', '%d', $format); } return sprintf($format, $time, $unit); diff --git a/src/functions.php b/src/functions.php index 0be0b87..9b72d4a 100644 --- a/src/functions.php +++ b/src/functions.php @@ -1,28 +1,34 @@ * @author D3 Data Development - Daniel Seifert */ +declare(strict_types=1); + +use D3\OxidSqlLogger\OxidEsalesDatabase; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; + /** - * @param string $message + * @param string|null $message * - * @throws DatabaseConnectionException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ -function D3StartSQLLog($message = null) { +function D3StartSQLLog(string $message = null): void +{ /** @var OxidEsalesDatabase $database */ $database = oxNew( OxidEsalesDatabase::class); $database->d3EnableLogger($message); } /** - * @throws DatabaseConnectionException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ -function D3StopSQLLog() +function D3StopSQLLog(): void { /** @var OxidEsalesDatabase $database */ $database = oxNew( OxidEsalesDatabase::class); @@ -32,9 +38,10 @@ function D3StopSQLLog() /** * @param $message * - * @throws DatabaseConnectionException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ -function D3AddSQLLogItem($message) +function D3AddSQLLogItem($message): void { /** @var OxidEsalesDatabase $database */ $database = oxNew( OxidEsalesDatabase::class);