Compare commits
19 Commits
62d9cda3d0
...
v9.35.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c81b602657 | ||
|
|
59cc5f2060 | ||
|
|
e072aaf4d6 | ||
|
|
259f9cebf3 | ||
|
|
bd4f674f0f | ||
|
|
87293bf633 | ||
|
|
be46d6e101 | ||
|
|
433bc3d539 | ||
|
|
4ed645bac3 | ||
|
|
908376c1a5 | ||
|
|
c329e7a2da | ||
|
|
ad7b59e26a | ||
|
|
c43bb0662d | ||
|
|
c4e83f94e9 | ||
|
|
a292abc2c5 | ||
|
|
6c5af91386 | ||
|
|
73fc74a43a | ||
|
|
b89238b922 | ||
|
|
9115fc9557 |
@@ -3,7 +3,7 @@
|
|||||||
<phar name="phpunit" version="^10.3.5" installed="10.5.46" location="./tools/phpunit" copy="false"/>
|
<phar name="phpunit" version="^10.3.5" installed="10.5.46" location="./tools/phpunit" copy="false"/>
|
||||||
<phar name="phpcbf" version="^3.7.2" installed="3.13.0" location="./tools/phpcbf" copy="false"/>
|
<phar name="phpcbf" version="^3.7.2" installed="3.13.0" location="./tools/phpcbf" copy="false"/>
|
||||||
<phar name="phpcs" version="^3.10.3" installed="3.13.0" location="./tools/phpcs" copy="false"/>
|
<phar name="phpcs" version="^3.10.3" installed="3.13.0" location="./tools/phpcs" copy="false"/>
|
||||||
<phar name="phpstan" version="^2.0" installed="2.1.16" location="./tools/phpstan" copy="false"/>
|
<phar name="phpstan" version="^2.0" installed="2.1.17" location="./tools/phpstan" copy="false"/>
|
||||||
<phar name="phan" version="^5.4.3" installed="5.4.3" location="./tools/phan" copy="false"/>
|
<phar name="phan" version="^5.4.3" installed="5.4.3" location="./tools/phan" copy="false"/>
|
||||||
<phar name="psalm" version="^5.15.0" installed="5.24.0" location="./tools/psalm" copy="false"/>
|
<phar name="psalm" version="^5.15.0" installed="5.24.0" location="./tools/psalm" copy="false"/>
|
||||||
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
base=$(pwd)"/";
|
||||||
# must be run in ${base}
|
# must be run in ${base}
|
||||||
cd $base || exit;
|
cd $base || exit;
|
||||||
${base}tools/phan --progress-bar -C --analyze-twice;
|
#PHAN_DISABLE_XDEBUG_WARN=1;${base}tools/phan --progress-bar -C --analyze-twice
|
||||||
|
PHAN_DISABLE_XDEBUG_WARN=1;${base}vendor/bin/phan --progress-bar -C --analyze-twice
|
||||||
cd ~ || exit;
|
cd ~ || exit;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
base=$(pwd)"/";
|
||||||
# must be run in ${base}
|
# must be run in ${base}
|
||||||
cd $base || exit;
|
cd $base || exit;
|
||||||
${base}tools/phpstan;
|
${base}tools/phpstan;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
# set base variables
|
# set base variables
|
||||||
BASE_PATH="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
BASE_PATH=$(pwd)"/";
|
||||||
PHPUNIT_CONFIG="${BASE_PATH}phpunit.xml";
|
PHPUNIT_CONFIG="${BASE_PATH}phpunit.xml";
|
||||||
PHP_BIN_PATH=$(which php);
|
PHP_BIN_PATH=$(which php);
|
||||||
if [ -z "${PHP_BIN_PATH}" ]; then
|
if [ -z "${PHP_BIN_PATH}" ]; then
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
'get email regex invalid -1, will be 0' => [
|
'get email regex invalid -1, will be 0' => [
|
||||||
-1,
|
-1,
|
||||||
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
],
|
],
|
||||||
'get email regex invalid 10, will be 0' => [
|
'get email regex invalid 10, will be 0' => [
|
||||||
10,
|
10,
|
||||||
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
],
|
],
|
||||||
'get email regex valid 1, will be 1' => [
|
'get email regex valid 1, will be 1' => [
|
||||||
1,
|
1,
|
||||||
@@ -157,7 +157,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
'error' => 0,
|
'error' => 0,
|
||||||
'message' => 'Invalid email address',
|
'message' => 'Invalid email address',
|
||||||
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 1 will return double @ error' => [
|
'error 1 will return double @ error' => [
|
||||||
@@ -181,7 +181,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 3,
|
'error' => 3,
|
||||||
'message' => 'Invalid domain part after @ sign',
|
'message' => 'Invalid domain part after @ sign',
|
||||||
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
'regex' => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 4 will be invalid domain' => [
|
'error 4 will be invalid domain' => [
|
||||||
@@ -189,7 +189,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 4,
|
'error' => 4,
|
||||||
'message' => 'Invalid domain name part',
|
'message' => 'Invalid domain name part',
|
||||||
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\."
|
'regex' => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\."
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 5 will be invalid domain top level only' => [
|
'error 5 will be invalid domain top level only' => [
|
||||||
@@ -197,7 +197,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 5,
|
'error' => 5,
|
||||||
'message' => 'Wrong domain top level part',
|
'message' => 'Wrong domain top level part',
|
||||||
'regex' => "\.([a-zA-Z]{2,6}){1}$"
|
'regex' => "\.[a-zA-Z]{2,6}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 6 will be domain double dot' => [
|
'error 6 will be domain double dot' => [
|
||||||
|
|||||||
@@ -105,11 +105,15 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
'log_level' => Level::Error,
|
'log_level' => Level::Error,
|
||||||
]);
|
]);
|
||||||
|
$errorLogTmpfile = tmpfile();
|
||||||
|
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setMessage(
|
$em->setMessage(
|
||||||
$level,
|
$level,
|
||||||
$str
|
$str
|
||||||
);
|
);
|
||||||
|
// for exceptions if log level is set to catch them
|
||||||
|
$error_log_content = stream_get_contents($errorLogTmpfile);
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
[
|
[
|
||||||
'level' => $expected,
|
'level' => $expected,
|
||||||
@@ -377,6 +381,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
?bool $log_warning,
|
?bool $log_warning,
|
||||||
string $expected
|
string $expected
|
||||||
): void {
|
): void {
|
||||||
|
$errorLogTmpfile = tmpfile();
|
||||||
|
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
||||||
$log = new \CoreLibs\Logging\Logging([
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_file_id' => 'testErrorMessagesLogError',
|
'log_file_id' => 'testErrorMessagesLogError',
|
||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
@@ -392,6 +398,9 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
log_error: $log_error,
|
log_error: $log_error,
|
||||||
log_warning: $log_warning
|
log_warning: $log_warning
|
||||||
);
|
);
|
||||||
|
ini_set('error_log', $errorLogLocationBackup);
|
||||||
|
// for exceptions if log level is set to catch them
|
||||||
|
$error_log_content = stream_get_contents($errorLogTmpfile);
|
||||||
$file_content = '';
|
$file_content = '';
|
||||||
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
@@ -447,6 +456,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'log_level' => Level::Debug,
|
'log_level' => Level::Debug,
|
||||||
'log_per_run' => true
|
'log_per_run' => true
|
||||||
]);
|
]);
|
||||||
|
$errorLogTmpfile = tmpfile();
|
||||||
|
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setErrorMsg(
|
$em->setErrorMsg(
|
||||||
$id,
|
$id,
|
||||||
@@ -456,6 +467,9 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
log_error: $log_error,
|
log_error: $log_error,
|
||||||
log_warning: $log_warning
|
log_warning: $log_warning
|
||||||
);
|
);
|
||||||
|
ini_set('error_log', $errorLogLocationBackup);
|
||||||
|
// for exceptions if log level is set to catch them
|
||||||
|
$error_log_content = stream_get_contents($errorLogTmpfile);
|
||||||
$file_content = '';
|
$file_content = '';
|
||||||
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ use CoreLibs\Logging\Logger\Flag;
|
|||||||
final class CoreLibsLoggingLoggingTest extends TestCase
|
final class CoreLibsLoggingLoggingTest extends TestCase
|
||||||
{
|
{
|
||||||
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
||||||
private const REGEX_BASE = "\[[\d\-\s\.:]+\]\s{1}" // date
|
private const REGEX_BASE = "\[[\d\-\s\.:+T]+\]\s{1}" // date, just basic checks
|
||||||
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
||||||
. "\[(phar:\/\/)?[\w\-\.\/]+:\d+\]\s{1}" // folder/file [note phar:// is for phpunit]
|
. "\[(phar:\/\/)?[\w\-\.\/]+:\d+\]\s{1}" // folder/file [note phar:// is for phpunit]
|
||||||
. "\[\w+\]\s{1}" // run id
|
. "\[\w+\]\s{1}" // run id
|
||||||
@@ -249,7 +249,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
$this->assertFalse(
|
$this->assertFalse(
|
||||||
$log->loggingLevelIsDebug()
|
$log->loggingLevelIsDebug()
|
||||||
);
|
);
|
||||||
// not set, should be debug]
|
// not set, should be debug
|
||||||
$log = new \CoreLibs\Logging\Logging([
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_file_id' => 'testSetLoggingLevel',
|
'log_file_id' => 'testSetLoggingLevel',
|
||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
@@ -297,6 +297,71 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
$log->setLoggingLevel('NotGood');
|
$log->setLoggingLevel('NotGood');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setErrorLogWriteLevel
|
||||||
|
* @covers ::getErrorLogWriteLevel
|
||||||
|
* @testdox setErrorLogWriteLevel set/get checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetErrorLogWriteLevel(): void
|
||||||
|
{
|
||||||
|
// valid that is not Debug
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetErrorLogWriteLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'error_log_write_level' => Level::Error
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Error,
|
||||||
|
$log->getErrorLogWriteLevel()
|
||||||
|
);
|
||||||
|
// not set on init
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetErrorLogWriteLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Emergency,
|
||||||
|
$log->getErrorLogWriteLevel()
|
||||||
|
);
|
||||||
|
// invalid, should be Emergency, will throw excpetion too
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage(
|
||||||
|
'Option: "error_log_write_level" is not of instance \CoreLibs\Logging\Logger\Level'
|
||||||
|
);
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLoggingLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'error_log_write_level' => 'I'
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Emergency,
|
||||||
|
$log->getErrorLogWriteLevel()
|
||||||
|
);
|
||||||
|
// set valid then change
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetErrorLogWriteLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'error_log_write_level' => Level::Error
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Error,
|
||||||
|
$log->getErrorLogWriteLevel()
|
||||||
|
);
|
||||||
|
$log->setErrorLogWriteLevel(Level::Notice);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Notice,
|
||||||
|
$log->getErrorLogWriteLevel()
|
||||||
|
);
|
||||||
|
// illegal logging level
|
||||||
|
$this->expectException(\Psr\Log\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Level \"NotGood\" is not defined, use one of: /");
|
||||||
|
$log->setErrorLogWriteLevel('NotGood');
|
||||||
|
}
|
||||||
|
|
||||||
// setLogFileId
|
// setLogFileId
|
||||||
// getLogFileId
|
// getLogFileId
|
||||||
|
|
||||||
|
|||||||
@@ -119,6 +119,8 @@ On a version update the old phpunit folder in .libs has to be removed and the ne
|
|||||||
|
|
||||||
The original edit.js javascript functions are now in utils.js or utils.min.js.
|
The original edit.js javascript functions are now in utils.js or utils.min.js.
|
||||||
|
|
||||||
The development for thos files is located in a different repository
|
The development for those files is located in a different repository
|
||||||
|
|
||||||
https://[service]/CodeBlocks/javascript-utils
|
General: <https://[service]/CodeBlocks/JavaScript.utils>
|
||||||
|
|
||||||
|
Org: <https://[serverice]/[org]/Code-Blocks.JavaScript.utils>
|
||||||
|
|||||||
11
SECURITY.md
Normal file
11
SECURITY.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
This software follows the [Semver 2.0 scheme](https://semver.org/).
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Only the latest version is supported
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Open a ticket to report a secuirty problem
|
||||||
@@ -332,8 +332,8 @@ print "(kosrt, lower case, reverse): "
|
|||||||
|
|
||||||
print "<hr>";
|
print "<hr>";
|
||||||
$nested = [
|
$nested = [
|
||||||
'B' => 'foo', 'a', '0', 9,
|
'B' => 'foo', 'a', '0', 9, /** @phpstan-ignore-line This is a test for wrong index */
|
||||||
1 => ['z', 'b', 'a'],
|
'1' => ['z', 'b', 'a'],
|
||||||
'd' => ['zaip', 'bar', 'baz']
|
'd' => ['zaip', 'bar', 'baz']
|
||||||
];
|
];
|
||||||
print "Nested: " . DgS::printAr($nested) . "<br>";
|
print "Nested: " . DgS::printAr($nested) . "<br>";
|
||||||
|
|||||||
@@ -68,6 +68,14 @@ function test2(): array
|
|||||||
return DebugSupport::getCallerMethodList(1);
|
return DebugSupport::getCallerMethodList(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// date stueff
|
||||||
|
print "printTime(-1): " . DebugSupport::printTime() . "<br>";
|
||||||
|
print "printTime(2): " . DebugSupport::printTime(2) . "<br>";
|
||||||
|
print "printTime(3): " . DebugSupport::printTime(3) . "<br>";
|
||||||
|
print "printTime(5): " . DebugSupport::printTime(5) . "<br>";
|
||||||
|
print "printIsoTime(): " . DebugSupport::printIsoTime() . "<br>";
|
||||||
|
print "printIsoTime(false): " . DebugSupport::printIsoTime(false) . "<br>";
|
||||||
|
|
||||||
print "S::GETCALLERMETHOD: " . DebugSupport::getCallerMethod(0) . "<br>";
|
print "S::GETCALLERMETHOD: " . DebugSupport::getCallerMethod(0) . "<br>";
|
||||||
print "S::GETCALLERMETHOD: " . test() . "<br>";
|
print "S::GETCALLERMETHOD: " . test() . "<br>";
|
||||||
print "S::GETCALLERMETHODLIST: <pre>" . print_r(test2(), true) . "</pre><br>";
|
print "S::GETCALLERMETHODLIST: <pre>" . print_r(test2(), true) . "</pre><br>";
|
||||||
@@ -146,7 +154,7 @@ print "LOG LEVEL: " . DebugSupport::printAr(\CoreLibs\Convert\SetVarType::setAr
|
|||||||
$new_log->getLogLevel('debug', 'on')
|
$new_log->getLogLevel('debug', 'on')
|
||||||
)) . "<br>";
|
)) . "<br>";
|
||||||
|
|
||||||
echo "<b>CLASS DEBUG CALL</b><br>";
|
echo "<b>CLASS DEBUG CALL LEGACY</b><br>";
|
||||||
|
|
||||||
// @codingStandardsIgnoreLine
|
// @codingStandardsIgnoreLine
|
||||||
class TestL
|
class TestL
|
||||||
|
|||||||
@@ -83,6 +83,9 @@ function mtParseCSV(
|
|||||||
'UTF-8',
|
'UTF-8',
|
||||||
$encoding
|
$encoding
|
||||||
);
|
);
|
||||||
|
if ($string === false) {
|
||||||
|
return $lines;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ($flag == 'INTERN') {
|
if ($flag == 'INTERN') {
|
||||||
// split with PHP function
|
// split with PHP function
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ print "Log ERROR: " . $log->prAr($em->getFlagLogError()) . "<br>";
|
|||||||
print "FN: " . ml::fromName('Affe')->name . "<br>";
|
print "FN: " . ml::fromName('Affe')->name . "<br>";
|
||||||
print "NU: " . ml::fromValue(100)->name . "<br>";
|
print "NU: " . ml::fromValue(100)->name . "<br>";
|
||||||
print "NU: " . ml::fromValue(1000)->name . "<br>";
|
print "NU: " . ml::fromValue(1000)->name . "<br>";
|
||||||
|
print "OK.: " . ml::ok->name . "<br>";
|
||||||
|
print "OK^: " . ml::fromName('OK')->name . "<br>";
|
||||||
|
|
||||||
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug');
|
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug');
|
||||||
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style');
|
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style');
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ $log->error('Cannot process data', ['error' => 'log']);
|
|||||||
$log->critical('Critical message', ['critical' => 'log']);
|
$log->critical('Critical message', ['critical' => 'log']);
|
||||||
$log->alert('Alert message', ['Alert' => 'log']);
|
$log->alert('Alert message', ['Alert' => 'log']);
|
||||||
$log->emergency('Emergency message', ['Emergency' => 'log']);
|
$log->emergency('Emergency message', ['Emergency' => 'log']);
|
||||||
|
error_log('TRIGGER ERROR LOG MANUAL: Emergency');
|
||||||
print "Log File: " . $log->getLogFile() . "<br>";
|
print "Log File: " . $log->getLogFile() . "<br>";
|
||||||
|
|
||||||
$log->setLogFlag(Flag::per_run);
|
$log->setLogFlag(Flag::per_run);
|
||||||
|
|||||||
@@ -383,7 +383,8 @@ class Basic
|
|||||||
public function initRandomKeyLength(int $key_length): bool
|
public function initRandomKeyLength(int $key_length): bool
|
||||||
{
|
{
|
||||||
trigger_error('Method ' . __METHOD__ . ' is deprecated, use \CoreLibs\Create\RandomKey::setRandomKeyLength()', E_USER_DEPRECATED);
|
trigger_error('Method ' . __METHOD__ . ' is deprecated, use \CoreLibs\Create\RandomKey::setRandomKeyLength()', E_USER_DEPRECATED);
|
||||||
return \CoreLibs\Create\RandomKey::setRandomKeyLength($key_length);
|
// no op, we do no longer pre set the random key length
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -988,10 +989,10 @@ class Basic
|
|||||||
* @param bool $auto_check default true, if source encoding is set
|
* @param bool $auto_check default true, if source encoding is set
|
||||||
* check that the source is actually matching
|
* check that the source is actually matching
|
||||||
* to what we sav the source is
|
* to what we sav the source is
|
||||||
* @return string encoding converted string
|
* @return string|false encoding converted string
|
||||||
* @deprecated use \CoreLibs\Convert\Encoding::convertEncoding() instead
|
* @deprecated use \CoreLibs\Convert\Encoding::convertEncoding() instead
|
||||||
*/
|
*/
|
||||||
public static function convertEncoding(string $string, string $to_encoding, string $source_encoding = '', bool $auto_check = true): string
|
public static function convertEncoding(string $string, string $to_encoding, string $source_encoding = '', bool $auto_check = true): string|false
|
||||||
{
|
{
|
||||||
trigger_error('Method ' . __METHOD__ . ' is deprecated, use \CoreLibs\Convert\Encoding::convertEncoding()', E_USER_DEPRECATED);
|
trigger_error('Method ' . __METHOD__ . ' is deprecated, use \CoreLibs\Convert\Encoding::convertEncoding()', E_USER_DEPRECATED);
|
||||||
return \CoreLibs\Convert\Encoding::convertEncoding($string, $to_encoding, $source_encoding, $auto_check);
|
return \CoreLibs\Convert\Encoding::convertEncoding($string, $to_encoding, $source_encoding, $auto_check);
|
||||||
|
|||||||
@@ -10,12 +10,16 @@ class Email
|
|||||||
/** @var array<int,string> */
|
/** @var array<int,string> */
|
||||||
private static array $email_regex_check = [
|
private static array $email_regex_check = [
|
||||||
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
|
// . "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
|
||||||
|
// fixed pattern matching for domain
|
||||||
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$", // MASTER
|
||||||
1 => "@(.*)@(.*)", // double @
|
1 => "@(.*)@(.*)", // double @
|
||||||
2 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
|
2 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
|
||||||
3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
|
// 3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
|
||||||
4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
|
3 => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$", // wrong part after @
|
||||||
5 => "\.([a-zA-Z]{2,6}){1}$", // wrong top level part
|
// 4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
|
||||||
|
4 => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.", // wrong domain name part
|
||||||
|
5 => "\.[a-zA-Z]{2,6}$", // wrong top level part
|
||||||
6 => "@(.*)\.{2,}", // double .. in domain name part
|
6 => "@(.*)\.{2,}", // double .. in domain name part
|
||||||
7 => "@.*\.$" // ends with a dot, top level, domain missing
|
7 => "@.*\.$" // ends with a dot, top level, domain missing
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -56,7 +56,11 @@ class Encoding
|
|||||||
{
|
{
|
||||||
// return mb_substitute_character();
|
// return mb_substitute_character();
|
||||||
if ($return_substitute_func === true) {
|
if ($return_substitute_func === true) {
|
||||||
return mb_substitute_character();
|
// if false abort with error
|
||||||
|
if (($return = mb_substitute_character()) === false) {
|
||||||
|
return self::$mb_error_char;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
} else {
|
} else {
|
||||||
return self::$mb_error_char;
|
return self::$mb_error_char;
|
||||||
}
|
}
|
||||||
@@ -88,7 +92,13 @@ class Encoding
|
|||||||
): array|false {
|
): array|false {
|
||||||
// convert to target encoding and convert back
|
// convert to target encoding and convert back
|
||||||
$temp = mb_convert_encoding($string, $to_encoding, $from_encoding);
|
$temp = mb_convert_encoding($string, $to_encoding, $from_encoding);
|
||||||
|
if ($temp === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
$compare = mb_convert_encoding($temp, $from_encoding, $to_encoding);
|
$compare = mb_convert_encoding($temp, $from_encoding, $to_encoding);
|
||||||
|
if ($compare === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// if string does not match anymore we have a convert problem
|
// if string does not match anymore we have a convert problem
|
||||||
if ($string == $compare) {
|
if ($string == $compare) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -150,14 +150,14 @@ class ArrayHandler
|
|||||||
* array search simple. looks for key, value combination, if found, returns true
|
* 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
|
* on default does not strict check, so string '4' will match int 4 and vica versa
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array search in as array
|
* @param array<mixed> $in_array search in as array
|
||||||
* @param string|int $key key (key to search in)
|
* @param string|int $key key (key to search in)
|
||||||
* @param string|int|bool|array<string|int|bool> $value values list (what to find)
|
* @param string|int|bool|array<string|int|bool> $value values list (what to find)
|
||||||
* @param bool $strict [false], if set to true, will strict check key/value
|
* @param bool $strict [false], if set to true, will strict check key/value
|
||||||
* @return bool true on found, false on not found
|
* @return bool true on found, false on not found
|
||||||
*/
|
*/
|
||||||
public static function arraySearchSimple(
|
public static function arraySearchSimple(
|
||||||
array $array,
|
array $in_array,
|
||||||
string|int $key,
|
string|int $key,
|
||||||
string|int|bool|array $value,
|
string|int|bool|array $value,
|
||||||
bool $strict = false
|
bool $strict = false
|
||||||
@@ -166,7 +166,7 @@ class ArrayHandler
|
|||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
$value = [$value];
|
$value = [$value];
|
||||||
}
|
}
|
||||||
foreach ($array as $_key => $_value) {
|
foreach ($in_array as $_key => $_value) {
|
||||||
// if value is an array, we search
|
// if value is an array, we search
|
||||||
if (is_array($_value)) {
|
if (is_array($_value)) {
|
||||||
// call recursive, and return result if it is true, else continue
|
// call recursive, and return result if it is true, else continue
|
||||||
@@ -189,19 +189,19 @@ class ArrayHandler
|
|||||||
* If prefix is turned on each found group will be prefixed with the
|
* If prefix is turned on each found group will be prefixed with the
|
||||||
* search key
|
* search key
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array array to search in
|
* @param array<mixed> $in_array array to search in
|
||||||
* @param array<mixed> $needles keys to find in array
|
* @param array<mixed> $needles keys to find in array
|
||||||
* @param bool $flat [false] Turn on flat output
|
* @param bool $flat [false] Turn on flat output
|
||||||
* @param bool $prefix [false] Prefix found with needle key
|
* @param bool $prefix [false] Prefix found with needle key
|
||||||
* @return array<mixed> Found values
|
* @return array<mixed> Found values
|
||||||
*/
|
*/
|
||||||
public static function arraySearchKey(
|
public static function arraySearchKey(
|
||||||
array $array,
|
array $in_array,
|
||||||
array $needles,
|
array $needles,
|
||||||
bool $flat = false,
|
bool $flat = false,
|
||||||
bool $prefix = false
|
bool $prefix = false
|
||||||
): array {
|
): array {
|
||||||
$iterator = new \RecursiveArrayIterator($array);
|
$iterator = new \RecursiveArrayIterator($in_array);
|
||||||
$recursive = new \RecursiveIteratorIterator(
|
$recursive = new \RecursiveIteratorIterator(
|
||||||
$iterator,
|
$iterator,
|
||||||
\RecursiveIteratorIterator::SELF_FIRST
|
\RecursiveIteratorIterator::SELF_FIRST
|
||||||
@@ -248,16 +248,16 @@ class ArrayHandler
|
|||||||
* If not found return an array with the array block there the required key is missing,
|
* If not found return an array with the array block there the required key is missing,
|
||||||
* the path as string with seperator block set and the missing key entry
|
* the path as string with seperator block set and the missing key entry
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param string|int|float|bool $search_value
|
* @param string|int|float|bool $search_value
|
||||||
* @param string|array<string> $required_key
|
* @param string|array<string> $required_key
|
||||||
* @param ?string $serach_key [null]
|
* @param ?string $search_key [null]
|
||||||
* @param string $path_separator [DATA_SEPARATOR]
|
* @param string $path_separator [DATA_SEPARATOR]
|
||||||
* @param string $current_path
|
* @param string $current_path
|
||||||
* @return array<array{content?:array<mixed>,path?:string,missing_key?:string}>
|
* @return array<array{content?:array<mixed>,path?:string,missing_key?:array<string>}>
|
||||||
*/
|
*/
|
||||||
public static function findArraysMissingKey(
|
public static function findArraysMissingKey(
|
||||||
array $array,
|
array $in_array,
|
||||||
string|int|float|bool $search_value,
|
string|int|float|bool $search_value,
|
||||||
string|array $required_key,
|
string|array $required_key,
|
||||||
?string $search_key = null,
|
?string $search_key = null,
|
||||||
@@ -265,7 +265,7 @@ class ArrayHandler
|
|||||||
string $current_path = ''
|
string $current_path = ''
|
||||||
): array {
|
): array {
|
||||||
$results = [];
|
$results = [];
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
$path = $current_path ? $current_path . $path_separator . $key : $key;
|
$path = $current_path ? $current_path . $path_separator . $key : $key;
|
||||||
|
|
||||||
if (is_array($value)) {
|
if (is_array($value)) {
|
||||||
@@ -321,7 +321,7 @@ class ArrayHandler
|
|||||||
* Find key => value entry and return set with key for all matching
|
* Find key => value entry and return set with key for all matching
|
||||||
* Can search recursively through nested arrays if recursive flag is set
|
* Can search recursively through nested arrays if recursive flag is set
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param string $lookup
|
* @param string $lookup
|
||||||
* @param int|string|float|bool $search
|
* @param int|string|float|bool $search
|
||||||
* @param bool $strict [false]
|
* @param bool $strict [false]
|
||||||
@@ -332,7 +332,7 @@ class ArrayHandler
|
|||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function selectArrayFromOption(
|
public static function selectArrayFromOption(
|
||||||
array $array,
|
array $in_array,
|
||||||
string $lookup,
|
string $lookup,
|
||||||
int|string|float|bool $search,
|
int|string|float|bool $search,
|
||||||
bool $strict = false,
|
bool $strict = false,
|
||||||
@@ -342,7 +342,7 @@ class ArrayHandler
|
|||||||
string $flat_separator = self::DATA_SEPARATOR
|
string $flat_separator = self::DATA_SEPARATOR
|
||||||
): array {
|
): array {
|
||||||
// skip on empty
|
// skip on empty
|
||||||
if ($array == []) {
|
if ($in_array == []) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
// init return result
|
// init return result
|
||||||
@@ -352,7 +352,7 @@ class ArrayHandler
|
|||||||
$search = strtolower($search);
|
$search = strtolower($search);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
// Handle current level search
|
// Handle current level search
|
||||||
if (isset($value[$lookup])) {
|
if (isset($value[$lookup])) {
|
||||||
$compareValue = $value[$lookup];
|
$compareValue = $value[$lookup];
|
||||||
@@ -399,14 +399,14 @@ class ArrayHandler
|
|||||||
/**
|
/**
|
||||||
* main wrapper function for next/prev key
|
* main wrapper function for next/prev key
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array array to search in
|
* @param array<mixed> $in_array array to search in
|
||||||
* @param int|string $key key for next/prev
|
* @param int|string $key key for next/prev
|
||||||
* @param bool $next [=true] if to search next or prev
|
* @param bool $next [=true] if to search next or prev
|
||||||
* @return int|string|null Next/prev key or null for end/first
|
* @return int|string|null Next/prev key or null for end/first
|
||||||
*/
|
*/
|
||||||
private static function arrayGetKey(array $array, int|string $key, bool $next = true): int|string|null
|
private static function arrayGetKey(array $in_array, int|string $key, bool $next = true): int|string|null
|
||||||
{
|
{
|
||||||
$keys = array_keys($array);
|
$keys = array_keys($in_array);
|
||||||
if (($position = array_search($key, $keys, true)) === false) {
|
if (($position = array_search($key, $keys, true)) === false) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -422,26 +422,26 @@ class ArrayHandler
|
|||||||
* Get previous array key from an array
|
* Get previous array key from an array
|
||||||
* null on not found
|
* null on not found
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param int|string $key
|
* @param int|string $key
|
||||||
* @return int|string|null Next key, or null for not found
|
* @return int|string|null Next key, or null for not found
|
||||||
*/
|
*/
|
||||||
public static function arrayGetPrevKey(array $array, int|string $key): int|string|null
|
public static function arrayGetPrevKey(array $in_array, int|string $key): int|string|null
|
||||||
{
|
{
|
||||||
return self::arrayGetKey($array, $key, false);
|
return self::arrayGetKey($in_array, $key, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get next array key from an array
|
* Get next array key from an array
|
||||||
* null on not found
|
* null on not found
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param int|string $key
|
* @param int|string $key
|
||||||
* @return int|string|null Next key, or null for not found
|
* @return int|string|null Next key, or null for not found
|
||||||
*/
|
*/
|
||||||
public static function arrayGetNextKey(array $array, int|string $key): int|string|null
|
public static function arrayGetNextKey(array $in_array, int|string $key): int|string|null
|
||||||
{
|
{
|
||||||
return self::arrayGetKey($array, $key, true);
|
return self::arrayGetKey($in_array, $key, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -463,27 +463,27 @@ class ArrayHandler
|
|||||||
}
|
}
|
||||||
// default key is not string
|
// default key is not string
|
||||||
$key_is_string = false;
|
$key_is_string = false;
|
||||||
$arrays = func_get_args();
|
$in_arrays = func_get_args();
|
||||||
// if last is not array, then assume it is trigger for key is always string
|
// if last is not array, then assume it is trigger for key is always string
|
||||||
if (!is_array(end($arrays))) {
|
if (!is_array(end($in_arrays))) {
|
||||||
if (array_pop($arrays)) {
|
if (array_pop($in_arrays)) {
|
||||||
$key_is_string = true;
|
$key_is_string = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check that arrays count is at least two, else we don't have enough to do anything
|
// check that arrays count is at least two, else we don't have enough to do anything
|
||||||
if (count($arrays) < 2) {
|
if (count($in_arrays) < 2) {
|
||||||
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
|
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
|
||||||
}
|
}
|
||||||
$merged = [];
|
$merged = [];
|
||||||
while ($arrays) {
|
while ($in_arrays) {
|
||||||
$array = array_shift($arrays);
|
$in_array = array_shift($in_arrays);
|
||||||
if (!is_array($array)) {
|
if (!is_array($in_array)) {
|
||||||
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
|
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
|
||||||
}
|
}
|
||||||
if (!$array) {
|
if (!$in_array) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
// if string or if key is assumed to be string do key match
|
// if string or if key is assumed to be string do key match
|
||||||
// else add new entry
|
// else add new entry
|
||||||
if (is_string($key) || $key_is_string === false) {
|
if (is_string($key) || $key_is_string === false) {
|
||||||
@@ -589,14 +589,14 @@ class ArrayHandler
|
|||||||
* converts multi dimensional array to a flat array
|
* converts multi dimensional array to a flat array
|
||||||
* does NOT preserve keys
|
* does NOT preserve keys
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array multi dimensionial array
|
* @param array<mixed> $in_array multi dimensionial array
|
||||||
* @return array<mixed> flattened array
|
* @return array<mixed> flattened array
|
||||||
*/
|
*/
|
||||||
public static function flattenArray(array $array): array
|
public static function flattenArray(array $in_array): array
|
||||||
{
|
{
|
||||||
$return = [];
|
$return = [];
|
||||||
array_walk_recursive(
|
array_walk_recursive(
|
||||||
$array,
|
$in_array,
|
||||||
function ($value) use (&$return) {
|
function ($value) use (&$return) {
|
||||||
$return[] = $value;
|
$return[] = $value;
|
||||||
}
|
}
|
||||||
@@ -607,13 +607,13 @@ class ArrayHandler
|
|||||||
/**
|
/**
|
||||||
* will loop through an array recursivly and write the array keys back
|
* will loop through an array recursivly and write the array keys back
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array multidemnsional array to flatten
|
* @param array<mixed> $in_array multidemnsional array to flatten
|
||||||
* @param array<mixed> $return recoursive pass on array of keys
|
* @param array<mixed> $return recoursive pass on array of keys
|
||||||
* @return array<mixed> flattened keys array
|
* @return array<mixed> flattened keys array
|
||||||
*/
|
*/
|
||||||
public static function flattenArrayKey(array $array, array $return = []): array
|
public static function flattenArrayKey(array $in_array, array $return = []): array
|
||||||
{
|
{
|
||||||
foreach ($array as $key => $sub) {
|
foreach ($in_array as $key => $sub) {
|
||||||
$return[] = $key;
|
$return[] = $key;
|
||||||
if (is_array($sub) && count($sub) > 0) {
|
if (is_array($sub) && count($sub) > 0) {
|
||||||
$return = self::flattenArrayKey($sub, $return);
|
$return = self::flattenArrayKey($sub, $return);
|
||||||
@@ -626,14 +626,14 @@ class ArrayHandler
|
|||||||
* as above will flatten an array, but in this case only the outmost
|
* as above will flatten an array, but in this case only the outmost
|
||||||
* leave nodes, all other keyswill be skipped
|
* leave nodes, all other keyswill be skipped
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array multidemnsional array to flatten
|
* @param array<mixed> $in_array multidemnsional array to flatten
|
||||||
* @return array<mixed> flattened keys array
|
* @return array<mixed> flattened keys array
|
||||||
*/
|
*/
|
||||||
public static function flattenArrayKeyLeavesOnly(array $array): array
|
public static function flattenArrayKeyLeavesOnly(array $in_array): array
|
||||||
{
|
{
|
||||||
$return = [];
|
$return = [];
|
||||||
array_walk_recursive(
|
array_walk_recursive(
|
||||||
$array,
|
$in_array,
|
||||||
function ($value, $key) use (&$return) {
|
function ($value, $key) use (&$return) {
|
||||||
$return[] = $key;
|
$return[] = $key;
|
||||||
}
|
}
|
||||||
@@ -645,14 +645,14 @@ class ArrayHandler
|
|||||||
* searches for key -> value in an array tree and writes the value one level up
|
* searches for key -> value in an array tree and writes the value one level up
|
||||||
* this will remove this leaf will all other values
|
* this will remove this leaf will all other values
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array nested array
|
* @param array<mixed> $in_array nested array
|
||||||
* @param string|int $search key to find that has no sub leaf
|
* @param string|int $search key to find that has no sub leaf
|
||||||
* and will be pushed up
|
* and will be pushed up
|
||||||
* @return array<mixed> modified, flattened array
|
* @return array<mixed> modified, flattened array
|
||||||
*/
|
*/
|
||||||
public static function arrayFlatForKey(array $array, string|int $search): array
|
public static function arrayFlatForKey(array $in_array, string|int $search): array
|
||||||
{
|
{
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
// if it is not an array do just nothing
|
// if it is not an array do just nothing
|
||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -660,14 +660,14 @@ class ArrayHandler
|
|||||||
// probe it has search key
|
// probe it has search key
|
||||||
if (isset($value[$search])) {
|
if (isset($value[$search])) {
|
||||||
// set as current
|
// set as current
|
||||||
$array[$key] = $value[$search];
|
$in_array[$key] = $value[$search];
|
||||||
} else {
|
} else {
|
||||||
// call up next node down
|
// call up next node down
|
||||||
// $array[$key] = call_user_func(__METHOD__, $value, $search);
|
// $in_array[$key] = call_user_func(__METHOD__, $value, $search);
|
||||||
$array[$key] = self::arrayFlatForKey($value, $search);
|
$in_array[$key] = self::arrayFlatForKey($value, $search);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -677,13 +677,13 @@ class ArrayHandler
|
|||||||
*
|
*
|
||||||
* https://stackoverflow.com/a/369608
|
* https://stackoverflow.com/a/369608
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array Array where elements are located
|
* @param array<mixed> $in_array Array where elements are located
|
||||||
* @param array<mixed> $remove Elements to remove
|
* @param array<mixed> $remove Elements to remove
|
||||||
* @return array<mixed> Array with $remove elements removed
|
* @return array<mixed> Array with $remove elements removed
|
||||||
*/
|
*/
|
||||||
public static function arrayRemoveEntry(array $array, array $remove): array
|
public static function arrayRemoveEntry(array $in_array, array $remove): array
|
||||||
{
|
{
|
||||||
return array_diff($array, $remove);
|
return array_diff($in_array, $remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -693,20 +693,20 @@ class ArrayHandler
|
|||||||
* key list is a list[string]
|
* key list is a list[string]
|
||||||
* if key list is empty, return array as is
|
* if key list is empty, return array as is
|
||||||
*
|
*
|
||||||
* @param array<string,mixed> $array
|
* @param array<string,mixed> $in_array
|
||||||
* @param array<string> $key_list
|
* @param array<string> $key_list
|
||||||
* @return array<string,mixed>
|
* @return array<string,mixed>
|
||||||
*/
|
*/
|
||||||
public static function arrayReturnMatchingKeyOnly(
|
public static function arrayReturnMatchingKeyOnly(
|
||||||
array $array,
|
array $in_array,
|
||||||
array $key_list
|
array $key_list
|
||||||
): array {
|
): array {
|
||||||
// on empty return as is
|
// on empty return as is
|
||||||
if (empty($key_list)) {
|
if (empty($key_list)) {
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
return array_filter(
|
return array_filter(
|
||||||
$array,
|
$in_array,
|
||||||
fn($key) => in_array($key, $key_list),
|
fn($key) => in_array($key, $key_list),
|
||||||
ARRAY_FILTER_USE_KEY
|
ARRAY_FILTER_USE_KEY
|
||||||
);
|
);
|
||||||
@@ -748,16 +748,19 @@ class ArrayHandler
|
|||||||
* sort ascending or descending with or without lower case convert
|
* sort ascending or descending with or without lower case convert
|
||||||
* value only, will loose key connections unless preserve_keys is set to true
|
* value only, will loose key connections unless preserve_keys is set to true
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array array to sort by values
|
* @param array<mixed> $in_array Array to sort by values
|
||||||
* @param int $params sort flags
|
* @param bool $case_insensitive [false] Sort case insensitive
|
||||||
|
* @param bool $reverse [false] Reverse sort
|
||||||
|
* @param bool $maintain_keys [false] Maintain keys
|
||||||
|
* @param int $flag [SORT_REGULAR] Sort flags
|
||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function sortArray(
|
public static function sortArray(
|
||||||
array $array,
|
array $in_array,
|
||||||
bool $case_insensitive = false,
|
bool $case_insensitive = false,
|
||||||
bool $reverse = false,
|
bool $reverse = false,
|
||||||
bool $maintain_keys = false,
|
bool $maintain_keys = false,
|
||||||
int $params = SORT_REGULAR
|
int $flag = SORT_REGULAR
|
||||||
): array {
|
): array {
|
||||||
$fk_sort_lower_case = function (string $a, string $b): int {
|
$fk_sort_lower_case = function (string $a, string $b): int {
|
||||||
return strtolower($a) <=> strtolower($b);
|
return strtolower($a) <=> strtolower($b);
|
||||||
@@ -767,26 +770,26 @@ class ArrayHandler
|
|||||||
};
|
};
|
||||||
$case_insensitive ? (
|
$case_insensitive ? (
|
||||||
$maintain_keys ?
|
$maintain_keys ?
|
||||||
(uasort($array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case)) :
|
(uasort($in_array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case)) :
|
||||||
(usort($array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case))
|
(usort($in_array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case))
|
||||||
) :
|
) :
|
||||||
(
|
(
|
||||||
$maintain_keys ?
|
$maintain_keys ?
|
||||||
($reverse ? arsort($array, $params) : asort($array, $params)) :
|
($reverse ? arsort($in_array, $flag) : asort($in_array, $flag)) :
|
||||||
($reverse ? rsort($array, $params) : sort($array, $params))
|
($reverse ? rsort($in_array, $flag) : sort($in_array, $flag))
|
||||||
);
|
);
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sort by key ascending or descending and return
|
* sort by key ascending or descending and return
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array Array to srt
|
||||||
* @param bool $case_insensitive [false]
|
* @param bool $case_insensitive [false] Sort keys case insenstive
|
||||||
* @param bool $reverse [false]
|
* @param bool $reverse [false] Reverse key sort
|
||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function ksortArray(array $array, bool $case_insensitive = false, bool $reverse = false): array
|
public static function ksortArray(array $in_array, bool $case_insensitive = false, bool $reverse = false): array
|
||||||
{
|
{
|
||||||
$fk_sort_lower_case = function (string $a, string $b): int {
|
$fk_sort_lower_case = function (string $a, string $b): int {
|
||||||
return strtolower($a) <=> strtolower($b);
|
return strtolower($a) <=> strtolower($b);
|
||||||
@@ -801,12 +804,12 @@ class ArrayHandler
|
|||||||
return $b <=> $a;
|
return $b <=> $a;
|
||||||
};
|
};
|
||||||
uksort(
|
uksort(
|
||||||
$array,
|
$in_array,
|
||||||
$case_insensitive ?
|
$case_insensitive ?
|
||||||
($reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case) :
|
($reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case) :
|
||||||
($reverse ? $fk_sort_reverse : $fk_sort)
|
($reverse ? $fk_sort_reverse : $fk_sort)
|
||||||
);
|
);
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,14 +23,14 @@ class Encoding
|
|||||||
* @param bool $auto_check default true, if source encoding is set
|
* @param bool $auto_check default true, if source encoding is set
|
||||||
* check that the source is actually matching
|
* check that the source is actually matching
|
||||||
* to what we sav the source is
|
* to what we sav the source is
|
||||||
* @return string encoding converted string
|
* @return string|false encoding converted string or false on error
|
||||||
*/
|
*/
|
||||||
public static function convertEncoding(
|
public static function convertEncoding(
|
||||||
string $string,
|
string $string,
|
||||||
string $to_encoding,
|
string $to_encoding,
|
||||||
string $source_encoding = '',
|
string $source_encoding = '',
|
||||||
bool $auto_check = true
|
bool $auto_check = true
|
||||||
): string {
|
): string|false {
|
||||||
// set if not given
|
// set if not given
|
||||||
if (!$source_encoding) {
|
if (!$source_encoding) {
|
||||||
$source_encoding = mb_detect_encoding($string);
|
$source_encoding = mb_detect_encoding($string);
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ class Json
|
|||||||
* Deos not throw errors
|
* Deos not throw errors
|
||||||
*
|
*
|
||||||
* @param array<mixed> $data
|
* @param array<mixed> $data
|
||||||
* @param int $flags json_encode flags as is
|
* @param int $flags [JSON_UNESCAPED_UNICODE] json_encode flags as is
|
||||||
* @return string JSON string or '{}' if false
|
* @return string JSON string or '{}' if false
|
||||||
*/
|
*/
|
||||||
public static function jsonConvertArrayTo(array $data, int $flags = 0): string
|
public static function jsonConvertArrayTo(array $data, int $flags = JSON_UNESCAPED_UNICODE): string
|
||||||
{
|
{
|
||||||
$json_string = json_encode($data, $flags) ?: '{}';
|
$json_string = json_encode($data, $flags) ?: '{}';
|
||||||
self::$json_last_error = json_last_error();
|
self::$json_last_error = json_last_error();
|
||||||
|
|||||||
@@ -199,15 +199,17 @@ class Math
|
|||||||
callback: fn ($col) => is_array($row) ?
|
callback: fn ($col) => is_array($row) ?
|
||||||
array_reduce(
|
array_reduce(
|
||||||
array: $row,
|
array: $row,
|
||||||
callback: fn ($a, $v, $i = null) => $a + $v * (
|
// TODO check that v is not an array
|
||||||
|
callback: fn ($a, $v, $i = null) => $a + $v * ( /** @phpstan-ignore-line Possible array + int */
|
||||||
// if last entry missing for full copy add a 0 to it
|
// if last entry missing for full copy add a 0 to it
|
||||||
$col[$i ?? array_search($v, $row, true)] ?? 0 /** @phpstan-ignore-line */
|
$col[$i ?? array_search($v, $row, true)] ?? 0
|
||||||
),
|
),
|
||||||
initial: 0,
|
initial: 0,
|
||||||
) :
|
) :
|
||||||
array_reduce(
|
array_reduce(
|
||||||
array: $col,
|
array: $col,
|
||||||
callback: fn ($a, $v) => $a + $v * $row,
|
// TODO check that v is not an array
|
||||||
|
callback: fn ($a, $v) => $a + $v * $row, /** @phpstan-ignore-line Possible array + int */
|
||||||
initial: 0,
|
initial: 0,
|
||||||
),
|
),
|
||||||
array: $bCols,
|
array: $bCols,
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ class Email
|
|||||||
* @param string $encoding Encoding, if not set UTF-8
|
* @param string $encoding Encoding, if not set UTF-8
|
||||||
* @param bool $kv_folding If set to true and a valid encoding, do KV folding
|
* @param bool $kv_folding If set to true and a valid encoding, do KV folding
|
||||||
* @return string Correctly encoded and build email string
|
* @return string Correctly encoded and build email string
|
||||||
|
* @throws \IntlException if email name cannot be converted to UTF-8
|
||||||
*/
|
*/
|
||||||
public static function encodeEmailName(
|
public static function encodeEmailName(
|
||||||
string $email,
|
string $email,
|
||||||
@@ -52,6 +53,10 @@ class Email
|
|||||||
if ($encoding != 'UTF-8') {
|
if ($encoding != 'UTF-8') {
|
||||||
$email_name = mb_convert_encoding($email_name, $encoding, 'UTF-8');
|
$email_name = mb_convert_encoding($email_name, $encoding, 'UTF-8');
|
||||||
}
|
}
|
||||||
|
// if we cannot transcode the name, return just the email
|
||||||
|
if ($email_name === false) {
|
||||||
|
throw new \IntlException('Cannot convert email_name to UTF-8');
|
||||||
|
}
|
||||||
$email_name =
|
$email_name =
|
||||||
mb_encode_mimeheader(
|
mb_encode_mimeheader(
|
||||||
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
|
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
|
||||||
@@ -77,6 +82,8 @@ class Email
|
|||||||
* @param bool $kv_folding If set to true and a valid encoding,
|
* @param bool $kv_folding If set to true and a valid encoding,
|
||||||
* do KV folding
|
* do KV folding
|
||||||
* @return array<string> Pos 0: Subject, Pos 1: Body
|
* @return array<string> Pos 0: Subject, Pos 1: Body
|
||||||
|
* @throws \IntlException if subject cannot be converted to UTF-8
|
||||||
|
* @throws \IntlException if body cannot be converted to UTF-8
|
||||||
*/
|
*/
|
||||||
private static function replaceContent(
|
private static function replaceContent(
|
||||||
string $subject,
|
string $subject,
|
||||||
@@ -102,6 +109,12 @@ class Email
|
|||||||
$subject = mb_convert_encoding($subject, $encoding, 'UTF-8');
|
$subject = mb_convert_encoding($subject, $encoding, 'UTF-8');
|
||||||
$body = mb_convert_encoding($body, $encoding, 'UTF-8');
|
$body = mb_convert_encoding($body, $encoding, 'UTF-8');
|
||||||
}
|
}
|
||||||
|
if ($subject === false) {
|
||||||
|
throw new \IntlException('Cannot convert subject to UTF-8');
|
||||||
|
}
|
||||||
|
if ($body === false) {
|
||||||
|
throw new \IntlException('Cannot convert body to UTF-8');
|
||||||
|
}
|
||||||
// we need to encodde the subject
|
// we need to encodde the subject
|
||||||
$subject = mb_encode_mimeheader(
|
$subject = mb_encode_mimeheader(
|
||||||
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
|
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
|
||||||
|
|||||||
@@ -263,11 +263,11 @@ class ConvertPlaceholder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add the connectors back (1), and the data sets only if no replacement will be done
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
return $params_lookup[$match] ??
|
return $params_lookup[$match]/* ??
|
||||||
throw new \RuntimeException(
|
throw new \RuntimeException(
|
||||||
'Cannot lookup ' . $match . ' in params lookup list',
|
'Cannot lookup ' . $match . ' in params lookup list',
|
||||||
211
|
211
|
||||||
);
|
)*/;
|
||||||
},
|
},
|
||||||
$converted_placeholders['original']['query']
|
$converted_placeholders['original']['query']
|
||||||
);
|
);
|
||||||
@@ -327,11 +327,11 @@ class ConvertPlaceholder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add the connectors back (1), and the data sets only if no replacement will be done
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
return $params_lookup[$match] ??
|
return $params_lookup[$match]/* ??
|
||||||
throw new \RuntimeException(
|
throw new \RuntimeException(
|
||||||
'Cannot lookup ' . $match . ' in params lookup list',
|
'Cannot lookup ' . $match . ' in params lookup list',
|
||||||
231
|
231
|
||||||
);
|
)*/;
|
||||||
},
|
},
|
||||||
$converted_placeholders['original']['query']
|
$converted_placeholders['original']['query']
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -33,6 +33,36 @@ class Support
|
|||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* print ISO type datetime with microseconds and timezone
|
||||||
|
* Y-m-dTH:i:s.uP
|
||||||
|
* if no micro time the ".u" part is omitted
|
||||||
|
*
|
||||||
|
* @param bool $set_micro_time
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function printIsoTime(bool $set_micro_time = true): string
|
||||||
|
{
|
||||||
|
$datetime = new \DateTime();
|
||||||
|
|
||||||
|
// Format the DateTime object to ISO 8601 with microseconds
|
||||||
|
// 'Y-m-d\TH:i:s.uP' is the format string:
|
||||||
|
// Y: Full year (e.g., 2025)
|
||||||
|
// m: Month (01-12)
|
||||||
|
// d: Day of the month (01-31)
|
||||||
|
// T: Literal 'T' to separate date and time (escaped with a backslash)
|
||||||
|
// H: Hour (00-23)
|
||||||
|
// i: Minute (00-59)
|
||||||
|
// s: Second (00-59)
|
||||||
|
// u: Microseconds (e.g., 654321)
|
||||||
|
// P: Difference to Greenwich time (GMT) with colon (e.g., +09:00)
|
||||||
|
if ($set_micro_time) {
|
||||||
|
return $datetime->format('Y-m-d\TH:i:s.uP');
|
||||||
|
} else {
|
||||||
|
return $datetime->format('Y-m-d\TH:i:sP');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* prints a html formatted (pre) data
|
* prints a html formatted (pre) data
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ enum Level: int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the passed $level is higher or equal to $this
|
* Returns true if the passed $level is included in set level
|
||||||
*
|
*
|
||||||
* @param Level $level
|
* @param Level $level
|
||||||
* @return bool
|
* @return bool
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ namespace CoreLibs\Logging\Logger;
|
|||||||
|
|
||||||
enum MessageLevel: int
|
enum MessageLevel: int
|
||||||
{
|
{
|
||||||
|
case noset = 0;
|
||||||
case ok = 100;
|
case ok = 100;
|
||||||
case success = 150; // special for file uploads
|
case success = 150; // special for file uploads
|
||||||
case info = 200;
|
case info = 200;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class Logging
|
|||||||
/** @var string log file block separator, not changeable */
|
/** @var string log file block separator, not changeable */
|
||||||
private const LOG_FILE_BLOCK_SEPARATOR = '.';
|
private const LOG_FILE_BLOCK_SEPARATOR = '.';
|
||||||
|
|
||||||
|
// MARK: OPTION array
|
||||||
// NOTE: the second party array{} hs some errors
|
// NOTE: the second party array{} hs some errors
|
||||||
/** @var array<string,array<string,string|bool|Level>>|array{string:array{type:string,type_info?:string,mandatory:true,alias?:string,default:string|bool|Level,deprecated:bool,use?:string}} */
|
/** @var array<string,array<string,string|bool|Level>>|array{string:array{type:string,type_info?:string,mandatory:true,alias?:string,default:string|bool|Level,deprecated:bool,use?:string}} */
|
||||||
private const OPTIONS = [
|
private const OPTIONS = [
|
||||||
@@ -50,6 +51,7 @@ class Logging
|
|||||||
'type' => 'string', 'mandatory' => false,
|
'type' => 'string', 'mandatory' => false,
|
||||||
'default' => '', 'deprecated' => true, 'use' => 'log_file_id'
|
'default' => '', 'deprecated' => true, 'use' => 'log_file_id'
|
||||||
],
|
],
|
||||||
|
// log level
|
||||||
'log_level' => [
|
'log_level' => [
|
||||||
'type' => 'instance',
|
'type' => 'instance',
|
||||||
'type_info' => '\CoreLibs\Logging\Logger\Level',
|
'type_info' => '\CoreLibs\Logging\Logger\Level',
|
||||||
@@ -57,6 +59,14 @@ class Logging
|
|||||||
'default' => Level::Debug,
|
'default' => Level::Debug,
|
||||||
'deprecated' => false
|
'deprecated' => false
|
||||||
],
|
],
|
||||||
|
// level to trigger write to error_log
|
||||||
|
'error_log_write_level' => [
|
||||||
|
'type' => 'instance',
|
||||||
|
'type_info' => '\CoreLibs\Logging\Logger\Level',
|
||||||
|
'mandatory' => false,
|
||||||
|
'default' => Level::Emergency,
|
||||||
|
'deprecated' => false,
|
||||||
|
],
|
||||||
// options
|
// options
|
||||||
'log_per_run' => [
|
'log_per_run' => [
|
||||||
'type' => 'bool', 'mandatory' => false,
|
'type' => 'bool', 'mandatory' => false,
|
||||||
@@ -86,14 +96,21 @@ class Logging
|
|||||||
'type' => 'bool', 'mandatory' => false,
|
'type' => 'bool', 'mandatory' => false,
|
||||||
'default' => false, 'deprecated' => true, 'use' => 'log_per_date'
|
'default' => false, 'deprecated' => true, 'use' => 'log_per_date'
|
||||||
],
|
],
|
||||||
|
// if turned off uses old time format without time zone
|
||||||
|
'log_time_format_iso' => [
|
||||||
|
'type' => 'bool', 'mandatory' => false,
|
||||||
|
'default' => true, 'deprecated' => false
|
||||||
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
// options
|
// options
|
||||||
/** @var array<mixed> */
|
/** @var array<mixed> */
|
||||||
private array $options = [];
|
private array $options = [];
|
||||||
|
|
||||||
/** @var Level set level */
|
/** @var Level set logging level */
|
||||||
private Level $log_level;
|
private Level $log_level;
|
||||||
|
/** @var Level set level for writing to error_log, will not write if log level lower than error log write level */
|
||||||
|
private Level $error_log_write_level;
|
||||||
|
|
||||||
// page and host name
|
// page and host name
|
||||||
/** @var string */
|
/** @var string */
|
||||||
@@ -145,12 +162,13 @@ class Logging
|
|||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Init logger
|
* MARK: Init logger
|
||||||
*
|
*
|
||||||
* options array layout
|
* options array layout
|
||||||
* - log_folder:
|
* - log_folder:
|
||||||
* - log_file_id / file_id (will be deprecated):
|
* - log_file_id / file_id (will be deprecated):
|
||||||
* - log_level:
|
* - log_level:
|
||||||
|
* - error_log_write_level: at what level we write to error_log
|
||||||
*
|
*
|
||||||
* - log_per_run:
|
* - log_per_run:
|
||||||
* - log_per_date: (was print_file_date)
|
* - log_per_date: (was print_file_date)
|
||||||
@@ -172,6 +190,8 @@ class Logging
|
|||||||
|
|
||||||
// set log level
|
// set log level
|
||||||
$this->initLogLevel();
|
$this->initLogLevel();
|
||||||
|
// set error log write level
|
||||||
|
$this->initErrorLogWriteLevel();
|
||||||
// set log folder from options
|
// set log folder from options
|
||||||
$this->initLogFolder();
|
$this->initLogFolder();
|
||||||
// set per run UID for logging
|
// set per run UID for logging
|
||||||
@@ -190,8 +210,10 @@ class Logging
|
|||||||
// PRIVATE METHODS
|
// PRIVATE METHODS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
|
|
||||||
|
// MARK: options check
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* validate options
|
||||||
*
|
*
|
||||||
* @param array<mixed> $options
|
* @param array<mixed> $options
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -263,6 +285,8 @@ class Logging
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: init log elvels
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* init log level, just a wrapper to auto set from options
|
* init log level, just a wrapper to auto set from options
|
||||||
*
|
*
|
||||||
@@ -280,6 +304,24 @@ class Logging
|
|||||||
$this->setLoggingLevel($this->options['log_level']);
|
$this->setLoggingLevel($this->options['log_level']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init error log write level
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function initErrorLogWriteLevel()
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
empty($this->options['error_log_write_level']) ||
|
||||||
|
!$this->options['error_log_write_level'] instanceof Level
|
||||||
|
) {
|
||||||
|
$this->options['error_log_write_level'] = Level::Emergency;
|
||||||
|
}
|
||||||
|
$this->setErrorLogWriteLevel($this->options['error_log_write_level']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: set log folder
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the log folder
|
* Set the log folder
|
||||||
* If folder is not writeable the script will throw an E_USER_ERROR
|
* If folder is not writeable the script will throw an E_USER_ERROR
|
||||||
@@ -321,6 +363,8 @@ class Logging
|
|||||||
return $status;
|
return $status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: set host name
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the hostname and port
|
* Set the hostname and port
|
||||||
* If port is not defaul 80 it will be added to the host name
|
* If port is not defaul 80 it will be added to the host name
|
||||||
@@ -337,6 +381,8 @@ class Logging
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: set log file id (file)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set log file prefix id
|
* set log file prefix id
|
||||||
*
|
*
|
||||||
@@ -395,6 +441,8 @@ class Logging
|
|||||||
return $status;
|
return $status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK init log flags and levels
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set flags from options and option flags connection internal settings
|
* set flags from options and option flags connection internal settings
|
||||||
*
|
*
|
||||||
@@ -423,6 +471,19 @@ class Logging
|
|||||||
return $this->log_level->includes($level);
|
return $this->log_level->includes($level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that given level is matchins error_log write level
|
||||||
|
*
|
||||||
|
* @param Level $level
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function checkErrorLogWriteLevel(Level $level): bool
|
||||||
|
{
|
||||||
|
return $this->error_log_write_level->includes($level);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: build log ifle name
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the file name for writing
|
* Build the file name for writing
|
||||||
*
|
*
|
||||||
@@ -490,6 +551,8 @@ class Logging
|
|||||||
return $fn;
|
return $fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: master write log to file
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* writes error msg data to file for current level
|
* writes error msg data to file for current level
|
||||||
*
|
*
|
||||||
@@ -507,6 +570,10 @@ class Logging
|
|||||||
if (!$this->checkLogLevel($level)) {
|
if (!$this->checkLogLevel($level)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// if we match level then write to error_log
|
||||||
|
if ($this->checkErrorLogWriteLevel($level)) {
|
||||||
|
error_log((string)$message);
|
||||||
|
}
|
||||||
|
|
||||||
// build logging file name
|
// build logging file name
|
||||||
// fn is log folder + file name
|
// fn is log folder + file name
|
||||||
@@ -531,6 +598,8 @@ class Logging
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: master prepare log
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare the log message with all needed info blocks:
|
* Prepare the log message with all needed info blocks:
|
||||||
* [timestamp] [host name] [file path + file::row number] [running uid] {class::/->method}
|
* [timestamp] [host name] [file path + file::row number] [running uid] {class::/->method}
|
||||||
@@ -582,7 +651,11 @@ class Logging
|
|||||||
}
|
}
|
||||||
// print "CLASS: " . $class . "<br>";
|
// print "CLASS: " . $class . "<br>";
|
||||||
// get timestamp
|
// get timestamp
|
||||||
$timestamp = Support::printTime();
|
if (!empty($this->options['log_time_format_iso'])) {
|
||||||
|
$timestamp = Support::printIsoTime();
|
||||||
|
} else {
|
||||||
|
$timestamp = Support::printTime();
|
||||||
|
}
|
||||||
|
|
||||||
// if group id is empty replace it with current level
|
// if group id is empty replace it with current level
|
||||||
$group_str = $level->getName();
|
$group_str = $level->getName();
|
||||||
@@ -610,6 +683,7 @@ class Logging
|
|||||||
// PUBLIC STATIC METHJODS
|
// PUBLIC STATIC METHJODS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
|
|
||||||
|
// MARK: set log level
|
||||||
/**
|
/**
|
||||||
* set the log level
|
* set the log level
|
||||||
*
|
*
|
||||||
@@ -670,7 +744,7 @@ class Logging
|
|||||||
|
|
||||||
// **** GET/SETTER
|
// **** GET/SETTER
|
||||||
|
|
||||||
// log level set and get
|
// MARK: log level
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set new log level
|
* set new log level
|
||||||
@@ -705,7 +779,30 @@ class Logging
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// log file id set (file name prefix)
|
// MARK: error log write level
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the error_log write level
|
||||||
|
*
|
||||||
|
* @param string|int|Level $level
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setErrorLogWriteLevel(string|int|Level $level): void
|
||||||
|
{
|
||||||
|
$this->error_log_write_level = $this->processLogLevel($level);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the current level for error_log write
|
||||||
|
*
|
||||||
|
* @return Level
|
||||||
|
*/
|
||||||
|
public function getErrorLogWriteLevel(): Level
|
||||||
|
{
|
||||||
|
return $this->error_log_write_level;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: log file id set (file name prefix)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets the internal log file prefix id
|
* sets the internal log file prefix id
|
||||||
@@ -733,7 +830,7 @@ class Logging
|
|||||||
return $this->log_file_id;
|
return $this->log_file_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// log unique id set (for per run)
|
// MARK: log unique id set (for per run)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a unique id based on current date (y/m/d, h:i:s) and a unique id (8 chars)
|
* Sets a unique id based on current date (y/m/d, h:i:s) and a unique id (8 chars)
|
||||||
@@ -768,7 +865,7 @@ class Logging
|
|||||||
return $this->log_file_unique_id;
|
return $this->log_file_unique_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// general log date
|
// MARK: general log date
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set the log file date to Y-m-d
|
* set the log file date to Y-m-d
|
||||||
@@ -791,7 +888,7 @@ class Logging
|
|||||||
return $this->log_file_date;
|
return $this->log_file_date;
|
||||||
}
|
}
|
||||||
|
|
||||||
// general flag set
|
// MARK: general flag set
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set one of the basic flags
|
* set one of the basic flags
|
||||||
@@ -846,7 +943,7 @@ class Logging
|
|||||||
return $this->log_flags;
|
return $this->log_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
// log folder/file
|
// MARK: log folder/file
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set new log folder, check that folder is writeable
|
* set new log folder, check that folder is writeable
|
||||||
@@ -890,7 +987,7 @@ class Logging
|
|||||||
return $this->log_file_name;
|
return $this->log_file_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// max log file size
|
// MARK: max log file size
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set mag log file size
|
* set mag log file size
|
||||||
@@ -921,7 +1018,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
// OPTIONS CALLS
|
// MARK: OPTIONS CALLS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -939,6 +1036,8 @@ class Logging
|
|||||||
// MAIN CALLS
|
// MAIN CALLS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
|
|
||||||
|
// MARK: main log call
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commong log interface
|
* Commong log interface
|
||||||
*
|
*
|
||||||
@@ -976,7 +1075,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DEBUG: 100
|
* MARK: DEBUG: 100
|
||||||
*
|
*
|
||||||
* write debug data to error_msg array
|
* write debug data to error_msg array
|
||||||
*
|
*
|
||||||
@@ -1008,7 +1107,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* INFO: 200
|
* MARK: INFO: 200
|
||||||
*
|
*
|
||||||
* @param string|Stringable $message
|
* @param string|Stringable $message
|
||||||
* @param mixed[] $context
|
* @param mixed[] $context
|
||||||
@@ -1027,7 +1126,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NOTICE: 250
|
* MARK: NOTICE: 250
|
||||||
*
|
*
|
||||||
* @param string|Stringable $message
|
* @param string|Stringable $message
|
||||||
* @param mixed[] $context
|
* @param mixed[] $context
|
||||||
@@ -1046,7 +1145,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WARNING: 300
|
* MARK: WARNING: 300
|
||||||
*
|
*
|
||||||
* @param string|Stringable $message
|
* @param string|Stringable $message
|
||||||
* @param mixed[] $context
|
* @param mixed[] $context
|
||||||
@@ -1065,7 +1164,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ERROR: 400
|
* MARK: ERROR: 400
|
||||||
*
|
*
|
||||||
* @param string|Stringable $message
|
* @param string|Stringable $message
|
||||||
* @param mixed[] $context
|
* @param mixed[] $context
|
||||||
@@ -1084,7 +1183,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CTRITICAL: 500
|
* MARK: CTRITICAL: 500
|
||||||
*
|
*
|
||||||
* @param string|Stringable $message
|
* @param string|Stringable $message
|
||||||
* @param mixed[] $context
|
* @param mixed[] $context
|
||||||
@@ -1103,7 +1202,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ALERT: 550
|
* MARK: ALERT: 550
|
||||||
*
|
*
|
||||||
* @param string|Stringable $message
|
* @param string|Stringable $message
|
||||||
* @param mixed[] $context
|
* @param mixed[] $context
|
||||||
@@ -1122,7 +1221,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EMERGENCY: 600
|
* MARK: EMERGENCY: 600
|
||||||
*
|
*
|
||||||
* @param string|Stringable $message
|
* @param string|Stringable $message
|
||||||
* @param mixed[] $context
|
* @param mixed[] $context
|
||||||
@@ -1141,7 +1240,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
// DEPRECATED SUPPORT CALLS
|
// MARK: DEPRECATED SUPPORT CALLS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
|
|
||||||
// legacy, but there are too many implemented
|
// legacy, but there are too many implemented
|
||||||
@@ -1199,7 +1298,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
// DEPRECATED METHODS
|
// MARK: DEPRECATED METHODS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1365,7 +1464,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
// DEBUG METHODS
|
// MARK: DEBUG METHODS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1385,19 +1484,21 @@ class Logging
|
|||||||
Level::Error, Level::Critical, Level::Alert, Level::Emergency
|
Level::Error, Level::Critical, Level::Alert, Level::Emergency
|
||||||
] as $l
|
] as $l
|
||||||
) {
|
) {
|
||||||
|
print "Check: " . $this->log_level->getName() . " | " . $l->getName() . "<br>";
|
||||||
if ($this->log_level->isHigherThan($l)) {
|
if ($this->log_level->isHigherThan($l)) {
|
||||||
print "L: " . $this->log_level->getName() . " > " . $l->getName() . "<br>";
|
print "L(gt): " . $this->log_level->getName() . " > " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
if ($this->log_level->includes($l)) {
|
if ($this->log_level->includes($l)) {
|
||||||
print "L: " . $this->log_level->getName() . " <= " . $l->getName() . "<br>";
|
print "L(le): " . $this->log_level->getName() . " <= " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
if ($this->log_level->isLowerThan($l)) {
|
if ($this->log_level->isLowerThan($l)) {
|
||||||
print "L: " . $this->log_level->getName() . " < " . $l->getName() . "<br>";
|
print "L(lt): " . $this->log_level->getName() . " < " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
echo "<br>";
|
echo "<br>";
|
||||||
}
|
}
|
||||||
// back to options level
|
// back to options level
|
||||||
$this->initLogLevel();
|
$this->initLogLevel();
|
||||||
|
$this->initErrorLogWriteLevel();
|
||||||
print "OPT set level: " . $this->getLoggingLevel()->getName() . "<br>";
|
print "OPT set level: " . $this->getLoggingLevel()->getName() . "<br>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -599,7 +599,7 @@ class Curl implements Interface\RequestsInterface
|
|||||||
// for post we set POST option
|
// for post we set POST option
|
||||||
if ($type == "post") {
|
if ($type == "post") {
|
||||||
curl_setopt($handle, CURLOPT_POST, true);
|
curl_setopt($handle, CURLOPT_POST, true);
|
||||||
} elseif (!empty($type) && in_array($type, self::CUSTOM_REQUESTS)) {
|
} elseif (in_array($type, self::CUSTOM_REQUESTS)) {
|
||||||
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, strtoupper($type));
|
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, strtoupper($type));
|
||||||
}
|
}
|
||||||
// set body data if not null, will send empty [] for empty data
|
// set body data if not null, will send empty [] for empty data
|
||||||
|
|||||||
Reference in New Issue
Block a user