From 1596654149ff7a9933e42ed9a4bd98293eda3215 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Tue, 28 Feb 2023 17:36:19 +0900 Subject: [PATCH] Moved minimum php version to 8.1 All PostgreSQL calls are now Connection/Resource object types and not resource All methods have parameter type set --- .phan/config.php | 1 + 4dev/checking/phpunit.sh | 8 +- 4dev/tests/CoreLibsACLLoginTest.php | 2 +- .../CoreLibsCombinedArrayHandlerTest.php | 16 +- 4dev/tests/CoreLibsDBIOTest.php | 8 +- composer.json | 15 +- composer.lock | 62 +++- phpstan.neon | 10 +- vendor/composer/autoload_files.php | 2 +- vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_static.php | 7 +- vendor/composer/installed.json | 66 +++- vendor/composer/installed.php | 19 +- vendor/phpstan/extension-installer/LICENSE | 21 ++ vendor/phpstan/extension-installer/README.md | 77 +++++ .../build-cs/composer.json | 12 + .../build-cs/composer.lock | 322 ++++++++++++++++++ .../phpstan/extension-installer/composer.json | 32 ++ .../src/GeneratedConfig.php | 26 ++ .../extension-installer/src/Plugin.php | 159 +++++++++ vendor/phpstan/phpstan/phpstan.phar | Bin 21569614 -> 21573143 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 26 +- www/admin/class_test.db.dbReturn.php | 17 +- www/admin/class_test.db.php | 12 +- www/composer.json | 3 +- www/configs/config.php | 7 +- www/lib/CoreLibs/ACL/Login.php | 55 +-- www/lib/CoreLibs/Admin/Backend.php | 52 +-- www/lib/CoreLibs/Admin/EditBase.php | 2 +- www/lib/CoreLibs/Basic.php | 3 - www/lib/CoreLibs/Check/Colors.php | 7 +- www/lib/CoreLibs/Check/Encoding.php | 8 +- www/lib/CoreLibs/Check/Jason.php | 2 +- www/lib/CoreLibs/Combined/ArrayHandler.php | 62 ++-- www/lib/CoreLibs/Combined/DateTime.php | 25 +- www/lib/CoreLibs/Convert/Byte.php | 4 +- www/lib/CoreLibs/Convert/Colors.php | 21 +- www/lib/CoreLibs/Convert/Html.php | 4 +- www/lib/CoreLibs/Convert/Json.php | 12 +- www/lib/CoreLibs/Convert/Math.php | 2 +- www/lib/CoreLibs/Create/RandomKey.php | 3 +- www/lib/CoreLibs/Create/Session.php | 51 +-- www/lib/CoreLibs/DB/Extended/ArrayIO.php | 33 +- www/lib/CoreLibs/DB/IO.php | 291 ++++++++-------- .../SqlFunctions.php | 98 +++--- www/lib/CoreLibs/DB/SQL/PgSQL.php | 158 ++++----- www/lib/CoreLibs/Debug/Logging.php | 6 +- .../CoreLibs/Language/Core/GetTextReader.php | 2 +- www/lib/CoreLibs/Language/Encoding.php | 8 +- www/lib/CoreLibs/Output/Form/Elements.php | 38 +-- www/lib/CoreLibs/Output/Form/Generate.php | 11 +- www/lib/CoreLibs/Output/Image.php | 16 +- www/vendor/composer/autoload_classmap.php | 2 +- www/vendor/composer/autoload_static.php | 2 +- 54 files changed, 1376 insertions(+), 533 deletions(-) create mode 100644 vendor/phpstan/extension-installer/LICENSE create mode 100644 vendor/phpstan/extension-installer/README.md create mode 100644 vendor/phpstan/extension-installer/build-cs/composer.json create mode 100644 vendor/phpstan/extension-installer/build-cs/composer.lock create mode 100644 vendor/phpstan/extension-installer/composer.json create mode 100644 vendor/phpstan/extension-installer/src/GeneratedConfig.php create mode 100644 vendor/phpstan/extension-installer/src/Plugin.php rename www/lib/CoreLibs/DB/SQL/{SqlInterface => Interface}/SqlFunctions.php (64%) diff --git a/.phan/config.php b/.phan/config.php index 0ce711c9..da7adef3 100644 --- a/.phan/config.php +++ b/.phan/config.php @@ -27,6 +27,7 @@ use Phan\Config; return [ // "target_php_version" => "8.2", + "minimum_target_php_version" => "8.1", // turn color on (-C) "color_issue_messages_if_supported" => true, // If true, missing properties will be created when diff --git a/4dev/checking/phpunit.sh b/4dev/checking/phpunit.sh index 8d63fc0b..024d427a 100755 --- a/4dev/checking/phpunit.sh +++ b/4dev/checking/phpunit.sh @@ -15,8 +15,8 @@ php_bin=""; if [ ! -z "${1}" ]; then case "${1}" in # "7.3") php_bin="/usr/bin/php7.3 "; ;; - "7.4") php_bin="/usr/bin/php7.4 "; ;; - "8.0") php_bin="/usr/bin/php8.0 "; ;; + # "7.4") php_bin="/usr/bin/php7.4 "; ;; + # "8.0") php_bin="/usr/bin/php8.0 "; ;; "8.1") php_bin="/usr/bin/php8.1 "; ;; "8.2") php_bin="/usr/bin/php8.2 "; ;; *) echo "Not support PHP: ${1}"; exit; ;; @@ -25,8 +25,8 @@ fi; if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then case "${2}" in # "7.3") php_bin="/usr/bin/php7.3 "; ;; - "7.4") php_bin="/usr/bin/php7.4 "; ;; - "8.0") php_bin="/usr/bin/php8.0 "; ;; + # "7.4") php_bin="/usr/bin/php7.4 "; ;; + # "8.0") php_bin="/usr/bin/php8.0 "; ;; "8.1") php_bin="/usr/bin/php8.1 "; ;; "8.2") php_bin="/usr/bin/php8.2 "; ;; *) echo "Not support PHP: ${1}"; exit; ;; diff --git a/4dev/tests/CoreLibsACLLoginTest.php b/4dev/tests/CoreLibsACLLoginTest.php index c57528a6..2d011949 100644 --- a/4dev/tests/CoreLibsACLLoginTest.php +++ b/4dev/tests/CoreLibsACLLoginTest.php @@ -1729,7 +1729,7 @@ final class CoreLibsACLLoginTest extends TestCase ], 20 ], - 'invalud search' => [ + 'invalid search' => [ 12, 'foo', [], diff --git a/4dev/tests/CoreLibsCombinedArrayHandlerTest.php b/4dev/tests/CoreLibsCombinedArrayHandlerTest.php index 1fac71ae..689f5922 100644 --- a/4dev/tests/CoreLibsCombinedArrayHandlerTest.php +++ b/4dev/tests/CoreLibsCombinedArrayHandlerTest.php @@ -107,6 +107,13 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase */ public function arraySearchRecursiveAllProvider(): array { + /* + 0: $needle, + 1: array $input, + 2: ?string $key_search_for, + 3: bool $flag, + 4: array $expected + */ return [ 'find value' => [ 0 => 'bar', @@ -172,6 +179,13 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase */ public function arraySearchSimpleProvider(): array { + /* + 0: array $input, + 1: $key, + 2: $value, + 3: bool $flag, + 4: bool $expected + */ return [ 'key/value exist' => [ 0 => self::$array, @@ -665,7 +679,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase * * @param array $input * @param string|int $key - * @param string|int $value + * @param string|int|bool $value * @param bool $expected * @return void */ diff --git a/4dev/tests/CoreLibsDBIOTest.php b/4dev/tests/CoreLibsDBIOTest.php index 4c4dea3d..c1908825 100644 --- a/4dev/tests/CoreLibsDBIOTest.php +++ b/4dev/tests/CoreLibsDBIOTest.php @@ -1253,10 +1253,14 @@ final class CoreLibsDBIOTest extends TestCase 'string value literal' => ['string literal', 'tl', '\'string literal\'',], 'empty string value literal' => ['', 'tl', '\'\'',], 'null string value literal' => [null, 'tl', 'NULL',], - // ?d (I have no idea what that does, is like string) + // escape string, but set all empty strings to null ('' is null) 'string value d' => ['string d', 'd', '\'string d\'',], 'empty string value d' => ['', 'd', 'NULL',], 'null string value d' => [null, 'd', 'NULL',], + // escape literal string, but set all empty strings to null ('' is null) + 'string value literal d' => ['string d', 'dl', '\'string d\'',], + 'empty string value literal d' => ['', 'dl', 'NULL',], + 'null string value literal d' => [null, 'dl', 'NULL',], // by bytea 'string value d' => ['string d', 'by', '\x737472696e672064',], 'empty string value d' => ['', 'by', 'NULL',], @@ -1281,7 +1285,7 @@ final class CoreLibsDBIOTest extends TestCase * @dataProvider sqlEscapeProvider * @testdox Input value $input as $flag to $expected [$_dataName] * - * @param int|float|string|null $input + * @param int|float|string|bool|null $input * @param string $flag * @param int|float|string $expected * @return void diff --git a/composer.json b/composer.json index 791089eb..57141339 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,19 @@ { + "name": "egrajp/development-corelibs-dev", + "version": "dev-master", + "description": "CoreLibs: Development package", + "type": "library", "require-dev": { "phpstan/phpstan": "^1.10", - "phan/phan": "^5.4" + "phan/phan": "^5.4", + "phpstan/extension-installer": "^1.2" + }, + "config": { + "allow-plugins": { + "phpstan/extension-installer": true + } + }, + "require": { + "php": ">=8.1" } } diff --git a/composer.lock b/composer.lock index 22e6e8ed..086a9c96 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fcdf8646822d333e75d48519c50c689a", + "content-hash": "e0be39c8d67ae1599bb76d055debab50", "packages": [], "packages-dev": [ { @@ -611,17 +611,61 @@ "time": "2022-10-14T12:47:21+00:00" }, { - "name": "phpstan/phpstan", - "version": "1.10.2", + "name": "phpstan/extension-installer", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "a2ffec7db373d8da4973d1d62add872db5cd22dd" + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f06dbb052ddc394e7896fcd1cfcd533f9f6ace40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a2ffec7db373d8da4973d1d62add872db5cd22dd", - "reference": "a2ffec7db373d8da4973d1d62add872db5cd22dd", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f06dbb052ddc394e7896fcd1cfcd533f9f6ace40", + "reference": "f06dbb052ddc394e7896fcd1cfcd533f9f6ace40", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.8.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.2.0" + }, + "time": "2022-10-17T12:59:16+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "5419375b5891add97dc74be71e6c1c34baaddf64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5419375b5891add97dc74be71e6c1c34baaddf64", + "reference": "5419375b5891add97dc74be71e6c1c34baaddf64", "shasum": "" }, "require": { @@ -651,7 +695,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.2" + "source": "https://github.com/phpstan/phpstan/tree/1.10.3" }, "funding": [ { @@ -667,7 +711,7 @@ "type": "tidelift" } ], - "time": "2023-02-23T14:36:46+00:00" + "time": "2023-02-25T14:47:13+00:00" }, { "name": "psr/container", diff --git a/phpstan.neon b/phpstan.neon index 20f58e35..de2fb518 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -30,6 +30,10 @@ parameters: - www/admin/error_test.php # admin synlink files - www/admin/edit_*.php + # config symlinks + - www/admin/config.php + - www/frontend/config.php + - www/frontend/*/config.php # ignore admin header stuff # - www/includes/admin_header.php # ignore the admin include stuff - www/includes/admin_footer.php # ignore the admin include stuff @@ -50,9 +54,9 @@ parameters: #- # this error is ignore because of the PHP 8.0 to 8.1 change for pg_*, only for 8.0 or lower # message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects resource(\\|null)?, object\\|resource(\\|bool)? given\\.$#" # path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php - - # this is for 8.1 or newer - message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects PgSql\\\\(Result|Connection(\\|string)?(\\|null)?), object\\|resource given\\.$#" - path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php + # - # this is for 8.1 or newer + # message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects PgSql\\\\(Result|Connection(\\|string)?(\\|null)?), object\\|resource given\\.$#" + # path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php # this is ignored for now # - '#Expression in empty\(\) is always falsy.#' # - diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 451aaf54..04f1db93 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -12,10 +12,10 @@ return array( 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', + '9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php', '2b9d0f43f9552984cfa82fee95491826' => $vendorDir . '/sabre/event/lib/coroutine.php', 'd81bab31d3feb45bfe2f283ea3c8fdf7' => $vendorDir . '/sabre/event/lib/Loop/functions.php', 'a1cce3d26cc15c00fcd0b3354bd72c88' => $vendorDir . '/sabre/event/lib/Promise/functions.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '6714be961f4a45ae8b9a99d5d55c5d07' => $vendorDir . '/tysonandre/var_representation_polyfill/src/var_representation.php', - '9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php', ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 4f4a8a2c..27f336ed 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -21,6 +21,7 @@ return array( 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Phan\\' => array($vendorDir . '/phan/phan/src/Phan'), + 'PHPStan\\ExtensionInstaller\\' => array($vendorDir . '/phpstan/extension-installer/src'), 'Microsoft\\PhpParser\\' => array($vendorDir . '/microsoft/tolerant-php-parser/src'), 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 4e042a27..c9869549 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -13,12 +13,12 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', + '9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php', '2b9d0f43f9552984cfa82fee95491826' => __DIR__ . '/..' . '/sabre/event/lib/coroutine.php', 'd81bab31d3feb45bfe2f283ea3c8fdf7' => __DIR__ . '/..' . '/sabre/event/lib/Loop/functions.php', 'a1cce3d26cc15c00fcd0b3354bd72c88' => __DIR__ . '/..' . '/sabre/event/lib/Promise/functions.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '6714be961f4a45ae8b9a99d5d55c5d07' => __DIR__ . '/..' . '/tysonandre/var_representation_polyfill/src/var_representation.php', - '9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php', ); public static $prefixLengthsPsr4 = array ( @@ -51,6 +51,7 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 'Psr\\Log\\' => 8, 'Psr\\Container\\' => 14, 'Phan\\' => 5, + 'PHPStan\\ExtensionInstaller\\' => 27, ), 'M' => array ( @@ -131,6 +132,10 @@ class ComposerStaticInitdd705c6e8ab22e0d642372dec7767718 array ( 0 => __DIR__ . '/..' . '/phan/phan/src/Phan', ), + 'PHPStan\\ExtensionInstaller\\' => + array ( + 0 => __DIR__ . '/..' . '/phpstan/extension-installer/src', + ), 'Microsoft\\PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/microsoft/tolerant-php-parser/src', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 8d0441e1..bf3cd69c 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -634,18 +634,65 @@ "install-path": "../phpdocumentor/type-resolver" }, { - "name": "phpstan/phpstan", - "version": "1.10.2", - "version_normalized": "1.10.2.0", + "name": "phpstan/extension-installer", + "version": "1.2.0", + "version_normalized": "1.2.0.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "a2ffec7db373d8da4973d1d62add872db5cd22dd" + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f06dbb052ddc394e7896fcd1cfcd533f9f6ace40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a2ffec7db373d8da4973d1d62add872db5cd22dd", - "reference": "a2ffec7db373d8da4973d1d62add872db5cd22dd", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f06dbb052ddc394e7896fcd1cfcd533f9f6ace40", + "reference": "f06dbb052ddc394e7896fcd1cfcd533f9f6ace40", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.8.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "time": "2022-10-17T12:59:16+00:00", + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.2.0" + }, + "install-path": "../phpstan/extension-installer" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.3", + "version_normalized": "1.10.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "5419375b5891add97dc74be71e6c1c34baaddf64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5419375b5891add97dc74be71e6c1c34baaddf64", + "reference": "5419375b5891add97dc74be71e6c1c34baaddf64", "shasum": "" }, "require": { @@ -654,7 +701,7 @@ "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2023-02-23T14:36:46+00:00", + "time": "2023-02-25T14:47:13+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -677,7 +724,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.2" + "source": "https://github.com/phpstan/phpstan/tree/1.10.3" }, "funding": [ { @@ -1786,6 +1833,7 @@ "phpdocumentor/reflection-common", "phpdocumentor/reflection-docblock", "phpdocumentor/type-resolver", + "phpstan/extension-installer", "phpstan/phpstan", "psr/container", "psr/log", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index f72f899a..6b65eafc 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'da67d1bde3260de1ef8d778f5d75f4e2c60de869', + 'reference' => '44f37b7f74e1fcbfbbdf26036117d14404011abd', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'da67d1bde3260de1ef8d778f5d75f4e2c60de869', + 'reference' => '44f37b7f74e1fcbfbbdf26036117d14404011abd', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -109,10 +109,19 @@ 'aliases' => array(), 'dev_requirement' => true, ), + 'phpstan/extension-installer' => array( + 'pretty_version' => '1.2.0', + 'version' => '1.2.0.0', + 'reference' => 'f06dbb052ddc394e7896fcd1cfcd533f9f6ace40', + 'type' => 'composer-plugin', + 'install_path' => __DIR__ . '/../phpstan/extension-installer', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'phpstan/phpstan' => array( - 'pretty_version' => '1.10.2', - 'version' => '1.10.2.0', - 'reference' => 'a2ffec7db373d8da4973d1d62add872db5cd22dd', + 'pretty_version' => '1.10.3', + 'version' => '1.10.3.0', + 'reference' => '5419375b5891add97dc74be71e6c1c34baaddf64', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), diff --git a/vendor/phpstan/extension-installer/LICENSE b/vendor/phpstan/extension-installer/LICENSE new file mode 100644 index 00000000..afe8bee4 --- /dev/null +++ b/vendor/phpstan/extension-installer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Ondřej Mirtes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/phpstan/extension-installer/README.md b/vendor/phpstan/extension-installer/README.md new file mode 100644 index 00000000..70afa415 --- /dev/null +++ b/vendor/phpstan/extension-installer/README.md @@ -0,0 +1,77 @@ +# PHPStan Extension Installer + +[![Build](https://github.com/phpstan/extension-installer/workflows/Build/badge.svg)](https://github.com/phpstan/extension-installer/actions) +[![Latest Stable Version](https://poser.pugx.org/phpstan/extension-installer/v/stable)](https://packagist.org/packages/phpstan/extension-installer) +[![License](https://poser.pugx.org/phpstan/extension-installer/license)](https://packagist.org/packages/phpstan/extension-installer) + +Composer plugin for automatic installation of [PHPStan](https://phpstan.org/) extensions. + +# Motivation + +```diff +diff --git a/phpstan.neon b/phpstan.neon +index db4e3df32e..2ca30fa20a 100644 +--- a/phpstan.neon ++++ b/phpstan.neon +@@ -1,12 +1,3 @@ +-includes: +- - vendor/phpstan/phpstan-doctrine/extension.neon +- - vendor/phpstan/phpstan-doctrine/rules.neon +- - vendor/phpstan/phpstan-nette/extension.neon +- - vendor/phpstan/phpstan-nette/rules.neon +- - vendor/phpstan/phpstan-phpunit/extension.neon +- - vendor/phpstan/phpstan-phpunit/rules.neon +- - vendor/phpstan/phpstan-strict-rules/rules.neon +- + parameters: + autoload_directories: + - %rootDir%/../../../build/SlevomatSniffs +diff --git a/composer.json b/composer.json +index 1b578dd624..f6ebf6e477 100644 +--- a/composer.json ++++ b/composer.json +@@ -142,6 +142,7 @@ + "jakub-onderka/php-parallel-lint": "1.0.0", + "justinrainbow/json-schema": "5.2.8", + "ondrejmirtes/mocktainer": "0.8", ++ "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.11.7", + "phpstan/phpstan-doctrine": "^0.11.3", + "phpstan/phpstan-nette": "^0.11.1", +``` + +## Usage + +```bash +composer require --dev phpstan/extension-installer +``` + +Starting from Composer 2.2.0 you'll get the following question: +``` +phpstan/extension-installer contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins +Do you trust "phpstan/extension-installer" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?] +``` + +Answer with `y` to allow the plugin. + +## Instructions for extension developers + +It's best (but optional) to set the extension's composer package [type](https://getcomposer.org/doc/04-schema.md#type) to `phpstan-extension` for this plugin to be able to recognize it and to be [discoverable on Packagist](https://packagist.org/explore/?type=phpstan-extension). + +Add `phpstan` key in the extension `composer.json`'s `extra` section: + +```json +{ + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + } +} +``` + +## Limitations + +The extension installer depends on Composer script events, therefore you cannot use `--no-scripts` flag. diff --git a/vendor/phpstan/extension-installer/build-cs/composer.json b/vendor/phpstan/extension-installer/build-cs/composer.json new file mode 100644 index 00000000..e3079710 --- /dev/null +++ b/vendor/phpstan/extension-installer/build-cs/composer.json @@ -0,0 +1,12 @@ +{ + "require-dev": { + "consistence-community/coding-standard": "^3.10", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "slevomat/coding-standard": "^7.0" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/vendor/phpstan/extension-installer/build-cs/composer.lock b/vendor/phpstan/extension-installer/build-cs/composer.lock new file mode 100644 index 00000000..4bcc8de4 --- /dev/null +++ b/vendor/phpstan/extension-installer/build-cs/composer.lock @@ -0,0 +1,322 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "4485bbedba7bcc71ace5f69dbb9b6c47", + "packages": [], + "packages-dev": [ + { + "name": "consistence-community/coding-standard", + "version": "3.11.1", + "source": { + "type": "git", + "url": "https://github.com/consistence-community/coding-standard.git", + "reference": "4632fead8c9ee8f50044fcbce9f66c797b34c0df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consistence-community/coding-standard/zipball/4632fead8c9ee8f50044fcbce9f66c797b34c0df", + "reference": "4632fead8c9ee8f50044fcbce9f66c797b34c0df", + "shasum": "" + }, + "require": { + "php": ">=7.4", + "slevomat/coding-standard": "~7.0", + "squizlabs/php_codesniffer": "~3.6.0" + }, + "replace": { + "consistence/coding-standard": "3.10.*" + }, + "require-dev": { + "phing/phing": "2.16.4", + "php-parallel-lint/php-parallel-lint": "1.3.0", + "phpunit/phpunit": "9.5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Consistence\\": [ + "Consistence" + ] + }, + "classmap": [ + "Consistence" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Vašek Purchart", + "email": "me@vasekpurchart.cz", + "homepage": "http://vasekpurchart.cz" + } + ], + "description": "Consistence - Coding Standard - PHP Code Sniffer rules", + "keywords": [ + "Coding Standard", + "PHPCodeSniffer", + "codesniffer", + "coding", + "cs", + "phpcs", + "ruleset", + "sniffer", + "standard" + ], + "support": { + "issues": "https://github.com/consistence-community/coding-standard/issues", + "source": "https://github.com/consistence-community/coding-standard/tree/3.11.1" + }, + "time": "2021-05-03T18:13:22+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.2", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2022-02-04T12:51:07+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "981cc368a216c988e862a75e526b6076987d1b50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/981cc368a216c988e862a75e526b6076987d1b50", + "reference": "981cc368a216c988e862a75e526b6076987d1b50", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.5.1" + }, + "time": "2022-05-05T11:32:40+00:00" + }, + { + "name": "slevomat/coding-standard", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/aff06ae7a84e4534bf6f821dc982a93a5d477c90", + "reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.5.1", + "squizlabs/php_codesniffer": "^3.6.2" + }, + "require-dev": { + "phing/phing": "2.17.3", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpstan/phpstan": "1.4.10|1.7.1", + "phpstan/phpstan-deprecation-rules": "1.0.0", + "phpstan/phpstan-phpunit": "1.0.0|1.1.1", + "phpstan/phpstan-strict-rules": "1.2.3", + "phpunit/phpunit": "7.5.20|8.5.21|9.5.20" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2022-05-25T10:58:12+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-12-12T21:44:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/vendor/phpstan/extension-installer/composer.json b/vendor/phpstan/extension-installer/composer.json new file mode 100644 index 00000000..c57fcfe5 --- /dev/null +++ b/vendor/phpstan/extension-installer/composer.json @@ -0,0 +1,32 @@ +{ + "name": "phpstan/extension-installer", + "type": "composer-plugin", + "description": "Composer plugin for automatic installation of PHPStan extensions", + "license": [ + "MIT" + ], + "require": { + "php": "^7.2 || ^8.0", + "composer-plugin-api": "^2.0", + "phpstan/phpstan": "^1.8.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "config": { + "sort-packages": true, + "allow-plugins": { + "ocramius/package-versions": true + } + }, + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + } +} diff --git a/vendor/phpstan/extension-installer/src/GeneratedConfig.php b/vendor/phpstan/extension-installer/src/GeneratedConfig.php new file mode 100644 index 00000000..3c9004ac --- /dev/null +++ b/vendor/phpstan/extension-installer/src/GeneratedConfig.php @@ -0,0 +1,26 @@ + + */ + public static function getSubscribedEvents(): array + { + return [ + ScriptEvents::POST_INSTALL_CMD => 'process', + ScriptEvents::POST_UPDATE_CMD => 'process', + ]; + } + + public function process(Event $event): void + { + $io = $event->getIO(); + + if (!file_exists(__DIR__)) { + $io->write('phpstan/extension-installer: Package not found (probably scheduled for removal); extensions installation skipped.'); + return; + } + + $composer = $event->getComposer(); + $installationManager = $composer->getInstallationManager(); + + $generatedConfigFilePath = __DIR__ . '/GeneratedConfig.php'; + $oldGeneratedConfigFileHash = null; + if (is_file($generatedConfigFilePath)) { + $oldGeneratedConfigFileHash = md5_file($generatedConfigFilePath); + } + $notInstalledPackages = []; + $installedPackages = []; + + $data = []; + $fs = new Filesystem(); + foreach ($composer->getRepositoryManager()->getLocalRepository()->getPackages() as $package) { + if ( + $package->getType() !== 'phpstan-extension' + && !isset($package->getExtra()['phpstan']) + ) { + if ( + strpos($package->getName(), 'phpstan') !== false + && !in_array($package->getName(), [ + 'phpstan/phpstan', + 'phpstan/phpstan-shim', + 'phpstan/phpdoc-parser', + 'phpstan/extension-installer', + ], true) + ) { + $notInstalledPackages[$package->getName()] = $package->getFullPrettyVersion(); + } + continue; + } + + $installPath = $installationManager->getInstallPath($package); + + $absoluteInstallPath = $fs->isAbsolutePath($installPath) + ? $installPath + : getcwd() . DIRECTORY_SEPARATOR . $installPath; + + $data[$package->getName()] = [ + 'install_path' => $absoluteInstallPath, + 'relative_install_path' => $fs->findShortestPath(dirname($generatedConfigFilePath), $absoluteInstallPath, true), + 'extra' => $package->getExtra()['phpstan'] ?? null, + 'version' => $package->getFullPrettyVersion(), + ]; + + $installedPackages[$package->getName()] = true; + } + + ksort($data); + ksort($installedPackages); + ksort($notInstalledPackages); + + $generatedConfigFileContents = sprintf(self::$generatedFileTemplate, var_export($data, true), var_export($notInstalledPackages, true)); + file_put_contents($generatedConfigFilePath, $generatedConfigFileContents); + $io->write('phpstan/extension-installer: Extensions installed'); + + if ($oldGeneratedConfigFileHash === md5($generatedConfigFileContents)) { + return; + } + + foreach (array_keys($installedPackages) as $name) { + $io->write(sprintf('> %s: installed', $name)); + } + + foreach (array_keys($notInstalledPackages) as $name) { + $io->write(sprintf('> %s: not supported', $name)); + } + } + +} diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar index e2efbc653e9cedd1e2b33d728447afc25c868488..210214f8bbe5199e4bfe9fb4709b8b1023f088cc 100755 GIT binary patch delta 159245 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 diff --git a/vendor/phpstan/phpstan/phpstan.phar.asc b/vendor/phpstan/phpstan/phpstan.phar.asc index 0bdd7d24..7c45832e 100644 --- a/vendor/phpstan/phpstan/phpstan.phar.asc +++ b/vendor/phpstan/phpstan/phpstan.phar.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmP3eecACgkQzxoQjQ56 -5yAH6A//R+CaBjUmbQhmamLiYATpskxv25DC/BQQ1+aK5sz8IlKcxPViN3Ke9QAq -qikQQ3ZDcNmBFR+p5ew9WuW4c99B/MX+Pg0Nc47keq/TxU/sslE1G7SuHssSCCxp -o1W3HihbZtDmPWYj3VWSmyEvFAbho/qpTsu9d34qDcryRCZ3A46NZ5zOdNa5uI2R -8hyhuPsWF0fnd3sxYSRCL0fPp6CAEWxIRiG53gmMjTfVdTsZQZVwzgsfiW3GAIRf -J7tYbGcBN3tyrJEFyFJCJkWt2ATla1LzucL6rrDUa9HzNsA5NUTOLj6j6PACQ0Vj -eCMfcDxKj/t6EJlHBpO2A5AiE8DOLs+lWmKiG7DqWOqqOnoYc/Fbv9RL3p25r7N2 -gv4hhyEfBE0hoUxKSzsa7M++Ler+Js0Slxc881dpDuqvBEZFyA4M9YJTM4ckK92M -LcFC1RJ5xdHx/COpYVN3w2DvZ9BVk2kvdByJGnyQ9Tp/R8HdW+cv88kYopIXZ0R5 -8m7B/zbtxMbtEzEn38JqfTtiQpE6vNH3iaWInIkP/ZZgfetCoHdXUF+NTTpTyUCm -C+NqRlgtA9NyjkdjX/kbohuxAcGsxlZu4/CfYKEIVAeCpM5sdjf4tRmmYn/5wCRF -226D4n9yPZ9YHE7HYLrRcmlx2jzsKH8wv8Z5IZ8KqZK/9tPhHoM= -=aGUS +iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmP6H1oACgkQzxoQjQ56 +5yCVhxAAlXqhfvKCITSAJjkaIhncEBHpT5Ogby65BX1O5+SkKyc/OO7JnjlN8cLB +DKbJpdc8P2Dbfo/uBHVR5YiNX5CWYzgdMzCpLQI20Ffa7qkeRbA5ZS2AfdIfLqhD +PswlQIYxg0F3lj0L+joTxfBiHgmR5wnOUx1sLXnEbqGtFzzGstPGDg9gjKKh5EnO +g207jrm1we05+k3kKzr233/ENvQD6bBWLr2yngyMoirOuDpurAuPjkBL7vN6PDbx +DlyGDazsgU/R7aE2FtqmFC8KIU/BgnpbCSWTHBEJAqtncHbwTgneyEm+88lT6cUt +YM72Rh1+QTvS3WgJ/q7AQRik2aE83Kz2rc3XOl1ADd45J3Oan1rqQXdnKtH6qZeT +wMk6PE8SQPJ8NMHy3LT048PfMOakAtgBL5xonbVqX0IFAvKAMRijwBCNKat2yRsB +0VGnoeH7klf1fSSo0xOD20Pd0uIILAWZlBjb2e/1NRytFQkokAr1bsLD/VJHiNYh +lPQ4OztCT/uumJOAgTKm10T56CK1u0VxhIVtQ+/NkTvAwrmpX0KKqbYPP/1hZqVO +vFaWJR4iLFNt+il7dlv56jmTAneUrGrWkQdVFbz5FVpqz7abIo+/cevbSSndFZCI +K1mn42aFdYXSqVTFpkzeOQeJPPysEYDysFk7ClhE+F48HN7WAtw= +=A7BG -----END PGP SIGNATURE----- diff --git a/www/admin/class_test.db.dbReturn.php b/www/admin/class_test.db.dbReturn.php index d51cbb12..9d6827e5 100644 --- a/www/admin/class_test.db.dbReturn.php +++ b/www/admin/class_test.db.dbReturn.php @@ -23,6 +23,7 @@ ob_end_flush(); use CoreLibs\Debug\Support; use CoreLibs\Debug\RunningTime; +use CoreLibs\Convert\SetVarType; $log = new CoreLibs\Debug\Logging([ 'log_folder' => BASE . LOG, @@ -78,7 +79,9 @@ for ($i = 1; $i <= 6; $i++) { (is_array($res) ? "Array: " . $db->log->prBl(is_array($res)) : '{-}') ) . ", " - . "cursor_ext:
" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "
"; + . "cursor_ext:
" . Support::printAr(
+			SetVarType::setArray($db->dbGetCursorExt($q_db_ret))
+		) . "
"; print "Run time: " . RunningTime::hrRunningTime() . "
"; } // reset all read data @@ -95,7 +98,9 @@ for ($i = 1; $i <= 6; $i++) { (is_array($res) ? "Array: " . $db->log->prBl(is_array($res)) : '{-}') ) . ", " - . "cursor_ext:
" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "
"; + . "cursor_ext:
" . Support::printAr(
+			SetVarType::setArray($db->dbGetCursorExt($q_db_ret))
+		) . "
"; print "Run time: " . RunningTime::hrRunningTime() . "
"; } // reset all read data @@ -112,7 +117,9 @@ for ($i = 1; $i <= 6; $i++) { (is_array($res) ? "Array: " . $db->log->prBl(is_array($res)) : '{-}') ) . ", " - . "cursor_ext:
" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "
"; + . "cursor_ext:
" . Support::printAr(
+			SetVarType::setArray($db->dbGetCursorExt($q_db_ret))
+		) . "
"; print "Run time: " . RunningTime::hrRunningTime() . "
"; } // reset all read data @@ -129,7 +136,9 @@ for ($i = 1; $i <= 6; $i++) { (is_array($res) ? "Array: " . $db->log->prBl(is_array($res)) : '{-}') ) . ", " - . "cursor_ext:
" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "
"; + . "cursor_ext:
" . Support::printAr(
+			SetVarType::setArray($db->dbGetCursorExt($q_db_ret))
+		) . "
"; print "Run time: " . RunningTime::hrRunningTime() . "
"; } // reset all data diff --git a/www/admin/class_test.db.php b/www/admin/class_test.db.php index 6cb00098..d6804873 100644 --- a/www/admin/class_test.db.php +++ b/www/admin/class_test.db.php @@ -62,7 +62,11 @@ print "VERSION LONG DB: " . $db->dbVersionInfo('server', false) . "
"; print "VERSION NUMERIC DB: " . $db->dbVersionNumeric() . "
"; print "SERVER ENCODING: " . $db->dbVersionInfo('server_encoding') . "
"; print "ALL PG VERSION PARAMETERS:
" . print_r($db->dbVersionInfoParameters(), true) . "

"; -print "ALL OUTPUT [TEST]:
" . print_r(pg_version($db->dbGetDbh()), true) . "

"; +if (($dbh = $db->dbGetDbh()) instanceof \PgSql\Connection) { + print "ALL OUTPUT [TEST]:
" . print_r(pg_version($dbh), true) . "

"; +} else { + print "NO DB HANDLER
"; +} print "DB Version smaller $to_db_version: " . $db->dbCompareVersion('<' . $to_db_version) . "
"; print "DB Version smaller than $to_db_version: " . $db->dbCompareVersion('<=' . $to_db_version) . "
"; print "DB Version equal $to_db_version: " . $db->dbCompareVersion('=' . $to_db_version) . "
"; @@ -108,7 +112,11 @@ print "
"; print "
";
 
-print "SOCKET: " . pg_socket($db->dbGetDbh()) . "
"; +if (($dbh = $db->dbGetDbh()) instanceof \PgSql\Connection) { + print "SOCKET: " . pg_socket($dbh) . "
"; +} else { + print "NO SOCKET
"; +} // truncate test_foo table before testing print "TRUNCATE test_foo
"; diff --git a/www/composer.json b/www/composer.json index e523b9cc..ff8404ee 100644 --- a/www/composer.json +++ b/www/composer.json @@ -24,6 +24,7 @@ } }, "require": { - "egrajp/smarty-extended": "^4.3" + "egrajp/smarty-extended": "^4.3", + "php": ">=8.1" } } diff --git a/www/configs/config.php b/www/configs/config.php index df7f3b95..a1d8eb5b 100644 --- a/www/configs/config.php +++ b/www/configs/config.php @@ -63,13 +63,14 @@ if (!defined('DIR')) { exit('Base config could not be loaded'); } // find trigger name "admin/" or "frontend/" in the getcwd() folder -foreach (['admin', 'frontend'] as $folder) { - if (strstr(getcwd() ?: '', DIRECTORY_SEPARATOR . $folder)) { +$folder = ''; +foreach (['admin', 'frontend'] as $_folder) { + if (strstr(getcwd() ?: '', DIRECTORY_SEPARATOR . $_folder)) { + $folder = $_folder; break; } } // if content path is empty, fallback is default -/** @phpstan-ignore-next-line can be empty */ if (empty($folder)) { $folder = 'default'; } diff --git a/www/lib/CoreLibs/ACL/Login.php b/www/lib/CoreLibs/ACL/Login.php index c8be7b2f..332692ea 100644 --- a/www/lib/CoreLibs/ACL/Login.php +++ b/www/lib/CoreLibs/ACL/Login.php @@ -157,7 +157,7 @@ class Login private $acl = []; /** @var array */ private $default_acl_list = []; - /** @var array Reverse list to lookup level from type */ + /** @var array Reverse list to lookup level from type */ private $default_acl_list_type = []; /** @var int default ACL level to be based on if nothing set */ private $default_acl_level = 0; @@ -332,7 +332,7 @@ class Login 'type' => $res['type'], 'name' => $res['name'] ]; - $this->default_acl_list_type[$res['type']] = $res['level']; + $this->default_acl_list_type[(string)$res['type']] = (int)$res['level']; } // write that into the session $_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list; @@ -986,7 +986,7 @@ class Login * @param string $password the new password * @return bool true or false if valid password or not */ - private function loginPasswordChangeValidPassword($password): bool + private function loginPasswordChangeValidPassword(string $password): bool { $is_valid_password = true; // check for valid in regex arrays in list @@ -1048,7 +1048,7 @@ class Login $res = $this->db->dbReturnRow($q); if ( !is_array($res) || - (is_array($res) && empty($res['edit_user_id'])) + empty($res['edit_user_id']) ) { // username wrong $this->login_error = 201; @@ -1068,9 +1068,11 @@ class Login } if ( !is_array($res) || - (is_array($res) && - (empty($res['edit_user_id']) || - !$this->loginPasswordCheck($res['old_password_hash'], $this->pw_old_password))) + empty($res['edit_user_id']) || + !$this->loginPasswordCheck( + $res['old_password_hash'], + $this->pw_old_password + ) ) { // old password wrong $this->login_error = 202; @@ -1124,7 +1126,7 @@ class Login * * @return string|null html data for login page, or null for nothing */ - private function loginCreateLoginHTML() + private function loginCreateLoginHTML(): ?string { $html_string = null; // if permission is ok, return null @@ -1421,8 +1423,12 @@ EOM; * @param string $username login user username * @return void has no return */ - private function writeLog(string $event, string $data, $error = '', string $username = ''): void - { + private function writeLog( + string $event, + string $data, + string|int $error = '', + string $username = '' + ): void { if ($this->login) { $this->action = 'Login'; } elseif ($this->logout) { @@ -1794,7 +1800,6 @@ EOM; // check that numeric, positive numeric, not longer than max input string lenght // and not short than min password length if ( - is_numeric($length) && $length >= $this->password_min_length_max && $length <= $this->password_max_length && $length <= 255 @@ -2069,9 +2074,12 @@ EOM; * @param string $type Type name to look in the acl list * @return int|bool Either int level or false for not found */ - public function loginGetAclListFromType(string $type) + public function loginGetAclListFromType(string $type): int|bool { - return $this->default_acl_list_type[$type] ?? false; + if (!isset($this->default_acl_list_type[$type])) { + return false; + } + return (int)$this->default_acl_list_type[$type]; } /** @@ -2081,7 +2089,7 @@ EOM; * @return bool true/false: if the edit access is not * in the valid list: false */ - public function loginCheckEditAccess($edit_access_id): bool + public function loginCheckEditAccess(?int $edit_access_id): bool { if ($edit_access_id === null) { return false; @@ -2122,8 +2130,10 @@ EOM; * @param string|int $data_key key value to search for * @return bool|string false for not found or string for found data */ - public function loginGetEditAccessData(int $edit_access_id, $data_key) - { + public function loginGetEditAccessData( + int $edit_access_id, + string|int $data_key + ): bool|string { if (!isset($_SESSION['UNIT'][$edit_access_id]['data'][$data_key])) { return false; } @@ -2137,9 +2147,12 @@ EOM; * @param string $uid Edit Access UID to look for * @return int|bool Either primary key in int or false in bool for not found */ - public function loginGetEditAccessIdFromUid(string $uid) + public function loginGetEditAccessIdFromUid(string $uid): int|bool { - return $_SESSION['UNIT_UID'][$uid] ?? false; + if (!isset($_SESSION['UNIT_UID'][$uid])) { + return false; + } + return (int)$_SESSION['UNIT_UID'][$uid]; } /** @@ -2204,8 +2217,10 @@ EOM; * @param string|int $data_key * @return bool|string */ - public function loginSetEditAccessData(int $edit_access_id, $data_key) - { + public function loginSetEditAccessData( + int $edit_access_id, + string|int $data_key + ): bool|string { return $this->loginGetEditAccessData($edit_access_id, $data_key); } } diff --git a/www/lib/CoreLibs/Admin/Backend.php b/www/lib/CoreLibs/Admin/Backend.php index b765cb5a..97d2da80 100644 --- a/www/lib/CoreLibs/Admin/Backend.php +++ b/www/lib/CoreLibs/Admin/Backend.php @@ -194,7 +194,7 @@ class Backend */ public function adbEditLog( string $event = '', - $data = '', + string|array $data = '', string $write_type = 'STRING' ): void { $data_binary = ''; @@ -262,7 +262,7 @@ class Backend * @param string|int $menu_show_flag * @return string|int */ - public function adbSetMenuShowFlag($menu_show_flag) + public function adbSetMenuShowFlag(string|int $menu_show_flag): string|int { // must be string or int $this->menu_show_flag = $menu_show_flag; @@ -274,7 +274,7 @@ class Backend * * @return string|int */ - public function adbGetMenuShowFlag() + public function adbGetMenuShowFlag(): string|int { return $this->menu_show_flag; } @@ -437,7 +437,7 @@ class Backend * @return array associative array * @deprecated \CoreLibs\Combined\ArrayHandler::genAssocArray() */ - public function adbAssocArray(array $db_array, $key, $value): array + public function adbAssocArray(array $db_array, string|int|bool $key, string|int|bool $value): array { trigger_error( 'Method ' . __METHOD__ . ' is deprecated: \CoreLibs\Combined\ArrayHandler::genAssocArray', @@ -453,7 +453,7 @@ class Backend * @return string formatted string * @deprecated \CoreLibs\Convert\Byte::humanReadableByteFormat() */ - public function adbByteStringFormat($number): string + public function adbByteStringFormat(string|int|float $number): string { trigger_error( 'Method ' . __METHOD__ . ' is deprecated: \CoreLibs\Convert\Byte::humanReadableByteFormat()', @@ -482,7 +482,7 @@ class Backend string $dummy = '', string $path = '', string $cache = '' - ) { + ): string|bool { trigger_error( 'Method ' . __METHOD__ . ' is deprecated: \CoreLibs\Output\Image::createThumbnail()', E_USER_DEPRECATED @@ -569,28 +569,28 @@ class Backend * Basic class holds exact the same, except the Year/Month/Day/etc strings * are translated in this call * - * @param int $year year YYYY - * @param int $month month m - * @param int $day day d - * @param int $hour hour H - * @param int $min min i - * @param string $suffix additional info printed after the date time - * variable in the drop down - * also used for ID in the on change JS call - * @param int $min_steps default is 1 (minute), can set to anything, - * is used as sum up from 0 - * @param bool $name_pos_back default false, if set to true, - * the name will be printend - * after the drop down and not before the drop down - * @return string HTML formated strings for drop down lists - * of date and time + * @param int|string $year year YYYY + * @param int|string $month month m + * @param int|string $day day d + * @param int|string $hour hour H + * @param int|string $min min i + * @param string $suffix additional info printed after the date time + * variable in the drop down + * also used for ID in the on change JS call + * @param int $min_steps default is 1 (minute), can set to anything, + * is used as sum up from 0 + * @param bool $name_pos_back default false, if set to true, + * the name will be printend + * after the drop down and not before the drop down + * @return string HTML formated strings for drop down lists + * of date and time */ public function adbPrintDateTime( - $year, - $month, - $day, - $hour, - $min, + int|string $year, + int|string $month, + int|string $day, + int|string $hour, + int|string $min, string $suffix = '', int $min_steps = 1, bool $name_pos_back = false diff --git a/www/lib/CoreLibs/Admin/EditBase.php b/www/lib/CoreLibs/Admin/EditBase.php index c84e159f..74760448 100644 --- a/www/lib/CoreLibs/Admin/EditBase.php +++ b/www/lib/CoreLibs/Admin/EditBase.php @@ -534,7 +534,7 @@ class EditBase * @throws Exception * @throws SmartyException */ - public function editBaseRun() + public function editBaseRun(): void { // set the template dir // WARNING: this has a special check for the mailing tool layout (old layout) diff --git a/www/lib/CoreLibs/Basic.php b/www/lib/CoreLibs/Basic.php index c902bde5..27d0c3eb 100644 --- a/www/lib/CoreLibs/Basic.php +++ b/www/lib/CoreLibs/Basic.php @@ -672,9 +672,6 @@ class Basic public static function arrayToString(array $array, string $connect_char): string { trigger_error('Method ' . __METHOD__ . ' is deprecated, use join()', E_USER_DEPRECATED); - if (!is_array($array)) { - $array = []; - } return join($connect_char, $array); } diff --git a/www/lib/CoreLibs/Check/Colors.php b/www/lib/CoreLibs/Check/Colors.php index 2d1d3ae3..466ff133 100644 --- a/www/lib/CoreLibs/Check/Colors.php +++ b/www/lib/CoreLibs/Check/Colors.php @@ -42,8 +42,11 @@ class Colors * @param int|false $hsl_flag flag to check for hsl type * @return bool True if no error, False if error */ - private static function rgbHslContentCheck(string $color, $rgb_flag, $hsl_flag): bool - { + private static function rgbHslContentCheck( + string $color, + int|false $rgb_flag, + int|false $hsl_flag + ): bool { // extract string between () and split into elements preg_match("/\((.*)\)/", $color, $matches); if ( diff --git a/www/lib/CoreLibs/Check/Encoding.php b/www/lib/CoreLibs/Check/Encoding.php index 09b23622..782b479e 100644 --- a/www/lib/CoreLibs/Check/Encoding.php +++ b/www/lib/CoreLibs/Check/Encoding.php @@ -25,7 +25,7 @@ class Encoding * if null is set then "none" * @return void */ - public static function setErrorChar($string): void + public static function setErrorChar(string|int|null $string): void { if (empty($string)) { $string = 'none'; @@ -52,7 +52,7 @@ class Encoding * directly * @return string|int Set error character */ - public static function getErrorChar(bool $return_substitute_func = false) + public static function getErrorChar(bool $return_substitute_func = false): string|int { // return mb_substitute_character(); if ($return_substitute_func === true) { @@ -78,14 +78,14 @@ class Encoding * @param string $string string to test * @param string $from_encoding encoding of string to test * @param string $to_encoding target encoding - * @return bool|array false if no error or + * @return array|false false if no error or * array with failed characters */ public static function checkConvertEncoding( string $string, string $from_encoding, string $to_encoding - ) { + ): array|false { // convert to target encoding and convert back $temp = mb_convert_encoding($string, $to_encoding, $from_encoding); $compare = mb_convert_encoding($temp, $from_encoding, $to_encoding); diff --git a/www/lib/CoreLibs/Check/Jason.php b/www/lib/CoreLibs/Check/Jason.php index 9a38d12c..7961c05f 100644 --- a/www/lib/CoreLibs/Check/Jason.php +++ b/www/lib/CoreLibs/Check/Jason.php @@ -32,7 +32,7 @@ class Jason * or error string ('' for no error) * @deprecated Use Json::jsonGetLastError() */ - public static function jsonGetLastError(bool $return_string = false) + public static function jsonGetLastError(bool $return_string = false): int|string { return Json::jsonGetLastError($return_string); } diff --git a/www/lib/CoreLibs/Combined/ArrayHandler.php b/www/lib/CoreLibs/Combined/ArrayHandler.php index 925df15c..8029eb0d 100644 --- a/www/lib/CoreLibs/Combined/ArrayHandler.php +++ b/www/lib/CoreLibs/Combined/ArrayHandler.php @@ -21,12 +21,12 @@ class ArrayHandler * the needle can be found in the * haystack array */ - public static function arraySearchRecursive($needle, array $haystack, ?string $key_search_for = null): array - { + public static function arraySearchRecursive( + string|int $needle, + array $haystack, + ?string $key_search_for = null + ): array { $path = []; - if (!is_array($haystack)) { - $haystack = []; - } if ( $key_search_for != null && array_key_exists($key_search_for, $haystack) && @@ -72,7 +72,7 @@ class ArrayHandler * * @param string|int $needle needle (search for) * @param array $haystack haystack (search in) - * @param string|int $key_search_for the key to look for in + * @param string|int|null $key_search_for the key to look for in * @param bool $old [true], if set to false will * return new flat layout * @param array|null $path recursive call for previous path @@ -80,9 +80,9 @@ class ArrayHandler * the element was found */ public static function arraySearchRecursiveAll( - $needle, + string|int $needle, array $haystack, - $key_search_for, + string|int|null $key_search_for, bool $old = true, ?array $path = null ): ?array { @@ -101,10 +101,6 @@ class ArrayHandler $path['work'] = []; } } - // should not be needed because it would trigger a php mehtod error - if (!is_array($haystack)) { - $haystack = []; - } // go through the array, foreach ($haystack as $_key => $_value) { @@ -152,17 +148,18 @@ class ArrayHandler * array search simple. looks for key, value combination, if found, returns true * on default does not strict check, so string '4' will match int 4 and vica versa * - * @param array $array search in as array - * @param string|int $key key (key to search in) - * @param string|int $value value (what to find) - * @param bool $strict [false], if set to true, will strict check key/value - * @return bool true on found, false on not found + * @param array $array search in as array + * @param string|int $key key (key to search in) + * @param string|int|bool $value value (what to find) + * @param bool $strict [false], if set to true, will strict check key/value + * @return bool true on found, false on not found */ - public static function arraySearchSimple(array $array, $key, $value, bool $strict = false): bool - { - if (!is_array($array)) { - $array = []; - } + public static function arraySearchSimple( + array $array, + string|int $key, + string|int|bool $value, + bool $strict = false + ): bool { foreach ($array as $_key => $_value) { // if value is an array, we search if (is_array($_value)) { @@ -189,9 +186,9 @@ class ArrayHandler * bool key flag: true: handle keys as string or int * default false: all keys are string * - * @return array|bool merged array + * @return array|false merged array */ - public static function arrayMergeRecursive() + public static function arrayMergeRecursive(): array|false { // croak on not enough arguemnts (we need at least two) if (func_num_args() < 2) { @@ -264,10 +261,10 @@ class ArrayHandler * @param array $needle elements to search for * @param array $haystack array where the $needle elements should * be searched int - * @return array|bool either the found elements or + * @return array|false either the found elements or * false for nothing found or error */ - public static function inArrayAny(array $needle, array $haystack) + public static function inArrayAny(array $needle, array $haystack): array|false { $found = []; foreach ($needle as $element) { @@ -291,8 +288,12 @@ class ArrayHandler * @param bool $set_only flag to return all (default), or set only * @return array associative array */ - public static function genAssocArray(array $db_array, $key, $value, bool $set_only = false): array - { + public static function genAssocArray( + array $db_array, + string|int|bool $key, + string|int|bool $value, + bool $set_only = false + ): array { $ret_array = []; // do this to only run count once for ($i = 0, $iMax = count($db_array); $i < $iMax; $i++) { @@ -385,11 +386,8 @@ class ArrayHandler * and will be pushed up * @return array modified, flattened array */ - public static function arrayFlatForKey(array $array, $search): array + public static function arrayFlatForKey(array $array, string|int $search): array { - if (!is_array($array)) { - $array = []; - } foreach ($array as $key => $value) { // if it is not an array do just nothing if (!is_array($value)) { diff --git a/www/lib/CoreLibs/Combined/DateTime.php b/www/lib/CoreLibs/Combined/DateTime.php index 018cf2bb..c1f16147 100644 --- a/www/lib/CoreLibs/Combined/DateTime.php +++ b/www/lib/CoreLibs/Combined/DateTime.php @@ -74,7 +74,7 @@ class DateTime * @return string formated date+time in Y-M-D h:m:s ms */ public static function dateStringFormat( - $timestamp, + int|float $timestamp, bool $show_micro = false, bool $micro_as_float = false ): string { @@ -100,8 +100,10 @@ class DateTime * @param bool $show_micro show micro seconds, default true * @return string interval formatted string or string as is */ - public static function timeStringFormat($timestamp, bool $show_micro = true): string - { + public static function timeStringFormat( + string|int|float $timestamp, + bool $show_micro = true + ): string { // check if the timestamp has any h/m/s/ms inside, if yes skip if (!preg_match("/(h|m|s|ms)/", (string)$timestamp)) { list($timestamp, $ms) = array_pad(explode('.', (string)round((float)$timestamp, 4)), 2, null); @@ -157,7 +159,7 @@ class DateTime * @param string|int|float $timestring formatted interval * @return string|int|float converted float interval, or string as is */ - public static function stringToTime($timestring) + public static function stringToTime(string|int|float $timestring): string|int|float { $timestamp = 0; if (preg_match("/(d|h|m|s|ms)/", (string)$timestring)) { @@ -247,9 +249,9 @@ class DateTime * @param string $date a date string in the format YYYY-MM-DD * @return bool true if valid date, false if date not valid */ - public static function checkDate($date): bool + public static function checkDate(string $date): bool { - if (!$date) { + if (empty($date)) { return false; } list ($year, $month, $day) = array_pad( @@ -324,7 +326,7 @@ class DateTime * @return int|bool false on error * or int -1 (se) as difference */ - public static function compareDate($start_date, $end_date) + public static function compareDate(string $start_date, string $end_date): int|bool { // pre check for empty or wrong if ($start_date == '--' || $end_date == '--' || !$start_date || !$end_date) { @@ -367,7 +369,7 @@ class DateTime * @return int|bool false for error * or -1 (se) as difference */ - public static function compareDateTime($start_datetime, $end_datetime) + public static function compareDateTime(string $start_datetime, string $end_datetime): int|bool { // pre check for empty or wrong if ($start_datetime == '--' || $end_datetime == '--' || !$start_datetime || !$end_datetime) { @@ -402,8 +404,11 @@ class DateTime * @param bool $return_named return array type, false (default), true for named * @return array 0/overall, 1/weekday, 2/weekend */ - public static function calcDaysInterval($start_date, $end_date, bool $return_named = false): array - { + public static function calcDaysInterval( + string $start_date, + string $end_date, + bool $return_named = false + ): array { // pos 0 all, pos 1 weekday, pos 2 weekend $days = []; // if anything invalid, return 0,0,0 diff --git a/www/lib/CoreLibs/Convert/Byte.php b/www/lib/CoreLibs/Convert/Byte.php index d7dc17ea..ebec727a 100644 --- a/www/lib/CoreLibs/Convert/Byte.php +++ b/www/lib/CoreLibs/Convert/Byte.php @@ -39,7 +39,7 @@ class Byte * @return string converted byte number (float) with suffix * @throws \Exception 1: no valid flag set */ - public static function humanReadableByteFormat($bytes, int $flags = 0): string + public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string { // if not numeric, return as is if (is_numeric($bytes)) { @@ -121,7 +121,7 @@ class Byte * @return string|int|float converted value or original value * @throws \Exception 1: no valid flag set */ - public static function stringByteFormat($number, int $flags = 0) + public static function stringByteFormat(string|int|float $number, int $flags = 0): string|int|float { // use SI 1000 mod and not 1024 mod if ($flags & self::BYTE_FORMAT_SI) { diff --git a/www/lib/CoreLibs/Convert/Colors.php b/www/lib/CoreLibs/Convert/Colors.php index 7f3c9f62..b88c6d3f 100644 --- a/www/lib/CoreLibs/Convert/Colors.php +++ b/www/lib/CoreLibs/Convert/Colors.php @@ -31,8 +31,12 @@ class Colors * @return string|bool rgb in hex values with leading # if set, * false for invalid color */ - public static function rgb2hex(int $red, int $green, int $blue, bool $hex_prefix = true) - { + public static function rgb2hex( + int $red, + int $green, + int $blue, + bool $hex_prefix = true + ): string|bool { $hex_color = ''; if ($hex_prefix === true) { $hex_color = '#'; @@ -61,7 +65,7 @@ class Colors string $hexStr, bool $return_as_string = false, string $seperator = ',' - ) { + ): string|array|bool { $hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string if (!is_string($hexStr)) { return false; @@ -99,7 +103,7 @@ class Colors * @return array|bool Hue, Sat, Brightness/Value * false for input value error */ - public static function rgb2hsb(int $red, int $green, int $blue) + public static function rgb2hsb(int $red, int $green, int $blue): array|bool { // check that rgb is from 0 to 255 foreach (['red', 'green', 'blue'] as $c) { @@ -146,7 +150,7 @@ class Colors * @return array|bool 0 red/1 green/2 blue array as 0-255 * false for input value error */ - public static function hsb2rgb(float $H, float $S, float $V) + public static function hsb2rgb(float $H, float $S, float $V): array|bool { // check that H is 0 to 359, 360 = 0 // and S and V are 0 to 1 @@ -232,7 +236,7 @@ class Colors * @return array|bool hue/sat/luminance * false for input value error */ - public static function rgb2hsl(int $red, int $green, int $blue) + public static function rgb2hsl(int $red, int $green, int $blue): array|bool { // check that rgb is from 0 to 255 foreach (['red', 'green', 'blue'] as $c) { @@ -285,11 +289,8 @@ class Colors * @param float $lum luminance: 0-100 * @return array|bool red/blue/green 0-255 each */ - public static function hsl2rgb(float $hue, float $sat, float $lum) + public static function hsl2rgb(float $hue, float $sat, float $lum): array|bool { - if (!is_numeric($hue)) { - return false; - } if ($hue == 360) { $hue = 0; } diff --git a/www/lib/CoreLibs/Convert/Html.php b/www/lib/CoreLibs/Convert/Html.php index 4c3f4354..147a6443 100644 --- a/www/lib/CoreLibs/Convert/Html.php +++ b/www/lib/CoreLibs/Convert/Html.php @@ -19,7 +19,7 @@ class Html * @param mixed $string string to html encode * @return mixed if string, encoded, else as is (eg null) */ - public static function htmlent($string) + public static function htmlent(mixed $string): mixed { if (is_string($string)) { return htmlentities($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); @@ -52,7 +52,7 @@ class Html * @return ?string returns checked or selected, * else returns null */ - public static function checked($haystack, string $needle, int $type = 0): ?string + public static function checked(array|string $haystack, string $needle, int $type = 0): ?string { if (is_array($haystack)) { if (in_array($needle, $haystack)) { diff --git a/www/lib/CoreLibs/Convert/Json.php b/www/lib/CoreLibs/Convert/Json.php index a051eb9f..96867157 100644 --- a/www/lib/CoreLibs/Convert/Json.php +++ b/www/lib/CoreLibs/Convert/Json.php @@ -51,13 +51,13 @@ class Json /** * returns human readable string for json errors thrown in jsonConvertToArray * - * @param bool|boolean $return_string [default=false] if set to true - * it will return the message string and not - * the error number - * @return int|string Either error number (0 for no error) - * or error string ('' for no error) + * @param bool $return_string [default=false] if set to true + * it will return the message string and not + * the error number + * @return int|string Either error number (0 for no error) + * or error string ('' for no error) */ - public static function jsonGetLastError(bool $return_string = false) + public static function jsonGetLastError(bool $return_string = false): int|string { $json_error_string = ''; // valid errors as of php 8.0 diff --git a/www/lib/CoreLibs/Convert/Math.php b/www/lib/CoreLibs/Convert/Math.php index cddf4e2e..205abbf1 100644 --- a/www/lib/CoreLibs/Convert/Math.php +++ b/www/lib/CoreLibs/Convert/Math.php @@ -48,7 +48,7 @@ class Math * @param string|int|float $number string or number to check * @return float if not number, then returns 0, else original input */ - public static function initNumeric($number): float + public static function initNumeric(string|int|float $number): float { if (!is_numeric($number)) { return 0; diff --git a/www/lib/CoreLibs/Create/RandomKey.php b/www/lib/CoreLibs/Create/RandomKey.php index 353aa568..3d340799 100644 --- a/www/lib/CoreLibs/Create/RandomKey.php +++ b/www/lib/CoreLibs/Create/RandomKey.php @@ -32,7 +32,7 @@ class RandomKey * * @return void has no return */ - private static function initRandomKeyData() + private static function initRandomKeyData(): void { // random key generation base string self::$key_range = join('', array_merge( @@ -52,7 +52,6 @@ class RandomKey private static function validateRandomKeyLenght(int $key_length): bool { if ( - is_numeric($key_length) && $key_length > 0 && $key_length <= self::$max_key_length ) { diff --git a/www/lib/CoreLibs/Create/Session.php b/www/lib/CoreLibs/Create/Session.php index f1d20f6e..46468cc8 100644 --- a/www/lib/CoreLibs/Create/Session.php +++ b/www/lib/CoreLibs/Create/Session.php @@ -18,19 +18,6 @@ class Session /** @var string list for errors */ private $session_intern_error_str = ''; - /** - * Start session - * startSession should be called for complete check - * If this is called without any name set before the php.ini name is - * used. - * - * @return void - */ - protected function startSessionCall(): void - { - session_start(); - } - /** * init a session, if array is empty or array does not have session_name set * then no auto init is run @@ -44,6 +31,19 @@ class Session } } + /** + * Start session + * startSession should be called for complete check + * If this is called without any name set before the php.ini name is + * used. + * + * @return void + */ + protected function startSessionCall(): void + { + session_start(); + } + /** * check if we are in CLI, we set this, so we can mock this * Not this is just a wrapper for the static System::checkCLI call @@ -116,7 +116,7 @@ class Session * @param string|null $session_name * @return string|bool */ - public function startSession(?string $session_name = null) + public function startSession(?string $session_name = null): string|bool { // we can't start sessions on command line if ($this->checkCliStatus()) { @@ -163,7 +163,7 @@ class Session * * @return string|bool */ - public function getSessionId() + public function getSessionId(): string|bool { return session_id(); } @@ -173,7 +173,7 @@ class Session * * @return string|bool */ - public function getSessionName() + public function getSessionName(): string|bool { return session_name(); } @@ -275,7 +275,7 @@ class Session * @param mixed $value value to set (can be anything) * @return void */ - public function setS($name, $value): void + public function setS(string|int $name, mixed $value): void { $_SESSION[$name] = $value; } @@ -286,7 +286,7 @@ class Session * @param string|int $name value key to get from _SESSION * @return mixed value stored in _SESSION */ - public function getS($name) + public function getS(string|int $name): mixed { return $_SESSION[$name] ?? ''; } @@ -297,7 +297,7 @@ class Session * @param string|int $name Name to check for * @return bool True for set, False fornot set */ - public function issetS($name): bool + public function issetS(string|int $name): bool { return isset($_SESSION[$name]); } @@ -308,7 +308,7 @@ class Session * @param string|int $name _SESSION key name to remove * @return void */ - public function unsetS($name): void + public function unsetS(string|int $name): void { if (isset($_SESSION[$name])) { unset($_SESSION[$name]); @@ -325,7 +325,7 @@ class Session * @param mixed $value * @return void */ - public function __set($name, $value): void + public function __set(string|int $name, mixed $value): void { $_SESSION[$name] = $value; } @@ -334,13 +334,14 @@ class Session * Undocumented function * * @param string|int $name - * @return mixed + * @return mixed If name is not found, it will return null */ - public function __get($name) + public function __get(string|int $name): mixed { if (isset($_SESSION[$name])) { return $_SESSION[$name]; } + return null; } /** @@ -349,7 +350,7 @@ class Session * @param string|int $name * @return bool */ - public function __isset($name): bool + public function __isset(string|int $name): bool { return isset($_SESSION[$name]); } @@ -360,7 +361,7 @@ class Session * @param string|int $name * @return void */ - public function __unset($name): void + public function __unset(string|int $name): void { if (isset($_SESSION[$name])) { unset($_SESSION[$name]); diff --git a/www/lib/CoreLibs/DB/Extended/ArrayIO.php b/www/lib/CoreLibs/DB/Extended/ArrayIO.php index 3044d414..f972e047 100644 --- a/www/lib/CoreLibs/DB/Extended/ArrayIO.php +++ b/www/lib/CoreLibs/DB/Extended/ArrayIO.php @@ -137,7 +137,7 @@ class ArrayIO extends \CoreLibs\DB\IO * @param string $text any html encoded string * @return string decoded html string */ - public function convertData($text): string + public function convertData(string $text): string { $text = str_replace('<b>', '', $text); $text = str_replace('</b>', '', $text); @@ -156,7 +156,7 @@ class ArrayIO extends \CoreLibs\DB\IO * @param string $text encoded html string * @return string decoded html string */ - public function convertEntities($text): string + public function convertEntities(string $text): string { $text = str_replace('<', '<', $text); $text = str_replace('>', '>', $text); @@ -172,7 +172,7 @@ class ArrayIO extends \CoreLibs\DB\IO * @param bool $write write to error message, default false * @return string the array data as html string entry */ - public function dbDumpArray($write = false): string + public function dbDumpArray(bool $write = false): string { reset($this->table_array); $string = ''; @@ -192,7 +192,7 @@ class ArrayIO extends \CoreLibs\DB\IO * * @return bool true if pk value is set, else false */ - public function dbCheckPkSet() + public function dbCheckPkSet(): bool { // if pk_id is set, overrule ... if ($this->pk_id) { @@ -210,10 +210,10 @@ class ArrayIO extends \CoreLibs\DB\IO /** * resets the whole array values - * @param boolean $reset_pk true if we want to reset the pk too + * @param bool $reset_pk true if we want to reset the pk too * @return void has no return */ - public function dbResetArray($reset_pk = false): void + public function dbResetArray(bool $reset_pk = false): void { reset($this->table_array); foreach (array_keys($this->table_array) as $column) { @@ -230,10 +230,10 @@ class ArrayIO extends \CoreLibs\DB\IO * * @param array $table_array optional override for table array set * set this as new table array too - * @param boolean $acl_limit [false], if set to true, well do ACL limit check + * @param bool $acl_limit [false], if set to true, well do ACL limit check * @return array returns the table array that was deleted */ - public function dbDelete($table_array = [], $acl_limit = false) + public function dbDelete(array $table_array = [], bool $acl_limit = false): array { // is array and has values, override set and set new if (is_array($table_array) && count($table_array)) { @@ -294,12 +294,12 @@ class ArrayIO extends \CoreLibs\DB\IO /** * reads one row into the array * - * @param boolean $edit on true convert data, else as is + * @param bool $edit on true convert data, else as is * @param array $table_array optional table array, overwrites * internal set array * @return array set table array with values */ - public function dbRead($edit = false, $table_array = []) + public function dbRead(bool $edit = false, array $table_array = []): array { // if array give, overrules internal array if (is_array($table_array) && count($table_array)) { @@ -381,9 +381,9 @@ class ArrayIO extends \CoreLibs\DB\IO /** * writes one set into DB or updates one set (if PK exists) * - * @param boolean $addslashes old convert entities and set set escape + * @param bool $addslashes old convert entities and set set escape * @param array $table_array optional table array, overwrites internal one - * @param boolean $acl_limit [false], if set to true, well do ACL limit check + * @param bool $acl_limit [false], if set to true, well do ACL limit check * @return array table array or null */ public function dbWrite( @@ -391,7 +391,7 @@ class ArrayIO extends \CoreLibs\DB\IO array $table_array = [], bool $acl_limit = false ): array { - if (is_array($table_array) && count($table_array)) { + if (count($table_array)) { $this->table_array = $table_array; } // PK ID check @@ -475,13 +475,12 @@ class ArrayIO extends \CoreLibs\DB\IO $this->table_array[$column]['type'] != 'view' && strlen($column) > 0 && // no acl limiter - ($acl_limit === false || ( + $acl_limit === false || // acl limit is true, min edit must be at larger than set - $acl_limit === true && $this->base_acl_level >= ($this->table_array[$column]['min_edit_acl'] ?? 100) - )) + ) ) { // for password use hidden value if main is not set if ( @@ -528,7 +527,7 @@ class ArrayIO extends \CoreLibs\DB\IO } $q_data .= $_value; } elseif (isset($this->table_array[$column]['bool'])) { - // boolean storeage (reverse check on ifset) + // bool storage (reverse check on ifset) $q_data .= "'" . $this->dbBoolean($this->table_array[$column]['value'], true) . "'"; } elseif ( isset($this->table_array[$column]['interval']) || diff --git a/www/lib/CoreLibs/DB/IO.php b/www/lib/CoreLibs/DB/IO.php index 4ecef2b5..6fc5b993 100644 --- a/www/lib/CoreLibs/DB/IO.php +++ b/www/lib/CoreLibs/DB/IO.php @@ -12,7 +12,7 @@ * 2013/10/10, prepare/excute were added, including auto RETURNING primary key if * possible for any INSERT query in exec or prepare/execute, better debugging and * data dumping. Proper string escape wrapper, special db exec writer for complex -* array inserts in auto calls. boolean converter from postresql to php +* array inserts in auto calls. bool converter from postresql to php * * 2003/12/08, one major change: renamed db_exec_ext to db_return, as it has not * much in common with the normal db_exec wrapper, as it was written only for @@ -168,7 +168,7 @@ * - all HTML from the query data (color codes, etc) via flag to debug call * * HISTORY: -* 2008/10/25 (cs) add db_boolean to fix the postgres to php boolean var problem +* 2008/10/25 (cs) add db_boolean to fix the postgres to php bool var problem * (TODO: implement this in any select return) * 2008/07/03 (cs) add db_write_data function, original written for inventory tool "invSQLWriteData" * 2008/04/16 (cs) add db_escape_string function for correct string escape @@ -288,7 +288,7 @@ class IO private $query; // the query string at the moment // only inside // basic vars - /** @var object|resource|bool|int|null */ // replace object with PgSql\Connection| + /** @var \PgSql\Connection|false|null */ // replace object with PgSql\Connection| private $dbh; // the dbh handler, if disconnected by command is null, bool:false/int:-1 on error, /** @var bool */ private $db_debug = false; // DB_DEBUG ... (if set prints out debug msgs) @@ -315,7 +315,7 @@ class IO /** @var array */ private $cursor_ext; // hash of hashes // per query vars - /** @var object|resource|bool */ // replace object with PgSql\Result + /** @var \PgSql\Result|false */ // replace object with PgSql\Result private $cursor; // actual cursor (DBH) /** @var int */ private $num_rows; // how many rows have been found @@ -495,15 +495,15 @@ class IO * OTOH this whole class is so PgSQL specific * that non PgSQL doesn't make much sense anymore * - * @return \CoreLibs\DB\SQL\PgSQL|null DB functions object or false on error + * @return SQL\PgSQL|null DB functions object or false on error */ - private function __loadDBFunctions() + private function __loadDBFunctions(): SQL\PgSQL|null { $db_functions = null; switch ($this->db_type) { // list of valid DB function objects case 'pgsql': - $db_functions = new \CoreLibs\DB\SQL\PgSQL(); + $db_functions = new SQL\PgSQL(); break; // if non set or none matching abort default: @@ -566,7 +566,7 @@ class IO */ private function __closeDB(): void { - if (!empty($this->dbh) && $this->dbh !== false) { + if (!empty($this->dbh)) { $this->db_functions->__dbClose(); $this->dbh = null; } @@ -632,9 +632,6 @@ class IO private function __printArray(array $array): string { $string = ''; - if (!is_array($array)) { - $array = []; - } foreach ($array as $key => $value) { $string .= $this->nbsp . '' . $key . ' => '; if (is_array($value)) { @@ -701,7 +698,7 @@ class IO /** * Check if there is a cursor and write this cursors error info - * @param object|resource|bool $cursor current cursor for pg_result_error, + * @param \PgSql\Result|false $cursor current cursor for pg_result_error, * pg_last_error too, but pg_result_error * is more accurate (PgSql\Result) * @return array Pos 0: if we could get the method where it was called @@ -709,7 +706,7 @@ class IO * Pos 1: if we have the pg_error_string from last error * if nothing then empty string */ - private function __dbErrorPreprocessor($cursor = false): array + private function __dbErrorPreprocessor(\PgSql\Result|false $cursor = false): array { $pg_error_string = ''; // 1 = self/__dbErrorPreprocessor, 2 = __dbError, __dbWarning, @@ -774,12 +771,15 @@ class IO /** * write an error * @param integer $error_id Any Error ID, used in debug message string - * @param object|resource|bool $cursor Optional cursor, passed on to preprocessor + * @param \PgSql\Result|false $cursor Optional cursor, passed on to preprocessor * @param string $msg optional message added to debug * @return void */ - protected function __dbError(int $error_id, $cursor = false, string $msg = ''): void - { + protected function __dbError( + int $error_id, + \PgSql\Result|false $cursor = false, + string $msg = '' + ): void { $error_id = (string)$error_id; [$where_called, $pg_error_string] = $this->__dbErrorPreprocessor($cursor); // write error msg ... @@ -798,12 +798,15 @@ class IO /** * write a warning * @param integer $warning_id Integer warning id added to debug - * @param object|resource|bool $cursor Optional cursor, passed on to preprocessor + * @param \PgSql\Result|false $cursor Optional cursor, passed on to preprocessor * @param string $msg optional message added to debug * @return void */ - protected function __dbWarning(int $warning_id, $cursor = false, string $msg = ''): void - { + protected function __dbWarning( + int $warning_id, + \PgSql\Result|false $cursor = false, + string $msg = '' + ): void { $warning_id = (string)$warning_id; [$where_called, $pg_error_string] = $this->__dbErrorPreprocessor($cursor); $this->__dbDebug( @@ -821,18 +824,18 @@ class IO /** * if there is the 'to_encoding' var set, * and the field is in the wrong encoding converts it to the target - * @param array|bool|null $row Array from fetch_row - * @return array|bool Convert fetch_row array, or false + * @param array|false $row Array from fetch_row + * @return array|false Convert fetch_row array, or false */ - private function __dbConvertEncoding($row) + private function __dbConvertEncoding(array|false $row): array|false { - if ($row === null) { + if (is_bool($row)) { return false; } // only do if array, else pass through row (can be false) if ( !is_array($row) || - empty($this->to_encoding)// || empty($this->db_encoding) + empty($this->to_encoding) ) { return $row; } @@ -914,7 +917,7 @@ class IO * check if there is another query running, or do we hang after a * PHP error * @param integer $timeout_seconds For complex timeout waits, default 3 seconds - * @return boolean True for connection OK, else false + * @return bool True for connection OK, else false */ private function __dbCheckConnectionOk(int $timeout_seconds = 3): bool { @@ -932,7 +935,7 @@ class IO * dbReturn * Read data from previous written data cache * @param string $query_hash The hash for the current query - * @param boolean $assoc_only Only return assoc value (key named) + * @param bool $assoc_only Only return assoc value (key named) * @return array Current position query data from cache */ private function __dbReturnCacheRead(string $query_hash, bool $assoc_only): array @@ -983,10 +986,11 @@ class IO * - sets internal hash for query * - checks multiple call count * @param string $query query string - * @param string $pk_name primary key [if set to NULL no returning will be added] - * @return string|bool queryt hash OR boolean false on error + * @param string $pk_name primary key + * [if set to NULL no returning will be added] + * @return string|false queryt hash OR bool false on error */ - private function __dbPrepareExec(string $query, string $pk_name) + private function __dbPrepareExec(string $query, string $pk_name): string|false { // reset current cursor before exec $this->cursor = false; @@ -1152,10 +1156,10 @@ class IO * insert_id_ext [DEPRECATED, all in insert_id_arr] * - holds all returning as array * TODO: Only use insert_id_arr and use functions to get ok array or single - * @param boolean $returning_id + * @param bool $returning_id * @param string $query * @param string|null $pk_name - * @param object|resource|bool $cursor (PgSql\Result) + * @param \PgSql\Result|false $cursor (PgSql\Result) * @param string|null $stm_name If not null, is dbExecutre run * @return void */ @@ -1163,7 +1167,7 @@ class IO bool $returning_id, string $query, ?string $pk_name, - $cursor, + \PgSql\Result|false $cursor, ?string $stm_name = null ): void { // $this->log->debug('DB SET INSERT ID', 'Ret: ' . ($returning_id ? 'Y' : 'N') @@ -1271,10 +1275,10 @@ class IO /** * get certain settings like username, db name - * @param string $name what setting to query - * @return mixed setting value, if not allowed name return false + * @param string $name what setting to query + * @return int|string|bool setting value, if not allowed name return false */ - public function dbGetSetting(string $name) + public function dbGetSetting(string $name): int|string|bool { $setting = ''; switch ($name) { @@ -1373,7 +1377,7 @@ class IO * extended version info, can access all additional information data * @param string $parameter Array parameter name, if not valid returns * empty string - * @param boolean $strip Strip extended server info string, default true + * @param bool $strip Strip extended server info string, default true * eg nn.n (other info) will only return nn.n * @return string Parameter value */ @@ -1392,14 +1396,15 @@ class IO } /** - * returns boolean true or false if the string matches the database version + * returns bool true or false if the string matches the database version * @param string $compare string to match in type =X.Y, >X.Y, =X.Y * @return bool true for ok, false on not ok */ public function dbCompareVersion(string $compare): bool { $matches = []; - // compare has =, >, < prefix, and gets stripped, if the rest is not X.Y format then error + // compare has =, >, < prefix, and gets stripped + // if the rest is not X.Y format then error preg_match("/^([<>=]{1,})(\d{1,})\.(\d{1,})/", $compare, $matches); $compare = $matches[1]; $to_master = $matches[2]; @@ -1464,7 +1469,7 @@ class IO * else current cursor * @return string Formated string with all the data in the array */ - public function dbDumpData($query = ''): string + public function dbDumpData(string $query = ''): string { // set start array if ($query) { @@ -1490,7 +1495,7 @@ class IO * @param string|int|float|bool $string string to escape * @return string escaped string */ - public function dbEscapeString($string): string + public function dbEscapeString(string|int|float|bool $string): string { return $this->db_functions->__dbEscapeString($string); } @@ -1501,7 +1506,7 @@ class IO * @param string|int|float|bool $string string to escape * @return string escaped string */ - public function dbEscapeLiteral($string): string + public function dbEscapeLiteral(string|int|float|bool $string): string { return $this->db_functions->__dbEscapeLiteral($string); } @@ -1538,11 +1543,11 @@ class IO /** * clear up any data for valid DB insert - * @param int|float|string|null $value to escape data - * @param string $kbn escape trigger type - * @return string escaped value + * @param int|float|string|bool|null $value to escape data + * @param string $kbn escape trigger type + * @return string escaped value */ - public function dbSqlEscape($value, string $kbn = '') + public function dbSqlEscape(int|float|string|bool|null $value, string $kbn = ''): string { switch ($kbn) { case 'i': @@ -1551,24 +1556,35 @@ class IO case 'f': $value = empty($value) ? 'NULL' : floatval($value); break; + // string (null is null, else is string) case 't': $value = $value === null ? 'NULL' : "'" . $this->dbEscapeString($value) . "'"; break; + // string litereal (null is null, else is stirng) case 'tl': $value = $value === null ? 'NULL' : $this->dbEscapeLiteral($value); break; - // what is d? + // escape string, set empty to null case 'd': - $value = empty($value) ? 'NULL' : "'" . $this->dbEscapeString($value) . "'"; + $value = empty($value) ? + 'NULL' : + "'" . $this->dbEscapeString($value) . "'"; + break; + // escape string literal, set empty to null + case 'dl': + $value = empty($value) ? + 'NULL' : + $this->dbEscapeLiteral($value); break; // bytea data case 'by': $value = empty($value) ? 'NULL' : $this->dbEscapeBytea((string)$value); break; + // bool case 'b': if (is_float($value)) { $value = (int)$value; @@ -1577,6 +1593,7 @@ class IO 'NULL' : "'" . $this->dbBoolean($value, true) . "'"; break; + // int, but with empty value is 0 case 'i2': $value = empty($value) ? 0 : intval($value); break; @@ -1590,14 +1607,14 @@ class IO /** * if the input is a single char 't' or 'f - * it will return the boolean value instead + * it will return the bool value instead * also converts smallint 1/0 to true false * @param string|bool|int $string 't' / 'f' or any string, or bool true/false - * @param boolean $rev do reverse (bool to string) - * @return bool|string correct php boolean true/false + * @param bool $rev do reverse (bool to string) + * @return bool|string correct php bool true/false * or postgresql 't'/'f' */ - public function dbBoolean($string, $rev = false) + public function dbBoolean(string|bool|int $string, bool $rev = false): bool|string { if (!$rev) { if ($string == 't' || $string == 'true') { @@ -1696,9 +1713,9 @@ class IO * returns an array of the table with columns and values. FALSE on no table found * @param string $table table name * @param string $schema optional schema name - * @return array|bool array of table data, false on error (table not found) + * @return array|false array of table data, false on error (table not found) */ - public function dbShowTableMetaData(string $table, string $schema = '') + public function dbShowTableMetaData(string $table, string $schema = ''): array|false { $this->__dbErrorReset(); $table = (!empty($schema) ? $schema . '.' : '') . $table; @@ -1736,14 +1753,14 @@ class IO * NO_CACHE/3: don't write cache * @param bool $assoc_only True to only returned the named and not * index position ones - * @return array|bool return array data or false on error/end + * @return array|false return array data or false on error/end * @#suppress PhanTypeMismatchDimFetch */ public function dbReturn( string $query, int $cache = self::USE_CACHE, bool $assoc_only = false - ) { + ): array|false { $this->__dbErrorReset(); if (!$query) { $this->__dbError(11); @@ -1754,7 +1771,7 @@ class IO // pre declare array if (!isset($this->cursor_ext[$query_hash])) { $this->cursor_ext[$query_hash] = [ - // cursor, null: unset, 1: finished read/cache, 2: object/resource reading + // cursor, null: unset, 1: finished read/cache, 2: object reading 'cursor' => null, // cached data 'data' => [], @@ -2000,9 +2017,9 @@ class IO * if pk name is table name and _id, pk_name * is not needed to be set * if NULL is given here, no RETURNING will be auto added - * @return object|resource|bool cursor for this query or false on error (PgSql\Result) + * @return \PgSql\Result|false cursor for this query or false on error */ - public function dbExec(string $query = '', string $pk_name = '') + public function dbExec(string $query = '', string $pk_name = ''): \PgSql\Result|false { $this->__dbErrorReset(); // prepare and check if we can actually run it @@ -2031,7 +2048,7 @@ class IO /** * executes a cursor and returns the data, if no more data 0 will be returned - * @param object|resource|bool $cursor the cursor from db_exec or + * @param \PgSql\Result|false $cursor the cursor from db_exec or * pg_query/pg_exec/mysql_query * if not set will use internal cursor, * if not found, stops with 0 (error) @@ -2039,9 +2056,9 @@ class IO * @param bool $assoc_only false is default, * if true only named rows, * not numbered index rows - * @return array|bool row array or false on error + * @return array|false row array or false on error */ - public function dbFetchArray($cursor = false, bool $assoc_only = false) + public function dbFetchArray(\PgSql\Result|false $cursor = false, bool $assoc_only = false): array|false { $this->__dbErrorReset(); // set last available cursor if none set or false @@ -2064,9 +2081,9 @@ class IO * returns the FIRST row of the given query * @param string $query the query to be executed * @param bool $assoc_only if true, only return assoc entry (default false) - * @return array|bool row array or false on error + * @return array|false row array or false on error */ - public function dbReturnRow(string $query, bool $assoc_only = false) + public function dbReturnRow(string $query, bool $assoc_only = false): array|false { $this->__dbErrorReset(); if (!$query) { @@ -2091,9 +2108,9 @@ class IO * createds an array of hashes of the query (all data) * @param string $query the query to be executed * @param bool $assoc_only if true, only name ref are returned (default true) - * @return array|bool array of hashes (row -> fields), false on error + * @return array|false array of hashes (row -> fields), false on error */ - public function dbReturnArray(string $query, bool $assoc_only = true) + public function dbReturnArray(string $query, bool $assoc_only = true): array|false { $this->__dbErrorReset(); if (!$query) { @@ -2151,41 +2168,44 @@ class IO * returns the full array for cursor ext * or cursor for one query * or detail data fonr one query cursor data - * @param string|null $query Query string, if not null convert to hash - * and return set cursor ext for only this - * if not found or null return null - * @return array|string|int|resource|object|null - * Cursor Extended array full if no parameter - * Key is hash string from query run - * Or cursor data entry if query field is set - * If nothing found return null + * @param string|null $query Query string, if not null convert to hash + * and return set cursor ext for only this + * if not found or null return null + * @param string $query_field [=''] optional query field to get + * @return array|string|int|\PgSql\Result|null + * Cursor Extended array full if no parameter + * Key is hash string from query run + * Or cursor data entry if query field is set + * If nothing found return null */ - public function dbGetCursorExt($query = null, string $query_field = '') - { - if ($query !== null) { - $query_hash = $this->dbGetQueryHash($query); - if ( - is_array($this->cursor_ext) && - isset($this->cursor_ext[$query_hash]) - ) { - if (empty($query_field)) { - return $this->cursor_ext[$query_hash]; - } else { - return $this->cursor_ext[$query_hash][$query_field] ?? null; - } - } else { - return null; - } + public function dbGetCursorExt( + $query = null, + string $query_field = '' + ): array|string|int|\PgSql\Result|null { + if ($query === null) { + return $this->cursor_ext; + } + $query_hash = $this->dbGetQueryHash($query); + if ( + is_array($this->cursor_ext) && + isset($this->cursor_ext[$query_hash]) + ) { + if (empty($query_field)) { + return $this->cursor_ext[$query_hash]; + } else { + return $this->cursor_ext[$query_hash][$query_field] ?? null; + } + } else { + return null; } - return $this->cursor_ext; } /** * returns the current position the read out * @param string $query query to find in cursor_ext - * @return int|bool query position (row pos), false on error + * @return int|false query position (row pos), false on error */ - public function dbGetCursorPos(string $query) + public function dbGetCursorPos(string $query): int|false { $this->__dbErrorReset(); if (!$query) { @@ -2199,9 +2219,9 @@ class IO /** * returns the number of rows for the current select query * @param string $query query to find in cursor_ext - * @return int|bool query position (row pos), false on error + * @return int|false query position (row pos), false on error */ - public function dbGetCursorNumRows(string $query) + public function dbGetCursorNumRows(string $query): int|false { $this->__dbErrorReset(); if (!$query) { @@ -2253,11 +2273,14 @@ class IO * @param string $stm_name statement name * @param string $query queryt string to run * @param string $pk_name optional primary key - * @return bool|object|resource false on error, true on warning or - * result on full ok (PgSql\Result) + * @return \PgSql\Result|bool false on error, true on warning or + * result on full ok */ - public function dbPrepare(string $stm_name, string $query, string $pk_name = '') - { + public function dbPrepare( + string $stm_name, + string $query, + string $pk_name = '' + ): \PgSql\Result|bool { $this->__dbErrorReset(); $matches = []; if (!$query) { @@ -2361,9 +2384,9 @@ class IO * runs a prepare query * @param string $stm_name statement name for the query to run * @param array $data data to run for this query, empty array for none - * @return mixed false on error, or result on OK + * @return \PgSql\Result|false false on error, or result on OK */ - public function dbExecute(string $stm_name, array $data = []) + public function dbExecute(string $stm_name, array $data = []): \PgSql\Result|false { $this->__dbErrorReset(); // if no DB Handler drop out @@ -2483,11 +2506,10 @@ class IO /** * checks a previous async query and returns data if finished * NEEDS : dbExecAsync - * @return bool|object|resource cursor resource if the query is still running, - * false if an error occured or cursor of that query - * (PgSql\Result) + * @return \PgSql\Result|bool cursor resource if the query is still running, + * false if an error occured or cursor of that query */ - public function dbCheckAsync() + public function dbCheckAsync(): \PgSql\Result|bool { $this->__dbErrorReset(); // if there is actually a async query there @@ -2547,7 +2569,7 @@ class IO * @param int $primary_key id key to decide if we write insert or update * @param string $table name for the target table * @param array $data data array to override _POST data - * @return int|bool primary key + * @return int|false primary key */ public function dbWriteData( array $write_array, @@ -2555,13 +2577,7 @@ class IO int $primary_key, string $table, array $data = [] - ) { - if (!is_array($write_array)) { - $write_array = []; - } - if (!is_array($not_write_array)) { - $not_write_array = []; - } + ): int|false { $not_write_update_array = []; return $this->dbWriteDataExt( $write_array, @@ -2586,16 +2602,16 @@ class IO * to write during update (optional) * @param array $data optional array with data * if not _POST vars are used - * @return int|bool primary key + * @return int|false primary key */ public function dbWriteDataExt( array $write_array, - $primary_key, + int|string|array $primary_key, string $table, array $not_write_array = [], array $not_write_update_array = [], array $data = [] - ) { + ): int|false { if (!is_array($primary_key)) { $primary_key = [ 'row' => $table . '_id', @@ -2711,7 +2727,10 @@ class IO $primary_key['value'] = $this->dbGetInsertPK(); } // if there is not priamry key value field return false - return $primary_key['value'] ?? false; + if (!is_numeric($primary_key['value'])) { + return false; + } + return (int)$primary_key['value']; } // *************************** @@ -2724,7 +2743,7 @@ class IO * @param bool|null $debug true/false or null for just getting current set * @return bool Current debug flag as set */ - public function dbSetDebug($debug = null): bool + public function dbSetDebug(?bool $debug = null): bool { if ($debug !== null) { $this->db_debug = $debug; @@ -2805,7 +2824,7 @@ class IO * @return bool False on failure to find schema value or set schema, * True on successful set */ - public function dbSetSchema(string $db_schema) + public function dbSetSchema(string $db_schema): bool { $this->__dbErrorReset(); if (empty($db_schema)) { @@ -2934,9 +2953,9 @@ class IO /** * Return current database handler - * @return object|resource|bool|int|null + * @return \PgSql\Connection|false|null */ - public function dbGetDbh() + public function dbGetDbh(): \PgSql\Connection|false|null { return $this->dbh; } @@ -2992,7 +3011,7 @@ class IO * * @return array|string|int|null Current insert query primary key */ - public function dbGetInsertPK() + public function dbGetInsertPK(): array|string|int|null { if (empty($this->insert_id_pk_name)) { return null; @@ -3016,7 +3035,7 @@ class IO * @param integer|null $pos * @return array|string|int|null */ - public function dbGetReturningExt(?string $key = null, ?int $pos = null) + public function dbGetReturningExt(?string $key = null, ?int $pos = null): array|string|int|null { // return as is if key is null if ($key === null) { @@ -3110,7 +3129,7 @@ class IO * Not ethat returnin_id also can return false * but will not set an error entry */ - public function dbGetPrepareCursorValue(string $stm_name, string $key) + public function dbGetPrepareCursorValue(string $stm_name, string $key): null|string|int|bool { // if no statement name if (empty($stm_name)) { @@ -3159,8 +3178,8 @@ class IO * Sets error number that was last * So we always have the last error number stored even if a new * one is created - * @param boolean $transform Set to true to transform into id + error message - * @return string Last error number as string or error message + * @param bool $transform Set to true to transform into id + error message + * @return string Last error number as string or error message */ public function dbGetLastError(bool $transform = false): string { @@ -3180,10 +3199,10 @@ class IO /** * Sets warning number that was last * So we always have the last warning number stored even if a new one is created - * @param boolean $transform Set to true to transform into id + warning message - * @return string Last Warning number as string or warning message + * @param bool $transform Set to true to transform into id + warning message + * @return string Last Warning number as string or warning message */ - public function dbGetLastWarning(bool $transform = false) + public function dbGetLastWarning(bool $transform = false): string { // if no warning, return empty if (empty($this->warning_id)) { @@ -3221,7 +3240,7 @@ class IO * Null for error * @deprecated Use ->dbGetInsertPK(); */ - public function dbGetReturning() + public function dbGetReturning(): array|string|int|bool|null { return $this->dbGetInsertPK(); } @@ -3271,7 +3290,7 @@ class IO * @return array|string|int|bool|null See above * @deprecated use getReturningExt($key = null) instead */ - public function getInsertReturn($key = null) + public function getInsertReturn(?string $key = null): array|string|int|bool|null { trigger_error('Method ' . __METHOD__ . ' is deprecated, use getReturningExt($key = null)', E_USER_DEPRECATED); return $this->dbGetReturningExt($key); @@ -3282,7 +3301,7 @@ class IO * @return array|string|int|bool|null [DEPRECATED] * @deprecated use dbGetReturning() instead */ - public function getReturning() + public function getReturning(): array|string|int|bool|null { trigger_error('Method ' . __METHOD__ . ' is deprecated, use dbGetReturning()', E_USER_DEPRECATED); return $this->dbGetInsertPK(); @@ -3293,7 +3312,7 @@ class IO * @return array|string|int|bool|null [DEPRECATED] * @deprecated use dbGetInsertPK() instead */ - public function getInsertPK() + public function getInsertPK(): array|string|int|bool|null { trigger_error('Method ' . __METHOD__ . ' is deprecated, use dbGetInsertPK()', E_USER_DEPRECATED); return $this->dbGetInsertPK(); @@ -3305,7 +3324,7 @@ class IO * @return array|string|bool|int|null [DEPRECATED] * @deprecated use dbGetReturningExt($key = null) instead */ - public function getReturningExt($key = null) + public function getReturningExt(?string $key = null): array|string|int|bool|null { trigger_error('Method ' . __METHOD__ . ' is deprecated, use dbGetReturningExt($key = null)', E_USER_DEPRECATED); return $this->dbGetReturningExt($key); @@ -3314,10 +3333,10 @@ class IO /** * DEPRECATED: getCursorExt * @param string|null $q [DEPRECATED] - * @return array|string|int|resource|object|null [DEPRECATED] + * @return array|string|int|\PgSql\Result|null [DEPRECATED] * @deprecated use dbGetCursorExt($q = null) instead */ - public function getCursorExt($q = null) + public function getCursorExt(?string $q = null): array|string|int|\PgSql\Result|null { trigger_error('Method ' . __METHOD__ . ' is deprecated, use dbGetCursorExt($q = null)', E_USER_DEPRECATED); return $this->dbGetCursorExt($q); @@ -3328,7 +3347,7 @@ class IO * @return int|null [DEPRECATED] * @deprecated use dbGetNumRows() instead */ - public function getNumRows() + public function getNumRows(): ?int { trigger_error('Method ' . __METHOD__ . ' is deprecated, use dbGetNumRows()', E_USER_DEPRECATED); return $this->dbGetNumRows(); diff --git a/www/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php b/www/lib/CoreLibs/DB/SQL/Interface/SqlFunctions.php similarity index 64% rename from www/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php rename to www/lib/CoreLibs/DB/SQL/Interface/SqlFunctions.php index 9380519f..36ef0f51 100644 --- a/www/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php +++ b/www/lib/CoreLibs/DB/SQL/Interface/SqlFunctions.php @@ -6,7 +6,7 @@ declare(strict_types=1); -namespace CoreLibs\DB\SQL\SqlInterface; +namespace CoreLibs\DB\SQL\Interface; interface SqlFunctions { @@ -21,33 +21,33 @@ interface SqlFunctions * Undocumented function * * @param string $query - * @return object|resource|bool + * @return \PgSql\Result|false */ - public function __dbQuery(string $query); + public function __dbQuery(string $query): \PgSql\Result|false; /** * Undocumented function * * @param string $query * @param array $params - * @return object|resource|bool + * @return \PgSql\Result|false */ - public function __dbQueryParams(string $query, array $params); + public function __dbQueryParams(string $query, array $params): \PgSql\Result|false; /** * Undocumented function * * @param string $query - * @return boolean + * @return bool */ public function __dbSendQuery(string $query): bool; /** * Undocumented function * - * @return object|resource|bool + * @return \PgSql\Result|false */ - public function __dbGetResult(); + public function __dbGetResult(): \PgSql\Result|false; /** * Undocumented function @@ -61,85 +61,85 @@ interface SqlFunctions * * @param string $name * @param string $query - * @return object|resource|bool + * @return \PgSql\Result|false */ - public function __dbPrepare(string $name, string $query); + public function __dbPrepare(string $name, string $query): \PgSql\Result|false; /** * Undocumented function * * @param string $name * @param array $data - * @return object|resource|bool + * @return \PgSql\Result|false */ - public function __dbExecute(string $name, array $data); + public function __dbExecute(string $name, array $data): \PgSql\Result|false; /** * Undocumented function * - * @param object|resource|bool $cursor - * @return integer + * @param \PgSql\Result|false $cursor + * @return int */ - public function __dbNumRows($cursor): int; + public function __dbNumRows(\PgSql\Result|false $cursor): int; /** * Undocumented function * - * @param object|resource|bool $cursor - * @return integer + * @param \PgSql\Result|false $cursor + * @return int */ - public function __dbNumFields($cursor): int; + public function __dbNumFields(\PgSql\Result|false $cursor): int; /** * Undocumented function * - * @param object|resource|bool $cursor + * @param \PgSql\Result|false $cursor * @param int $i - * @return string|bool + * @return string|false */ - public function __dbFieldName($cursor, int $i); + public function __dbFieldName(\PgSql\Result|false $cursor, int $i): string|false; /** * Undocumented function * - * @param object|resource|bool $cursor + * @param \PgSql\Result|false $cursor * @param int $result_type * @return array|bool */ - public function __dbFetchArray($cursor, int $result_type = PGSQL_BOTH); + public function __dbFetchArray(\PgSql\Result|false $cursor, int $result_type = PGSQL_BOTH); /** * Undocumented function * - * @param boolean $assoc_type - * @return integer + * @param bool $assoc_type + * @return int */ public function __dbResultType(bool $assoc_type = true): int; /** * Undocumented function * - * @param object|resource|bool $cursor + * @param \PgSql\Result|false $cursor * @return array|bool */ - public function __dbFetchAll($cursor); + public function __dbFetchAll(\PgSql\Result|false $cursor): array|bool; /** * Undocumented function * - * @param object|resource|bool $cursor - * @return integer + * @param \PgSql\Result|false $cursor + * @return int */ - public function __dbAffectedRows($cursor): int; + public function __dbAffectedRows(\PgSql\Result|false $cursor): int; /** * Undocumented function * * @param string $query * @param string|null $pk_name - * @return string|integer|false + * @return string|int|false */ - public function __dbInsertId(string $query, ?string $pk_name); + public function __dbInsertId(string $query, ?string $pk_name): string|int|false; /** * Undocumented function @@ -148,7 +148,7 @@ interface SqlFunctions * @param string $schema * @return string|bool */ - public function __dbPrimaryKey(string $table, string $schema = ''); + public function __dbPrimaryKey(string $table, string $schema = ''): string|bool; /** * Undocumented function @@ -157,9 +157,9 @@ interface SqlFunctions * @param string $db_user * @param string $db_pass * @param string $db_name - * @param integer $db_port + * @param int $db_port * @param string $db_ssl - * @return object|resource|bool + * @return \PgSql\Connection|false */ public function __dbConnect( string $db_host, @@ -168,24 +168,24 @@ interface SqlFunctions string $db_name, int $db_port, string $db_ssl = 'allow' - ); + ): \PgSql\Connection|false; /** * Undocumented function * - * @param object|resource|bool $cursor + * @param \PgSql\Result|false $cursor * @return string */ - public function __dbPrintError($cursor = false): string; + public function __dbPrintError(\PgSql\Result|false $cursor = false): string; /** * Undocumented function * * @param string $table - * @param boolean $extended + * @param bool $extended * @return array|bool */ - public function __dbMetaData(string $table, $extended = true); + public function __dbMetaData(string $table, bool $extended = true): array|bool; /** * Undocumented function @@ -193,7 +193,7 @@ interface SqlFunctions * @param string|int|float|bool $string * @return string */ - public function __dbEscapeString($string): string; + public function __dbEscapeString(string|int|float|bool $string): string; /** * Undocumented function @@ -201,7 +201,7 @@ interface SqlFunctions * @param string|int|float|bool $string * @return string */ - public function __dbEscapeLiteral($string): string; + public function __dbEscapeLiteral(string|int|float|bool $string): string; /** * Undocumented function @@ -230,15 +230,15 @@ interface SqlFunctions /** * Undocumented function * - * @return boolean + * @return bool */ public function __dbConnectionBusy(): bool; /** * Undocumented function * - * @param integer $timeout_seconds - * @return boolean + * @param int $timeout_seconds + * @return bool */ public function __dbConnectionBusySocketWait(int $timeout_seconds = 3): bool; @@ -253,8 +253,8 @@ interface SqlFunctions * Undocumented function * * @param string $array_text - * @param integer $start - * @param integer|null $end + * @param int $start + * @param int|null $end * @return array|null */ public function __dbArrayParse( @@ -275,7 +275,7 @@ interface SqlFunctions * Undocumented function * * @param string $db_schema - * @return integer + * @return int */ public function __dbSetSchema(string $db_schema): int; @@ -290,7 +290,7 @@ interface SqlFunctions * Undocumented function * * @param string $db_encoding - * @return integer + * @return int */ public function __dbSetEncoding(string $db_encoding): int; diff --git a/www/lib/CoreLibs/DB/SQL/PgSQL.php b/www/lib/CoreLibs/DB/SQL/PgSQL.php index 251148b6..b9da6d3a 100644 --- a/www/lib/CoreLibs/DB/SQL/PgSQL.php +++ b/www/lib/CoreLibs/DB/SQL/PgSQL.php @@ -51,12 +51,11 @@ namespace CoreLibs\DB\SQL; // as main system. Currently all @var sets are written as object /** @#phan-file-suppress PhanUndeclaredTypeProperty,PhanUndeclaredTypeParameter,PhanUndeclaredTypeReturnType */ -class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions +class PgSQL implements Interface\SqlFunctions { /** @var string */ private $last_error_query; - // NOTE for PHP 8.1 this is no longer a resource - /** @var object|resource|bool */ // replace object with PgSql\Connection + /** @var \PgSql\Connection|false */ private $dbh; /** @@ -77,12 +76,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * wrapper for pg_query, catches error and stores it in class var * * @param string $query Query string - * @return object|resource|bool query result (PgSql\Result) + * @return \PgSql\Result|false query result */ - public function __dbQuery(string $query) + public function __dbQuery(string $query): \PgSql\Result|false { $this->last_error_query = ''; - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } // read out the query status and save the query if needed @@ -100,12 +99,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * * @param string $query Query string with placeholders $1, .. * @param array $params Matching parameters for each placerhold - * @return object|resource|bool Query result (PgSql\Result) + * @return \PgSql\Result|false Query result */ - public function __dbQueryParams(string $query, array $params) + public function __dbQueryParams(string $query, array $params): \PgSql\Result|false { $this->last_error_query = ''; - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } // parse query and get all $n entries @@ -126,7 +125,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions */ public function __dbSendQuery(string $query): bool { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } $result = pg_send_query($this->dbh, $query); @@ -136,12 +135,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * wrapper for pg_get_result * - * @return object|resource|bool resource handler or false for error (PgSql\Result) + * @return \PgSql\Result|false resource handler or false for error */ - public function __dbGetResult() + public function __dbGetResult(): \PgSql\Result|false { $this->last_error_query = ''; - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } $result = pg_get_result($this->dbh); @@ -161,7 +160,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions */ public function __dbClose(): void { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return; } if (pg_connection_status($this->dbh) === PGSQL_CONNECTION_OK) { @@ -175,12 +174,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * * @param string $name statement name * @param string $query query string - * @return object|resource|bool prepare statement handler or - * false for error (PgSql\Result) + * @return \PgSql\Result|false prepare statement handler or + * false for error */ - public function __dbPrepare(string $name, string $query) + public function __dbPrepare(string $name, string $query): \PgSql\Result|false { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } $result = pg_prepare($this->dbh, $name, $query); @@ -195,11 +194,11 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * * @param string $name statement name * @param array $data data array - * @return object|resource|bool returns status or false for error (PgSql\Result) + * @return \PgSql\Result|false returns status or false for error */ - public function __dbExecute(string $name, array $data) + public function __dbExecute(string $name, array $data): \PgSql\Result|false { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } $result = pg_execute($this->dbh, $name, $data); @@ -212,12 +211,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * wrapper for pg_num_rows * - * @param object|resource|bool $cursor cursor PgSql\Result (former resource) - * @return int number of rows, -1 on error + * @param \PgSql\Result|false $cursor cursor + * @return int number of rows, -1 on error */ - public function __dbNumRows($cursor): int + public function __dbNumRows(\PgSql\Result|false $cursor): int { - if ($cursor === false || is_bool($cursor)) { + if (is_bool($cursor)) { return -1; } return pg_num_rows($cursor); @@ -226,12 +225,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * wrapper for pg_num_fields * - * @param object|resource|bool $cursor cursor PgSql\Result (former resource) - * @return int number for fields in result, -1 on error + * @param \PgSql\Result|false $cursor cursor + * @return int number for fields in result, -1 on error */ - public function __dbNumFields($cursor): int + public function __dbNumFields(\PgSql\Result|false $cursor): int { - if ($cursor === false || is_bool($cursor)) { + if (is_bool($cursor)) { return -1; } return pg_num_fields($cursor); @@ -240,13 +239,13 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * wrapper for pg_field_name * - * @param object|resource|bool $cursor cursor PgSql\Result (former resource) - * @param int $i field position - * @return string|bool name or false on error + * @param \PgSql\Result|false $cursor cursor + * @param int $i field position + * @return string|false name or false on error */ - public function __dbFieldName($cursor, int $i) + public function __dbFieldName(\PgSql\Result|false $cursor, int $i): string|false { - if ($cursor === false || is_bool($cursor)) { + if (is_bool($cursor)) { return false; } return pg_field_name($cursor, $i); @@ -256,13 +255,13 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * wrapper for pg_fetch_array * if through/true false, use __dbResultType(true) * - * @param object|resource|bool $cursor cursor PgSql\Result (former resource) - * @param int $result_type result type as int number - * @return array|bool array result data or false on end/error + * @param \PgSql\Result|false $cursor cursor + * @param int $result_type result type as int number + * @return array|false array result data or false on end/error */ - public function __dbFetchArray($cursor, int $result_type = PGSQL_BOTH) + public function __dbFetchArray(\PgSql\Result|false $cursor, int $result_type = PGSQL_BOTH): array|false { - if ($cursor === false || is_bool($cursor)) { + if (is_bool($cursor)) { return false; } // result type is passed on as is [should be checked] @@ -287,12 +286,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * wrapper for pg_fetch_all * - * @param object|resource|bool $cursor cursor PgSql\Result (former resource) - * @return array|bool data array or false for end/error + * @param \PgSql\Result|false $cursor cursor + * @return array|false data array or false for end/error */ - public function __dbFetchAll($cursor) + public function __dbFetchAll(\PgSql\Result|false $cursor): array|false { - if ($cursor === false || is_bool($cursor)) { + if (is_bool($cursor)) { return false; } return pg_fetch_all($cursor); @@ -301,12 +300,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * wrapper for pg_affected_rows * - * @param object|resource|bool $cursor cursor PgSql\Result (former resource) - * @return int affected rows, 0 for none, -1 for error + * @param \PgSql\Result|false $cursor cursor + * @return int affected rows, 0 for none, -1 for error */ - public function __dbAffectedRows($cursor): int + public function __dbAffectedRows(\PgSql\Result|false $cursor): int { - if ($cursor === false || is_bool($cursor)) { + if (is_bool($cursor)) { return -1; } return pg_affected_rows($cursor); @@ -323,7 +322,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * @param string|null $pk_name primary key name, if '' then auto detect * @return string|int|false primary key value */ - public function __dbInsertId(string $query, ?string $pk_name) + public function __dbInsertId(string $query, ?string $pk_name): string|int|false { // only if an insert has been done if (preg_match("/^insert /i", $query)) { @@ -371,7 +370,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * @param string $schema optional schema name, '' for default * @return string|bool primary key name or false if not found */ - public function __dbPrimaryKey(string $table, string $schema = '') + public function __dbPrimaryKey(string $table, string $schema = ''): string|bool { if ($table) { // check if schema set is different from schema given, @@ -426,7 +425,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * @param string $db_name databse name * @param integer $db_port port (int, 5432 is default) * @param string $db_ssl SSL (allow is default) - * @return object|resource|bool db handler PgSql\Connection or false on error + * @return \PgSql\Connection|false db handler or false on error */ public function __dbConnect( string $db_host, @@ -435,7 +434,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions string $db_name, int $db_port, string $db_ssl = 'allow' - ) { + ): \PgSql\Connection|false { if (empty($db_name)) { return false; } @@ -470,22 +469,22 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * reads the last error for this cursor and returns * html formatted string with error name * - * @param bool|object|resource $cursor cursor PgSql\Result (former resource) + * @param \PgSql\Result|false $cursor cursor * or null * @return string error string */ - public function __dbPrintError($cursor = false): string + public function __dbPrintError(\PgSql\Result|false $cursor = false): string { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return ''; } // run the query again for the error result here - if (($cursor === false || is_bool($cursor)) && $this->last_error_query) { + if ((is_bool($cursor)) && $this->last_error_query) { pg_send_query($this->dbh, $this->last_error_query); $this->last_error_query = ''; $cursor = pg_get_result($this->dbh); } - if ($cursor && !is_bool($cursor) && $error_str = pg_result_error($cursor)) { + if ($cursor && $error_str = pg_result_error($cursor)) { return '-PostgreSQL-Error- ' . $error_str; } else { @@ -500,9 +499,9 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * @param bool $extended show extended info (default true) * @return array|bool array data for the table info or false on error */ - public function __dbMetaData(string $table, $extended = true) + public function __dbMetaData(string $table, bool $extended = true): array|bool { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } // needs to prefixed with @ or it throws a warning on not existing table @@ -515,9 +514,9 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * @param string|int|float|bool $string any string/int/float/bool * @return string excaped string */ - public function __dbEscapeString($string): string + public function __dbEscapeString(string|int|float|bool $string): string { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return ''; } return pg_escape_string($this->dbh, (string)$string); @@ -531,9 +530,9 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * @param string|int|float|bool $string any string/int/float/bool * @return string excaped string including quites */ - public function __dbEscapeLiteral($string): string + public function __dbEscapeLiteral(string|int|float|bool $string): string { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return (string)''; } // for phpstan, thinks this is string|false? @@ -549,7 +548,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions */ public function __dbEscapeIdentifier(string $string): string { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return ''; } // for phpstan, thinks this is string|false? @@ -564,7 +563,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions */ public function __dbEscapeBytea(string $data): string { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return ''; } return pg_escape_bytea($this->dbh, $data); @@ -584,11 +583,12 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * wrapper for pg_connection_busy * - * @return bool True if connection is busy, False if not or no db connection at all + * @return bool True if connection is busy + * False if not or no db connection at all */ public function __dbConnectionBusy(): bool { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } return pg_connection_busy($this->dbh); @@ -597,13 +597,13 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions /** * Experimental wrapper with scoket timetout * - * @param integer $timeout_seconds Wait how many seconds on timeout - * @return boolean True if connection is busy, or false on - * not busy or no db connection at all + * @param integer $timeout_seconds Wait how many seconds on timeout + * @return bool True if connection is busy, or false on + * not busy or no db connection at all */ public function __dbConnectionBusySocketWait(int $timeout_seconds = 3): bool { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } $busy = pg_connection_busy($this->dbh); @@ -626,14 +626,14 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * On default 'version' will be stripped of any space attached info * eg 13.5 (other info) will return only 13.5 * - * @param string $parameter Parameter string to extract from array - * @param boolean $strip If parameter is server strip out on default - * Set to false to get original string AS is - * @return string The parameter value + * @param string $parameter Parameter string to extract from array + * @param bool $strip If parameter is server strip out on default + * Set to false to get original string AS is + * @return string The parameter value */ public function __dbVersionInfo(string $parameter, bool $strip = true): string { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return ''; } // extract element @@ -655,7 +655,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions */ public function __dbVersionInfoParameterList(): array { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return []; } return array_keys(pg_version($this->dbh)); @@ -670,7 +670,7 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions */ public function __dbVersion(): string { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return ''; } // array has client, protocol, server, we just return server stripped @@ -762,9 +762,9 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions * @param string $parameter Parameter to query * @return string|bool Settings value as string */ - public function __dbParameter(string $parameter) + public function __dbParameter(string $parameter): string|bool { - if ($this->dbh === false || is_bool($this->dbh)) { + if (is_bool($this->dbh)) { return false; } if (empty($parameter)) { diff --git a/www/lib/CoreLibs/Debug/Logging.php b/www/lib/CoreLibs/Debug/Logging.php index b07ce0f7..d9ffb343 100644 --- a/www/lib/CoreLibs/Debug/Logging.php +++ b/www/lib/CoreLibs/Debug/Logging.php @@ -413,7 +413,7 @@ class Logging * @param string $name what variable to return * @return mixed can be anything, bool, string, int, array */ - public function getSetting(string $name) //:mixed DOES not work with PHP 7.4 + public function getSetting(string $name): mixed { // for debug purpose only return $this->{$name}; @@ -550,9 +550,9 @@ class Logging * @param string $flag on/off * @param string|null $level if not null then check if this array entry is set * else return false - * @return bool|array if $level is null, return array, else boolean true/false + * @return array|bool if $level is null, return array, else boolean true/false */ - public function getLogLevel(string $type, string $flag, ?string $level = null) + public function getLogLevel(string $type, string $flag, ?string $level = null): array|bool { // abort if not valid type if (!in_array($type, ['debug', 'echo', 'print'])) { diff --git a/www/lib/CoreLibs/Language/Core/GetTextReader.php b/www/lib/CoreLibs/Language/Core/GetTextReader.php index cfa8e7c1..3fa7404d 100644 --- a/www/lib/CoreLibs/Language/Core/GetTextReader.php +++ b/www/lib/CoreLibs/Language/Core/GetTextReader.php @@ -122,7 +122,7 @@ class GetTextReader * @param bool $enable_cache Enable or disable caching * of strings (default on) */ - public function __construct($Reader, bool $enable_cache = true) + public function __construct(FileReader|bool $Reader, bool $enable_cache = true) { // If there isn't a StreamReader, turn on short circuit mode. if ((!is_object($Reader) && !$Reader) || (is_object($Reader) && $Reader->error)) { diff --git a/www/lib/CoreLibs/Language/Encoding.php b/www/lib/CoreLibs/Language/Encoding.php index ebdbc612..443b3258 100644 --- a/www/lib/CoreLibs/Language/Encoding.php +++ b/www/lib/CoreLibs/Language/Encoding.php @@ -46,7 +46,7 @@ class Encoding * @return void * @deprecated Use \CoreLibs\Check\Encoding::setErrorChar(); */ - public static function setErrorChar($string): void + public static function setErrorChar(string|int|null $string): void { \CoreLibs\Check\Encoding::setErrorChar($string); } @@ -60,7 +60,7 @@ class Encoding * @return string|int Set error character * @deprecated Use \CoreLibs\Check\Encoding::getErrorChar(); */ - public static function getErrorChar(bool $return_substitute_func = false) + public static function getErrorChar(bool $return_substitute_func = false): string|int { return \CoreLibs\Check\Encoding::getErrorChar($return_substitute_func); } @@ -81,7 +81,7 @@ class Encoding * @param string $string string to test * @param string $from_encoding encoding of string to test * @param string $to_encoding target encoding - * @return bool|array false if no error or + * @return array|false false if no error or * array with failed characters * @deprecated Use \CoreLibs\Check\Encoding::checkConvertEncoding(); */ @@ -89,7 +89,7 @@ class Encoding string $string, string $from_encoding, string $to_encoding - ) { + ): array|false { return \CoreLibs\Check\Encoding::checkConvertEncoding($string, $from_encoding, $to_encoding); } diff --git a/www/lib/CoreLibs/Output/Form/Elements.php b/www/lib/CoreLibs/Output/Form/Elements.php index badbeae0..b6ee9d8b 100644 --- a/www/lib/CoreLibs/Output/Form/Elements.php +++ b/www/lib/CoreLibs/Output/Form/Elements.php @@ -13,27 +13,27 @@ class Elements /** * print the date/time drop downs, used in any queue/send/insert at date/time place * - * @param int $year year YYYY - * @param int $month month m - * @param int $day day d - * @param int $hour hour H - * @param int $min min i - * @param string $suffix additional info printed after the date time - * variable in the drop down - * also used for ID in the on change JS call - * @param int $min_steps default is 1 (minute), can set to anything, - * is used as sum up from 0 - * @param bool $name_pos_back default false, if set to true, - * the name will be printend after the drop down - * and not before the drop down - * @return string HTML formated strings for drop down lists of date and time + * @param int|string $year year YYYY + * @param int|string $month month m + * @param int|string $day day d + * @param int|string $hour hour H + * @param int|string $min min i + * @param string $suffix additional info printed after the date time + * variable in the drop down + * also used for ID in the on change JS call + * @param int $min_steps default is 1 (minute), can set to anything, + * is used as sum up from 0 + * @param bool $name_pos_back default false, if set to true, + * the name will be printend after the drop down + * and not before the drop down + * @return string HTML formated strings for drop down lists of date and time */ public static function printDateTime( - $year, - $month, - $day, - $hour, - $min, + int|string $year, + int|string $month, + int|string $day, + int|string $hour, + int|string $min, string $suffix = '', int $min_steps = 1, bool $name_pos_back = false diff --git a/www/lib/CoreLibs/Output/Form/Generate.php b/www/lib/CoreLibs/Output/Form/Generate.php index 4ec98820..cfbe8ee2 100644 --- a/www/lib/CoreLibs/Output/Form/Generate.php +++ b/www/lib/CoreLibs/Output/Form/Generate.php @@ -731,9 +731,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO empty($this->table_array['protected']['value']) && !$this->error ) { - if (!is_array($element_list)) { - $element_list = []; - } for ($i = 0, $i_max = count($element_list); $i < $i_max; $i++) { // $this->log->debug('form_error', 'Array: ' // . is_array($this->element_list[$element_list[$i]]['read_data']) . ' | ' @@ -2294,11 +2291,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO } } } - if (is_array($hidden_array)) { - reset($hidden_array); - foreach ($hidden_array as $key => $value) { - $hidden[] = ['key' => $key, 'value' => $value]; - } + reset($hidden_array); + foreach ($hidden_array as $key => $value) { + $hidden[] = ['key' => $key, 'value' => $value]; } return $hidden; } diff --git a/www/lib/CoreLibs/Output/Image.php b/www/lib/CoreLibs/Output/Image.php index a3a14fd5..20d2a56f 100644 --- a/www/lib/CoreLibs/Output/Image.php +++ b/www/lib/CoreLibs/Output/Image.php @@ -22,7 +22,7 @@ class Image * if empty ROOT is choosen * @param string $cache_source cache path, if not given TMP is used * @param bool $clear_cache if set to true, will create thumb all the tame - * @return string|bool thumbnail name, or false for error + * @return string|false thumbnail name, or false for error */ public static function createThumbnail( string $pic, @@ -32,7 +32,7 @@ class Image string $path = '', string $cache_source = '', bool $clear_cache = false - ) { + ): string|false { // get image type flags $image_types = [ 1 => 'gif', @@ -73,7 +73,7 @@ class Image $create_file = false; $delete_filename = ''; // check if we can skip the PDF creation: if we have size, if do not have type, we assume type png - if (!$type && is_numeric($size_x) && is_numeric($size_y)) { + if (!$type) { $check_thumb = $tmp_src . 'thumb_' . $pic . '_' . $size_x . 'x' . $size_y . '.' . $image_types[3]; if (!is_file($check_thumb)) { $create_file = true; @@ -100,10 +100,10 @@ class Image [$width, $height, $type] = getimagesize($filename) ?: []; } // if no size given, set size to original - if (!$size_x || $size_x < 1 || !is_numeric($size_x)) { + if (!$size_x || $size_x < 1) { $size_x = $width; } - if (!$size_y || $size_y < 1 || !is_numeric($size_y)) { + if (!$size_y || $size_y < 1) { $size_y = $height; } $thumb = 'thumb_' . $pic . '_' . $size_x . 'x' . $size_y . '.' . $image_types[$type]; @@ -170,7 +170,7 @@ class Image * set to false to not use (default true) * to use quick but less nice version * @param int $jpeg_quality default 80, set image quality for jpeg only - * @return string|bool thumbnail with path + * @return string|false thumbnail with path */ public static function createThumbnailSimple( string $filename, @@ -181,7 +181,7 @@ class Image bool $use_cache = true, bool $high_quality = true, int $jpeg_quality = 80 - ) { + ): string|false { $thumbnail = false; // $this->debug('IMAGE PREPARE', "FILE: $filename (exists " // .(string)file_exists($filename)."), WIDTH: $thumb_width, HEIGHT: $thumb_height"); @@ -425,7 +425,7 @@ class Image * @param string $filename path + filename to rotate. This file must be writeable * @return void */ - public static function correctImageOrientation($filename): void + public static function correctImageOrientation(string $filename): void { // function exists & file is writeable, else do nothing if (!function_exists('exif_read_data') || !is_writeable($filename)) { diff --git a/www/vendor/composer/autoload_classmap.php b/www/vendor/composer/autoload_classmap.php index 3a0931ef..7f685d49 100644 --- a/www/vendor/composer/autoload_classmap.php +++ b/www/vendor/composer/autoload_classmap.php @@ -40,8 +40,8 @@ return array( 'CoreLibs\\Create\\Uids' => $baseDir . '/lib/CoreLibs/Create/Uids.php', 'CoreLibs\\DB\\Extended\\ArrayIO' => $baseDir . '/lib/CoreLibs/DB/Extended/ArrayIO.php', 'CoreLibs\\DB\\IO' => $baseDir . '/lib/CoreLibs/DB/IO.php', + 'CoreLibs\\DB\\SQL\\Interface\\SqlFunctions' => $baseDir . '/lib/CoreLibs/DB/SQL/Interface/SqlFunctions.php', 'CoreLibs\\DB\\SQL\\PgSQL' => $baseDir . '/lib/CoreLibs/DB/SQL/PgSQL.php', - 'CoreLibs\\DB\\SQL\\SqlInterface\\SqlFunctions' => $baseDir . '/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php', 'CoreLibs\\Debug\\FileWriter' => $baseDir . '/lib/CoreLibs/Debug/FileWriter.php', 'CoreLibs\\Debug\\Logging' => $baseDir . '/lib/CoreLibs/Debug/Logging.php', 'CoreLibs\\Debug\\MemoryUsage' => $baseDir . '/lib/CoreLibs/Debug/MemoryUsage.php', diff --git a/www/vendor/composer/autoload_static.php b/www/vendor/composer/autoload_static.php index 49bf4ee6..e92239dd 100644 --- a/www/vendor/composer/autoload_static.php +++ b/www/vendor/composer/autoload_static.php @@ -73,8 +73,8 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9 'CoreLibs\\Create\\Uids' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Uids.php', 'CoreLibs\\DB\\Extended\\ArrayIO' => __DIR__ . '/../..' . '/lib/CoreLibs/DB/Extended/ArrayIO.php', 'CoreLibs\\DB\\IO' => __DIR__ . '/../..' . '/lib/CoreLibs/DB/IO.php', + 'CoreLibs\\DB\\SQL\\Interface\\SqlFunctions' => __DIR__ . '/../..' . '/lib/CoreLibs/DB/SQL/Interface/SqlFunctions.php', 'CoreLibs\\DB\\SQL\\PgSQL' => __DIR__ . '/../..' . '/lib/CoreLibs/DB/SQL/PgSQL.php', - 'CoreLibs\\DB\\SQL\\SqlInterface\\SqlFunctions' => __DIR__ . '/../..' . '/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php', 'CoreLibs\\Debug\\FileWriter' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/FileWriter.php', 'CoreLibs\\Debug\\Logging' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/Logging.php', 'CoreLibs\\Debug\\MemoryUsage' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/MemoryUsage.php',