Code updates
This commit is contained in:
@@ -41,9 +41,9 @@ print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
|||||||
$thumb_width = 250;
|
$thumb_width = 250;
|
||||||
$thumb_height = 300;
|
$thumb_height = 300;
|
||||||
// class
|
// class
|
||||||
$image = BASE . LAYOUT . CONTENT_PATH . IMAGES . 'no_picture_square.jpg';
|
$image = BASE . CONTENT_PATH . LAYOUT . IMAGES . 'no_picture_square.jpg';
|
||||||
// folders
|
// folders
|
||||||
$cache_folder = BASE . LAYOUT . CONTENT_PATH . CACHE . IMAGES;
|
$cache_folder = BASE . CONTENT_PATH . LAYOUT . CACHE . IMAGES;
|
||||||
$web_folder = LAYOUT . CACHE . IMAGES;
|
$web_folder = LAYOUT . CACHE . IMAGES;
|
||||||
// rotate image first
|
// rotate image first
|
||||||
try {
|
try {
|
||||||
@@ -58,7 +58,7 @@ echo "<div>CLASS->CREATETHUMBNAILSIMPLE: "
|
|||||||
. basename($image) . ": WIDTH: $thumb_width<br><img src="
|
. basename($image) . ": WIDTH: $thumb_width<br><img src="
|
||||||
. $_image->createThumbnailSimple($image, $thumb_width, 0, $cache_folder, $web_folder) . "></div>";
|
. $_image->createThumbnailSimple($image, $thumb_width, 0, $cache_folder, $web_folder) . "></div>";
|
||||||
// static
|
// static
|
||||||
$image = BASE . LAYOUT . CONTENT_PATH . IMAGES . 'no_picture.jpg';
|
$image = BASE . CONTENT_PATH . LAYOUT . IMAGES . 'no_picture.jpg';
|
||||||
// rotate image first
|
// rotate image first
|
||||||
try {
|
try {
|
||||||
$image_class::correctImageOrientation($image);
|
$image_class::correctImageOrientation($image);
|
||||||
@@ -94,7 +94,7 @@ $images = array(
|
|||||||
// return mime type ala mimetype
|
// return mime type ala mimetype
|
||||||
$finfo = new finfo(FILEINFO_MIME_TYPE);
|
$finfo = new finfo(FILEINFO_MIME_TYPE);
|
||||||
foreach ($images as $image) {
|
foreach ($images as $image) {
|
||||||
$image = BASE . LAYOUT . CONTENT_PATH . IMAGES . $image;
|
$image = BASE . CONTENT_PATH . LAYOUT . IMAGES . $image;
|
||||||
list ($height, $width, $img_type) = \CoreLibs\Convert\SetVarType::setArray(getimagesize($image));
|
list ($height, $width, $img_type) = \CoreLibs\Convert\SetVarType::setArray(getimagesize($image));
|
||||||
echo "<div><b>IMAGE INFO</b>: " . $height . "x" . $width . ", TYPE: "
|
echo "<div><b>IMAGE INFO</b>: " . $height . "x" . $width . ", TYPE: "
|
||||||
. \CoreLibs\Debug\Support::dumpVar($img_type) . " [" . $finfo->file($image) . "]</div>";
|
. \CoreLibs\Debug\Support::dumpVar($img_type) . " [" . $finfo->file($image) . "]</div>";
|
||||||
|
|||||||
12
www/composer.lock
generated
12
www/composer.lock
generated
@@ -8,11 +8,11 @@
|
|||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "egrajp/corelibs-composer-all",
|
"name": "egrajp/corelibs-composer-all",
|
||||||
"version": "dev-master",
|
"version": "dev-development",
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "path",
|
"type": "path",
|
||||||
"url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All",
|
"url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All",
|
||||||
"reference": "4ab382990ecb9db90386f8ec1a4d87ac8f7c5dd7"
|
"reference": "d3d4cf512f62f139c61629d5aa21cf22ad726241"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.2",
|
"php": ">=8.2",
|
||||||
@@ -45,11 +45,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "egrajp/smarty-extended",
|
"name": "egrajp/smarty-extended",
|
||||||
"version": "4.3.0",
|
"version": "4.4.1",
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://git.egplusww.jp/api/packages/Composer/composer/files/egrajp%2Fsmarty-extended/4.3.0/egrajp-smarty-extended.4.3.0.zip",
|
"url": "https://git.egplusww.jp/api/packages/Composer/composer/files/egrajp%2Fsmarty-extended/4.4.1/egrajp-smarty-extended.4.4.1.zip",
|
||||||
"shasum": "d41bda35c0d52da35cf911ab0b018655a09f072b"
|
"shasum": "edd7a0960e49bfcc709e0a525729aaaf9ed0db75"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"keywords": [
|
"keywords": [
|
||||||
"templating"
|
"templating"
|
||||||
],
|
],
|
||||||
"time": "2023-02-17T14:14:10+09:00"
|
"time": "2024-03-06T18:43:44+09:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "gullevek/dotenv",
|
"name": "gullevek/dotenv",
|
||||||
|
|||||||
14
www/vendor/composer/installed.json
vendored
14
www/vendor/composer/installed.json
vendored
@@ -2,12 +2,12 @@
|
|||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "egrajp/corelibs-composer-all",
|
"name": "egrajp/corelibs-composer-all",
|
||||||
"version": "dev-master",
|
"version": "dev-development",
|
||||||
"version_normalized": "dev-master",
|
"version_normalized": "dev-development",
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "path",
|
"type": "path",
|
||||||
"url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All",
|
"url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All",
|
||||||
"reference": "4ab382990ecb9db90386f8ec1a4d87ac8f7c5dd7"
|
"reference": "d3d4cf512f62f139c61629d5aa21cf22ad726241"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.2",
|
"php": ">=8.2",
|
||||||
@@ -42,12 +42,14 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "egrajp/smarty-extended",
|
"name": "egrajp/smarty-extended",
|
||||||
"version": "4.3.0",
|
"version": "4.4.1",
|
||||||
"version_normalized": "4.3.0.0",
|
"version_normalized": "4.4.1.0",
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://git.egplusww.jp/Composer/Smarty-Extended/archive/v4.3.0.zip"
|
"url": "https://git.egplusww.jp/api/packages/Composer/composer/files/egrajp%2Fsmarty-extended/4.4.1/egrajp-smarty-extended.4.4.1.zip",
|
||||||
|
"shasum": "edd7a0960e49bfcc709e0a525729aaaf9ed0db75"
|
||||||
},
|
},
|
||||||
|
"time": "2024-03-06T18:43:44+09:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"installation-source": "dist",
|
"installation-source": "dist",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|||||||
10
www/vendor/composer/installed.php
vendored
10
www/vendor/composer/installed.php
vendored
@@ -11,9 +11,9 @@
|
|||||||
),
|
),
|
||||||
'versions' => array(
|
'versions' => array(
|
||||||
'egrajp/corelibs-composer-all' => array(
|
'egrajp/corelibs-composer-all' => array(
|
||||||
'pretty_version' => 'dev-master',
|
'pretty_version' => 'dev-development',
|
||||||
'version' => 'dev-master',
|
'version' => 'dev-development',
|
||||||
'reference' => '4ab382990ecb9db90386f8ec1a4d87ac8f7c5dd7',
|
'reference' => 'd3d4cf512f62f139c61629d5aa21cf22ad726241',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../egrajp/corelibs-composer-all',
|
'install_path' => __DIR__ . '/../egrajp/corelibs-composer-all',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
@@ -29,8 +29,8 @@
|
|||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'egrajp/smarty-extended' => array(
|
'egrajp/smarty-extended' => array(
|
||||||
'pretty_version' => '4.3.0',
|
'pretty_version' => '4.4.1',
|
||||||
'version' => '4.3.0.0',
|
'version' => '4.4.1.0',
|
||||||
'reference' => null,
|
'reference' => null,
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../egrajp/smarty-extended',
|
'install_path' => __DIR__ . '/../egrajp/smarty-extended',
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<phar name="phpunit" version="^9.6" installed="9.6.13" location="./tools/phpunit" copy="false"/>
|
<phar name="phpunit" version="^9.6" installed="9.6.13" location="./tools/phpunit" copy="false"/>
|
||||||
<phar name="phpcs" version="^3.7.2" installed="3.7.2" location="./tools/phpcs" copy="false"/>
|
<phar name="phpcs" version="^3.7.2" installed="3.7.2" location="./tools/phpcs" copy="false"/>
|
||||||
<phar name="phpcbf" version="^3.7.2" installed="3.7.2" location="./tools/phpcbf" copy="false"/>
|
<phar name="phpcbf" version="^3.7.2" installed="3.7.2" location="./tools/phpcbf" copy="false"/>
|
||||||
<phar name="psalm" version="^5.15.0" installed="5.15.0" location="./tools/psalm" copy="false"/>
|
<phar name="psalm" version="^5.15.0" installed="5.16.0" location="./tools/psalm" copy="false"/>
|
||||||
<phar name="phpstan" version="^1.10.37" installed="1.10.37" location="./tools/phpstan" copy="false"/>
|
<phar name="phpstan" version="^1.10.37" installed="1.10.46" location="./tools/phpstan" copy="false"/>
|
||||||
<phar name="phan" version="^5.4.2" installed="5.4.2" location="./tools/phan" copy="false"/>
|
<phar name="phan" version="^5.4.2" installed="5.4.2" location="./tools/phan" copy="false"/>
|
||||||
</phive>
|
</phive>
|
||||||
|
|||||||
18
www/vendor/egrajp/corelibs-composer-all/phpcs.xml
vendored
Normal file
18
www/vendor/egrajp/corelibs-composer-all/phpcs.xml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<ruleset name="MyStandard">
|
||||||
|
<description>PSR12 override rules (strict, standard). Switch spaces indent to tab.</description>
|
||||||
|
<arg name="tab-width" value="4"/>
|
||||||
|
<rule ref="PSR1"/>
|
||||||
|
<rule ref="PSR12">
|
||||||
|
<!-- turn off white space check for tab -->
|
||||||
|
<exclude name="Generic.WhiteSpace.DisallowTabIndent"/>
|
||||||
|
</rule>
|
||||||
|
<!-- no space indent, must be tab, 4 is tab iwdth -->
|
||||||
|
<rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
|
||||||
|
<rule ref="Generic.WhiteSpace.ScopeIndent">
|
||||||
|
<properties>
|
||||||
|
<property name="indent" value="4"/>
|
||||||
|
<property name="tabIndent" value="true"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
</ruleset>
|
||||||
@@ -1 +1 @@
|
|||||||
9.8.2
|
9.11.1
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class EditBase
|
|||||||
* construct form generator
|
* construct form generator
|
||||||
*
|
*
|
||||||
* phpcs:ignore
|
* phpcs:ignore
|
||||||
* @param array{db_name:string,db_user:string,db_pass:string,db_host:string,db_port:int,db_schema:string,db_encoding:string,db_type:string,db_ssl:string,db_convert_type?:string[]} $db_config db config array, mandatory
|
* @param array{db_name:string,db_user:string,db_pass:string,db_host:string,db_port:int,db_schema:string,db_encoding:string,db_type:string,db_ssl:string,db_convert_type?:string[],db_convert_placeholder?:bool,db_convert_placeholder_target?:string,db_debug_replace_placeholder?:bool} $db_config db config array, mandatory
|
||||||
* @param \CoreLibs\Logging\Logging $log Logging class, null auto set
|
* @param \CoreLibs\Logging\Logging $log Logging class, null auto set
|
||||||
* @param \CoreLibs\Language\L10n $l10n l10n language class, null auto set
|
* @param \CoreLibs\Language\L10n $l10n l10n language class, null auto set
|
||||||
* @param \CoreLibs\ACL\Login $login login class for ACL settings
|
* @param \CoreLibs\ACL\Login $login login class for ACL settings
|
||||||
|
|||||||
@@ -51,6 +51,23 @@ class File
|
|||||||
// return lines in file
|
// return lines in file
|
||||||
return $lines;
|
return $lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the mime type of a file via finfo
|
||||||
|
* if file not found, throws exception
|
||||||
|
* else returns '' for any other finfo read problem
|
||||||
|
*
|
||||||
|
* @param string $read_file File to read, relative or absolute path
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getMimeType(string $read_file): string
|
||||||
|
{
|
||||||
|
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
||||||
|
if (!is_file($read_file)) {
|
||||||
|
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
|
||||||
|
}
|
||||||
|
return $finfo->file($read_file) ?: '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -236,6 +236,54 @@ class ArrayHandler
|
|||||||
return $hit_list;
|
return $hit_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* main wrapper function for next/prev key
|
||||||
|
*
|
||||||
|
* @param array<mixed> $array array to search in
|
||||||
|
* @param int|string $key key for next/prev
|
||||||
|
* @param bool $next [=true] if to search next or prev
|
||||||
|
* @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
|
||||||
|
{
|
||||||
|
$keys = array_keys($array);
|
||||||
|
if (($position = array_search($key, $keys, true)) === false) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$next_position = $next ? $position + 1 : $position - 1;
|
||||||
|
|
||||||
|
if (!isset($keys[$next_position])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return $keys[$next_position];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get previous array key from an array
|
||||||
|
* null on not found
|
||||||
|
*
|
||||||
|
* @param array<mixed> $array
|
||||||
|
* @param int|string $key
|
||||||
|
* @return int|string|null Next key, or null for not found
|
||||||
|
*/
|
||||||
|
public static function arrayGetPrevKey(array $array, int|string $key): int|string|null
|
||||||
|
{
|
||||||
|
return self::arrayGetKey($array, $key, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next array key from an array
|
||||||
|
* null on not found
|
||||||
|
*
|
||||||
|
* @param array<mixed> $array
|
||||||
|
* @param int|string $key
|
||||||
|
* @return int|string|null Next key, or null for not found
|
||||||
|
*/
|
||||||
|
public static function arrayGetNextKey(array $array, int|string $key): int|string|null
|
||||||
|
{
|
||||||
|
return self::arrayGetKey($array, $key, true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* correctly recursive merges as an array as array_merge_recursive
|
* correctly recursive merges as an array as array_merge_recursive
|
||||||
* just glues things together
|
* just glues things together
|
||||||
|
|||||||
@@ -108,7 +108,12 @@ class DateTime
|
|||||||
if (preg_match("/(h|m|s|ms)/", (string)$timestamp)) {
|
if (preg_match("/(h|m|s|ms)/", (string)$timestamp)) {
|
||||||
return (string)$timestamp;
|
return (string)$timestamp;
|
||||||
}
|
}
|
||||||
list($timestamp, $ms) = array_pad(explode('.', (string)round((float)$timestamp, 4)), 2, null);
|
// split to 6 (nano seconds)
|
||||||
|
list($timestamp, $ms) = array_pad(explode('.', (string)round((float)$timestamp, 6)), 2, null);
|
||||||
|
// if micro seconds is on and we have none, set to 0
|
||||||
|
if ($show_micro && $ms === null) {
|
||||||
|
$ms = 0;
|
||||||
|
}
|
||||||
// if negative remember
|
// if negative remember
|
||||||
$negative = false;
|
$negative = false;
|
||||||
if ((int)$timestamp < 0) {
|
if ((int)$timestamp < 0) {
|
||||||
@@ -120,6 +125,10 @@ class DateTime
|
|||||||
$time_string = '';
|
$time_string = '';
|
||||||
// if timestamp is zero, return zero string
|
// if timestamp is zero, return zero string
|
||||||
if ($timestamp == 0) {
|
if ($timestamp == 0) {
|
||||||
|
// if no seconds and we have no microseconds either, show no micro seconds
|
||||||
|
if ($ms == 0) {
|
||||||
|
$ms = null;
|
||||||
|
}
|
||||||
$time_string = '0s';
|
$time_string = '0s';
|
||||||
} else {
|
} else {
|
||||||
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
||||||
@@ -133,11 +142,8 @@ class DateTime
|
|||||||
}
|
}
|
||||||
// only add ms if we have an ms value
|
// only add ms if we have an ms value
|
||||||
if ($ms !== null) {
|
if ($ms !== null) {
|
||||||
// if we have ms and it has leading zeros, remove them, but only if it is nut just 0
|
// prefix the milliseoncds with 0. and round it max 3 digits and then convert to int
|
||||||
$ms = preg_replace("/^0+(\d+)$/", '${1}', $ms);
|
$ms = round((float)('0.' . $ms), 3) * 1000;
|
||||||
if (!is_string($ms) || empty($ms)) {
|
|
||||||
$ms = '0';
|
|
||||||
}
|
|
||||||
// add ms if there
|
// add ms if there
|
||||||
if ($show_micro) {
|
if ($show_micro) {
|
||||||
$time_string .= ' ' . $ms . 'ms';
|
$time_string .= ' ' . $ms . 'ms';
|
||||||
@@ -151,6 +157,240 @@ class DateTime
|
|||||||
return (string)$time_string;
|
return (string)$time_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update timeStringFormat with year and month support
|
||||||
|
*
|
||||||
|
* The following flags have to be set to be timeStringFormat compatible.
|
||||||
|
* Not that on seconds overflow this method will throw an exception, timeStringFormat returned -1s
|
||||||
|
* show_only_days: true,
|
||||||
|
* skip_zero: false,
|
||||||
|
* skip_last_zero: false,
|
||||||
|
* truncate_nanoseconds: true,
|
||||||
|
* truncate_zero_seconds_if_microseconds: false
|
||||||
|
*
|
||||||
|
* @param int|float $seconds Seconds to convert, maxium 6 decimals,
|
||||||
|
* else \UnexpectedValueException will be thrown
|
||||||
|
* if days too large or years too large \LengthException is thrown
|
||||||
|
* @param string $truncate_after [=''] Truncate after which time name, will not round, hard end
|
||||||
|
* values are parts names or interval short names (y, d, f, ...)
|
||||||
|
* if illegal value \UnexpectedValueException is thrown
|
||||||
|
* @param bool $natural_seperator [=false] use ',' and 'and', if off use space
|
||||||
|
* @param bool $name_space_seperator [=false] add a space between the number and the time name
|
||||||
|
* @param bool $show_microseconds [=true] show microseconds
|
||||||
|
* @param bool $short_time_name [=true] use the short time names (eg s instead of seconds)
|
||||||
|
* @param bool $skip_last_zero [=true] skip all trailing zero values, eg 5m 0s => 5m
|
||||||
|
* @param bool $skip_zero [=true] do not show zero values anywhere, eg 1h 0m 20s => 1h 20s
|
||||||
|
* @param bool $show_only_days [=false] do not show years or months, show only days
|
||||||
|
* if truncate after is set to year or month
|
||||||
|
* throws \UnexpectedValueException
|
||||||
|
* @param bool $auto_fix_microseconds [=false] if the micro seconds decimals are more than 6, round them
|
||||||
|
* on defaul throw \UnexpectedValueException
|
||||||
|
* @param bool $truncate_nanoseconds [=false] if microseconds decimals >3 then normal we show 123.4ms
|
||||||
|
* cut the .4 is set to true
|
||||||
|
* @param bool $truncate_zero_seconds_if_microseconds [=true] if we have 0.123 seconds then if true no seconds
|
||||||
|
* will be shown
|
||||||
|
* @return string
|
||||||
|
* @throws \UnexpectedValueException if seconds has more than 6 decimals
|
||||||
|
* if truncate has an illegal value
|
||||||
|
* if truncate is set to year or month and show_only_days is turned on
|
||||||
|
* @throws \LengthException if seconds is too large and show_days_only is selected and days is negetive
|
||||||
|
* or if years is negativ
|
||||||
|
*/
|
||||||
|
public static function intervalStringFormat(
|
||||||
|
int|float $seconds,
|
||||||
|
string $truncate_after = '',
|
||||||
|
bool $natural_seperator = false,
|
||||||
|
bool $name_space_seperator = false,
|
||||||
|
bool $show_microseconds = true,
|
||||||
|
bool $short_time_name = true,
|
||||||
|
bool $skip_last_zero = true,
|
||||||
|
bool $skip_zero = true,
|
||||||
|
bool $show_only_days = false,
|
||||||
|
bool $auto_fix_microseconds = false,
|
||||||
|
bool $truncate_nanoseconds = false,
|
||||||
|
bool $truncate_zero_seconds_if_microseconds = true,
|
||||||
|
): string {
|
||||||
|
// auto fix long seconds, else \UnexpectedValueException will be thrown on error
|
||||||
|
// check if we have float and -> round to 6
|
||||||
|
if ($auto_fix_microseconds === true && is_float($seconds)) {
|
||||||
|
$seconds = round($seconds, 6);
|
||||||
|
}
|
||||||
|
// flag negative + set abs
|
||||||
|
$negative = $seconds < 0 ? '-' : '';
|
||||||
|
$seconds = abs($seconds);
|
||||||
|
// create base time
|
||||||
|
$date_now = new \DateTime("@0");
|
||||||
|
try {
|
||||||
|
$date_seconds = new \DateTime("@$seconds");
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new \UnexpectedValueException(
|
||||||
|
'Seconds value is invalid, too large or more than six decimals: ' . $seconds,
|
||||||
|
1,
|
||||||
|
$e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$interval = date_diff($date_now, $date_seconds);
|
||||||
|
// if show_only_days and negative but input postive alert that this has to be done in y/m/d ...
|
||||||
|
if ($interval->y < 0) {
|
||||||
|
throw new \LengthException('Input seconds value is too large for years output: ' . $seconds, 2);
|
||||||
|
} elseif ($interval->days < 0 && $show_only_days === true) {
|
||||||
|
throw new \LengthException('Input seconds value is too large for days output: ' . $seconds, 3);
|
||||||
|
}
|
||||||
|
$parts = [
|
||||||
|
'years' => 'y',
|
||||||
|
'months' => 'm',
|
||||||
|
'days' => 'd',
|
||||||
|
'hours' => 'h',
|
||||||
|
'minutes' => 'i',
|
||||||
|
'seconds' => 's',
|
||||||
|
'microseconds' => 'f',
|
||||||
|
];
|
||||||
|
$short_name = [
|
||||||
|
'years' => 'y', 'months' => 'm', 'days' => 'd',
|
||||||
|
'hours' => 'h', 'minutes' => 'm', 'seconds' => 's',
|
||||||
|
'microseconds' => 'ms'
|
||||||
|
];
|
||||||
|
// $skip = false;
|
||||||
|
if (!empty($truncate_after)) {
|
||||||
|
// if truncate after not in key or value in parts
|
||||||
|
if (!in_array($truncate_after, array_keys($parts)) && !in_array($truncate_after, array_values($parts))) {
|
||||||
|
throw new \UnexpectedValueException(
|
||||||
|
'truncate_after has an invalid value: ' . $truncate_after,
|
||||||
|
4
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// if truncate after is y or m and we have show_only_days, throw exception
|
||||||
|
if ($show_only_days === true && in_array($truncate_after, ['y', 'years', 'm', 'months'])) {
|
||||||
|
throw new \UnexpectedValueException(
|
||||||
|
'If show_only_days is turned on, the truncate_after cannot be years or months: '
|
||||||
|
. $truncate_after,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// $skip = true;
|
||||||
|
}
|
||||||
|
$formatted = [];
|
||||||
|
$zero_formatted = [];
|
||||||
|
$value_set = false;
|
||||||
|
$add_zero_seconds = false;
|
||||||
|
foreach ($parts as $time_name => $part) {
|
||||||
|
if (
|
||||||
|
// skip for micro seconds
|
||||||
|
($show_microseconds === false && $part == 'f') ||
|
||||||
|
// skip for if days only and we have year or month
|
||||||
|
($show_only_days === true && in_array($part, ['y', 'm']))
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$add_value = 0;
|
||||||
|
if ($show_only_days === true && $part == 'd') {
|
||||||
|
$value = $interval->days;
|
||||||
|
} else {
|
||||||
|
$value = $interval->$part;
|
||||||
|
}
|
||||||
|
// print "-> V: $value | $part, $time_name"
|
||||||
|
// . " | Set: " . ($value_set ? 'Y' : 'N') . ", SkipZ: " . ($skip_zero ? 'Y' : 'N')
|
||||||
|
// . " | SkipLZ: " . ($skip_last_zero ? 'Y' : 'N')
|
||||||
|
// . " | " . ($value != 0 ? 'Not zero' : 'ZERO') . "<br>";
|
||||||
|
if ($value != 0) {
|
||||||
|
if ($part == 'f') {
|
||||||
|
if ($truncate_nanoseconds === true) {
|
||||||
|
$value = round($value, 3);
|
||||||
|
}
|
||||||
|
$value *= 1000;
|
||||||
|
// anything above that is nano seconds?
|
||||||
|
}
|
||||||
|
if ($value) {
|
||||||
|
$value_set = true;
|
||||||
|
}
|
||||||
|
$add_value = 1;
|
||||||
|
} elseif (
|
||||||
|
$value == 0 &&
|
||||||
|
$value_set === true && (
|
||||||
|
$skip_last_zero === false ||
|
||||||
|
$skip_zero === false
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
$add_value = 2;
|
||||||
|
}
|
||||||
|
// echo "ADD VALUE: $add_value<br>";
|
||||||
|
if ($add_value) {
|
||||||
|
// build format
|
||||||
|
$format = "$value";
|
||||||
|
if ($name_space_seperator) {
|
||||||
|
$format .= " ";
|
||||||
|
}
|
||||||
|
if ($short_time_name) {
|
||||||
|
$format .= $short_name[$time_name];
|
||||||
|
} elseif ($value == 1) {
|
||||||
|
$format .= substr($time_name, 0, -1);
|
||||||
|
} else {
|
||||||
|
$format .= $time_name;
|
||||||
|
}
|
||||||
|
if ($add_value == 1) {
|
||||||
|
if (count($zero_formatted) && $skip_zero === false) {
|
||||||
|
$formatted = array_merge($formatted, $zero_formatted);
|
||||||
|
}
|
||||||
|
$zero_formatted = [];
|
||||||
|
$formatted[] = $format;
|
||||||
|
} elseif ($add_value == 2) {
|
||||||
|
$zero_formatted[] = $format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if seconds is zero
|
||||||
|
if (
|
||||||
|
$part == 's' && $value == 0 &&
|
||||||
|
$show_microseconds === true &&
|
||||||
|
$truncate_zero_seconds_if_microseconds === false
|
||||||
|
) {
|
||||||
|
$add_zero_seconds = true;
|
||||||
|
}
|
||||||
|
// stop after a truncate is matching
|
||||||
|
if ($part == $truncate_after || $truncate_after == $time_name) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add all zero entries if we have skip last off
|
||||||
|
if (count($zero_formatted) && $skip_last_zero === false) {
|
||||||
|
$formatted = array_merge($formatted, $zero_formatted);
|
||||||
|
}
|
||||||
|
// print "=> F: " . print_r($formatted, true)
|
||||||
|
// . " | Z: " . print_r($zero_list, true)
|
||||||
|
// . " | ZL: " . print_r($zero_last_list, true)
|
||||||
|
// . "<br>";
|
||||||
|
if (count($formatted) == 0) {
|
||||||
|
// if we have truncate on, then we assume nothing was found
|
||||||
|
if (!empty($truncate_after)) {
|
||||||
|
if (in_array($truncate_after, array_values($parts))) {
|
||||||
|
$truncate_after = array_flip($parts)[$truncate_after];
|
||||||
|
}
|
||||||
|
$time_name = $truncate_after;
|
||||||
|
} else {
|
||||||
|
$time_name = 'seconds';
|
||||||
|
}
|
||||||
|
return '0' . ($name_space_seperator ? ' ' : '')
|
||||||
|
. ($short_time_name ? $short_name[$time_name] : $time_name);
|
||||||
|
} elseif (count($formatted) == 1) {
|
||||||
|
return $negative .
|
||||||
|
($add_zero_seconds ?
|
||||||
|
'0'
|
||||||
|
. ($name_space_seperator ? ' ' : '')
|
||||||
|
. ($short_time_name ? $short_name['seconds'] : 'seconds')
|
||||||
|
. ' '
|
||||||
|
: ''
|
||||||
|
)
|
||||||
|
. $formatted[0];
|
||||||
|
} elseif ($natural_seperator === false) {
|
||||||
|
return $negative . implode(' ', $formatted);
|
||||||
|
} else {
|
||||||
|
$str = implode(', ', array_slice($formatted, 0, -1));
|
||||||
|
if (!empty($formatted[count($formatted) - 1])) {
|
||||||
|
$str .= ' and ' . (string)array_pop($formatted);
|
||||||
|
}
|
||||||
|
return $negative . $str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* does a reverse of the timeStringFormat and converts the string from
|
* does a reverse of the timeStringFormat and converts the string from
|
||||||
* xd xh xm xs xms to a timestamp.microtime format
|
* xd xh xm xs xms to a timestamp.microtime format
|
||||||
@@ -435,9 +675,9 @@ class DateTime
|
|||||||
foreach ($period as $dt) {
|
foreach ($period as $dt) {
|
||||||
$curr = $dt->format('D');
|
$curr = $dt->format('D');
|
||||||
if ($curr == 'Sat' || $curr == 'Sun') {
|
if ($curr == 'Sat' || $curr == 'Sun') {
|
||||||
$days[2] ++;
|
$days[2]++;
|
||||||
} else {
|
} else {
|
||||||
$days[1] ++;
|
$days[1]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($return_named === true) {
|
if ($return_named === true) {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class Byte
|
|||||||
* BYTE_FORMAT_ADJUST: sprintf adjusted two 2 decimals
|
* BYTE_FORMAT_ADJUST: sprintf adjusted two 2 decimals
|
||||||
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
||||||
* @return string converted byte number (float) with suffix
|
* @return string converted byte number (float) with suffix
|
||||||
* @throws \Exception 1: no valid flag set
|
* @throws \InvalidArgumentException 1: no valid flag set
|
||||||
*/
|
*/
|
||||||
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
||||||
{
|
{
|
||||||
@@ -63,7 +63,7 @@ class Byte
|
|||||||
$si = false;
|
$si = false;
|
||||||
}
|
}
|
||||||
if ($flags > 7) {
|
if ($flags > 7) {
|
||||||
throw new \Exception("Invalid flags parameter: $flags", 1);
|
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// si or normal
|
// si or normal
|
||||||
@@ -119,7 +119,7 @@ class Byte
|
|||||||
* @param int $flags bitwise flag with use space turned on
|
* @param int $flags bitwise flag with use space turned on
|
||||||
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
||||||
* @return string|int|float converted value or original value
|
* @return string|int|float converted value or original value
|
||||||
* @throws \Exception 1: no valid flag set
|
* @throws \InvalidArgumentException 1: no valid flag set
|
||||||
*/
|
*/
|
||||||
public static function stringByteFormat(string|int|float $number, int $flags = 0): string|int|float
|
public static function stringByteFormat(string|int|float $number, int $flags = 0): string|int|float
|
||||||
{
|
{
|
||||||
@@ -130,7 +130,7 @@ class Byte
|
|||||||
$si = false;
|
$si = false;
|
||||||
}
|
}
|
||||||
if ($flags != 0 && $flags != 4) {
|
if ($flags != 0 && $flags != 4) {
|
||||||
throw new \Exception("Invalid flags parameter: $flags", 1);
|
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
|
||||||
}
|
}
|
||||||
// matches in regex
|
// matches in regex
|
||||||
$matches = [];
|
$matches = [];
|
||||||
|
|||||||
@@ -118,6 +118,22 @@ class Strings
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strip any duplicated slahes from a path
|
||||||
|
* eg: //foo///bar/foo.inc -> /foo/bar/foo.inc
|
||||||
|
*
|
||||||
|
* @param string $path Path to strip slashes from
|
||||||
|
* @return string Clean path, on error returns original path
|
||||||
|
*/
|
||||||
|
public static function stripMultiplePathSlashes(string $path): string
|
||||||
|
{
|
||||||
|
return preg_replace(
|
||||||
|
'#/+#',
|
||||||
|
'/',
|
||||||
|
$path
|
||||||
|
) ?? $path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
* primary key name automatically (from array)
|
* primary key name automatically (from array)
|
||||||
*
|
*
|
||||||
* phpcs:ignore
|
* phpcs:ignore
|
||||||
* @param array{db_name:string,db_user:string,db_pass:string,db_host:string,db_port:int,db_schema:string,db_encoding:string,db_type:string,db_ssl:string,db_convert_type?:string[]} $db_config db connection config
|
* @param array{db_name:string,db_user:string,db_pass:string,db_host:string,db_port:int,db_schema:string,db_encoding:string,db_type:string,db_ssl:string,db_convert_type?:string[],db_convert_placeholder?:bool,db_convert_placeholder_target?:string,db_debug_replace_placeholder?:bool} $db_config db connection config
|
||||||
* @param array<mixed> $table_array table array config
|
* @param array<mixed> $table_array table array config
|
||||||
* @param string $table_name table name string
|
* @param string $table_name table name string
|
||||||
* @param \CoreLibs\Logging\Logging $log Logging class
|
* @param \CoreLibs\Logging\Logging $log Logging class
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
220
www/vendor/egrajp/corelibs-composer-all/src/DB/Support/ConvertPlaceholder.php
vendored
Normal file
220
www/vendor/egrajp/corelibs-composer-all/src/DB/Support/ConvertPlaceholder.php
vendored
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AUTOR: Clemens Schwaighofer
|
||||||
|
* CREATED: 2023/10/10
|
||||||
|
* DESCRIPTION:
|
||||||
|
* Convert placeholders in query from PDO style ? or :named to \PG style $number
|
||||||
|
* pr the other way around
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\DB\Support;
|
||||||
|
|
||||||
|
class ConvertPlaceholder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Convert PDO type query with placeholders to \PG style and vica versa
|
||||||
|
* For PDO to: ? and :named
|
||||||
|
* For \PG to: $number
|
||||||
|
*
|
||||||
|
* If the query has a mix of ?, :named or $numbrer the \OutOfRangeException exception
|
||||||
|
* will be thrown
|
||||||
|
*
|
||||||
|
* If the convert_to is either pg or pdo, nothing will be changed
|
||||||
|
*
|
||||||
|
* found has -1 if an error occoured in the preg_match_all call
|
||||||
|
*
|
||||||
|
* @param string $query Query with placeholders to convert
|
||||||
|
* @param array<mixed> $params The parameters that are used for the query, and will be updated
|
||||||
|
* @param string $convert_to Either pdo or pg, will be converted to lower case for check
|
||||||
|
* @return array{original:array{query:string,params:array<mixed>},type:''|'named'|'numbered'|'question_mark',found:int,matches:array<string>,params_lookup:array<mixed>,query:string,params:array<mixed>}
|
||||||
|
* @throws \OutOfRangeException 200
|
||||||
|
*/
|
||||||
|
public static function convertPlaceholderInQuery(
|
||||||
|
string $query,
|
||||||
|
array $params,
|
||||||
|
string $convert_to = 'pg'
|
||||||
|
): array {
|
||||||
|
$convert_to = strtolower($convert_to);
|
||||||
|
$matches = [];
|
||||||
|
$pattern = '/'
|
||||||
|
// prefix string part, must match towards
|
||||||
|
. '(?:\'.*?\')?\s*(?:\?\?|[(=,])\s*'
|
||||||
|
// match for replace part
|
||||||
|
. '(?:'
|
||||||
|
// digit -> ignore
|
||||||
|
. '\d+|'
|
||||||
|
// other string -> ignore
|
||||||
|
. '(?:\'.*?\')|'
|
||||||
|
// :name named part (PDO)
|
||||||
|
. '(:\w+)|'
|
||||||
|
// ? question mark part (PDO)
|
||||||
|
. '(?:(?:\?\?)?\s*(\?{1}))|'
|
||||||
|
// $n numbered part (\PG php)
|
||||||
|
. '(\$[1-9]{1}(?:[0-9]{1,})?)'
|
||||||
|
// end match
|
||||||
|
. ')'
|
||||||
|
// single line -> add line break to matches in "."
|
||||||
|
. '/s';
|
||||||
|
// matches:
|
||||||
|
// 1: :named
|
||||||
|
// 2: ? question mark
|
||||||
|
// 3: $n numbered
|
||||||
|
$found = preg_match_all($pattern, $query, $matches, PREG_UNMATCHED_AS_NULL);
|
||||||
|
// if false or null set to -1
|
||||||
|
// || $found === null
|
||||||
|
if ($found === false) {
|
||||||
|
$found = -1;
|
||||||
|
}
|
||||||
|
/** @var array<string> 1: named */
|
||||||
|
$named_matches = array_filter($matches[1]);
|
||||||
|
/** @var array<string> 2: open ? */
|
||||||
|
$qmark_matches = array_filter($matches[2]);
|
||||||
|
/** @var array<string> 3: $n matches */
|
||||||
|
$numbered_matches = array_filter($matches[3]);
|
||||||
|
// count matches
|
||||||
|
$count_named = count($named_matches);
|
||||||
|
$count_qmark = count($qmark_matches);
|
||||||
|
$count_numbered = count($numbered_matches);
|
||||||
|
// throw if mixed
|
||||||
|
if (
|
||||||
|
($count_named && $count_qmark) ||
|
||||||
|
($count_named && $count_numbered) ||
|
||||||
|
($count_qmark && $count_numbered)
|
||||||
|
) {
|
||||||
|
throw new \OutOfRangeException('Cannot have named, question mark and numbered in the same query', 200);
|
||||||
|
}
|
||||||
|
// rebuild
|
||||||
|
$matches_return = [];
|
||||||
|
$type = '';
|
||||||
|
$query_new = '';
|
||||||
|
$params_new = [];
|
||||||
|
$params_lookup = [];
|
||||||
|
if ($count_named && $convert_to == 'pg') {
|
||||||
|
$type = 'named';
|
||||||
|
$matches_return = $named_matches;
|
||||||
|
// only check for :named
|
||||||
|
$pattern_replace = '/((?:\'.*?\')?\s*(?:\?\?|[(=,])\s*)(\d+|(?:\'.*?\')|(:\w+))/s';
|
||||||
|
// 0: full
|
||||||
|
// 1: pre part
|
||||||
|
// 2: keep part UNLESS '3' is set
|
||||||
|
// 3: replace part :named
|
||||||
|
$pos = 0;
|
||||||
|
$query_new = preg_replace_callback(
|
||||||
|
$pattern_replace,
|
||||||
|
function ($matches) use (&$pos, &$params_new, &$params_lookup, $params) {
|
||||||
|
// only count up if $match[3] is not yet in lookup table
|
||||||
|
if (!empty($matches[3]) && empty($params_lookup[$matches[3]])) {
|
||||||
|
$pos++;
|
||||||
|
$params_lookup[$matches[3]] = '$' . $pos;
|
||||||
|
$params_new[] = $params[$matches[3]] ??
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Cannot lookup ' . $matches[3] . ' in params list',
|
||||||
|
210
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
|
return $matches[1] . (
|
||||||
|
empty($matches[3]) ?
|
||||||
|
$matches[2] :
|
||||||
|
$params_lookup[$matches[3]] ??
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Cannot lookup ' . $matches[3] . ' in params lookup list',
|
||||||
|
211
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
$query
|
||||||
|
);
|
||||||
|
} elseif ($count_qmark && $convert_to == 'pg') {
|
||||||
|
$type = 'question_mark';
|
||||||
|
$matches_return = $qmark_matches;
|
||||||
|
// order and data stays the same
|
||||||
|
$params_new = $params;
|
||||||
|
// only check for ?
|
||||||
|
$pattern_replace = '/((?:\'.*?\')?\s*(?:\?\?|[(=,])\s*)(\d+|(?:\'.*?\')|(?:(?:\?\?)?\s*(\?{1})))/s';
|
||||||
|
// 0: full
|
||||||
|
// 1: pre part
|
||||||
|
// 2: keep part UNLESS '3' is set
|
||||||
|
// 3: replace part ?
|
||||||
|
$pos = 0;
|
||||||
|
$query_new = preg_replace_callback(
|
||||||
|
$pattern_replace,
|
||||||
|
function ($matches) use (&$pos, &$params_lookup) {
|
||||||
|
// only count pos up for actual replacements we will do
|
||||||
|
if (!empty($matches[3])) {
|
||||||
|
$pos++;
|
||||||
|
$params_lookup[] = '$' . $pos;
|
||||||
|
}
|
||||||
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
|
return $matches[1] . (
|
||||||
|
empty($matches[3]) ?
|
||||||
|
$matches[2] :
|
||||||
|
'$' . $pos
|
||||||
|
);
|
||||||
|
},
|
||||||
|
$query
|
||||||
|
);
|
||||||
|
// for each ?:DTN: -> replace with $1 ... $n, any remaining :DTN: remove
|
||||||
|
} elseif ($count_numbered && $convert_to == 'pdo') {
|
||||||
|
// convert numbered to named
|
||||||
|
$type = 'numbered';
|
||||||
|
$matches_return = $numbered_matches;
|
||||||
|
// only check for $n
|
||||||
|
$pattern_replace = '/((?:\'.*?\')?\s*(?:\?\?|[(=,])\s*)(\d+|(?:\'.*?\')|(\$[1-9]{1}(?:[0-9]{1,})?))/s';
|
||||||
|
// 0: full
|
||||||
|
// 1: pre part
|
||||||
|
// 2: keep part UNLESS '3' is set
|
||||||
|
// 3: replace part $numbered
|
||||||
|
$pos = 0;
|
||||||
|
$query_new = preg_replace_callback(
|
||||||
|
$pattern_replace,
|
||||||
|
function ($matches) use (&$pos, &$params_new, &$params_lookup, $params) {
|
||||||
|
// only count up if $match[3] is not yet in lookup table
|
||||||
|
if (!empty($matches[3]) && empty($params_lookup[$matches[3]])) {
|
||||||
|
$pos++;
|
||||||
|
$params_lookup[$matches[3]] = ':' . $pos . '_named';
|
||||||
|
$params_new[] = $params[($pos - 1)] ??
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Cannot lookup ' . ($pos - 1) . ' in params list',
|
||||||
|
220
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
|
return $matches[1] . (
|
||||||
|
empty($matches[3]) ?
|
||||||
|
$matches[2] :
|
||||||
|
$params_lookup[$matches[3]] ??
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Cannot lookup ' . $matches[3] . ' in params lookup list',
|
||||||
|
221
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
$query
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// return, old query is always set
|
||||||
|
return [
|
||||||
|
// original
|
||||||
|
'original' => [
|
||||||
|
'query' => $query,
|
||||||
|
'params' => $params,
|
||||||
|
],
|
||||||
|
// type found, empty if nothing was done
|
||||||
|
'type' => $type,
|
||||||
|
// int: found, not found; -1: problem (set from false)
|
||||||
|
'found' => (int)$found,
|
||||||
|
'matches' => $matches_return,
|
||||||
|
// old to new lookup check
|
||||||
|
'params_lookup' => $params_lookup,
|
||||||
|
// new
|
||||||
|
'query' => $query_new ?? '',
|
||||||
|
'params' => $params_new,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -295,8 +295,7 @@ class Support
|
|||||||
* Will start with start_level to skip unwanted from stack
|
* Will start with start_level to skip unwanted from stack
|
||||||
* Defaults to skip level 0 wich is this methid
|
* Defaults to skip level 0 wich is this methid
|
||||||
*
|
*
|
||||||
* @param integer $start_level From what level on, as defaul starts with 1
|
* @param integer $start_level [=1] From what level on, starts with 1 to exclude self
|
||||||
* to exclude self
|
|
||||||
* @return array<mixed> All method names in list where max is last called
|
* @return array<mixed> All method names in list where max is last called
|
||||||
*/
|
*/
|
||||||
public static function getCallerMethodList(int $start_level = 1): array
|
public static function getCallerMethodList(int $start_level = 1): array
|
||||||
@@ -304,15 +303,46 @@ class Support
|
|||||||
$traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
$traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
||||||
$methods = [];
|
$methods = [];
|
||||||
foreach ($traces as $level => $data) {
|
foreach ($traces as $level => $data) {
|
||||||
if ($level >= $start_level) {
|
if ($level < $start_level) {
|
||||||
if (!empty($data['function'])) {
|
continue;
|
||||||
array_unshift($methods, $data['function']);
|
}
|
||||||
}
|
if (!empty($data['function'])) {
|
||||||
|
array_unshift($methods, $data['function']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $methods;
|
return $methods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the full call stack from a certain starting level
|
||||||
|
* The return string is
|
||||||
|
* file:line:class->method
|
||||||
|
*
|
||||||
|
* Note that '::' is used for static calls
|
||||||
|
*
|
||||||
|
* @param int $start_level [=1] starts with 1 to exclude itself
|
||||||
|
* @return array<string> string with file, line, class and method
|
||||||
|
*/
|
||||||
|
public static function getCallStack(int $start_level = 1): array
|
||||||
|
{
|
||||||
|
$call_stack = [];
|
||||||
|
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
||||||
|
foreach ($backtrace as $level => $call_trace) {
|
||||||
|
if ($level < $start_level) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$call_stack[] =
|
||||||
|
($call_trace['file'] ?? 'n/f') . ':'
|
||||||
|
. ($call_trace['line'] ?? '-') . ':'
|
||||||
|
. (!empty($call_trace['class']) ?
|
||||||
|
$call_trace['class'] . ($call_trace['type'] ?? '') :
|
||||||
|
''
|
||||||
|
)
|
||||||
|
. $call_trace['function'];
|
||||||
|
}
|
||||||
|
return $call_stack;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the current class where this function is called
|
* Get the current class where this function is called
|
||||||
* Is mostly used in debug log statements to get the class where the debug
|
* Is mostly used in debug log statements to get the class where the debug
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ class Generate
|
|||||||
* construct form generator
|
* construct form generator
|
||||||
*
|
*
|
||||||
* phpcs:ignore
|
* phpcs:ignore
|
||||||
* @param array{db_name:string,db_user:string,db_pass:string,db_host:string,db_port:int,db_schema:string,db_encoding:string,db_type:string,db_ssl:string,db_convert_type?:string[]} $db_config db config array, mandatory
|
* @param array{db_name:string,db_user:string,db_pass:string,db_host:string,db_port:int,db_schema:string,db_encoding:string,db_type:string,db_ssl:string,db_convert_type?:string[],db_convert_placeholder?:bool,db_convert_placeholder_target?:string,db_debug_replace_placeholder?:bool} $db_config db config array, mandatory
|
||||||
* @param \CoreLibs\Logging\Logging $log Logging class
|
* @param \CoreLibs\Logging\Logging $log Logging class
|
||||||
* @param \CoreLibs\Language\L10n $l10n l10n language class
|
* @param \CoreLibs\Language\L10n $l10n l10n language class
|
||||||
* @param array<string,mixed> $login_acl Login ACL array,
|
* @param array<string,mixed> $login_acl Login ACL array,
|
||||||
@@ -826,27 +826,28 @@ class Generate
|
|||||||
$pk_selected = $res[$this->int_pk_name];
|
$pk_selected = $res[$this->int_pk_name];
|
||||||
}
|
}
|
||||||
$t_string = '';
|
$t_string = '';
|
||||||
foreach ($this->field_array as $i => $field_array) {
|
foreach ($this->field_array as $field_array) {
|
||||||
if ($t_string) {
|
if ($t_string) {
|
||||||
$t_string .= ', ';
|
$t_string .= ', ';
|
||||||
}
|
}
|
||||||
if (isset($field_array['before_value'])) {
|
if (!empty($field_array['before_value'])) {
|
||||||
$t_string .= $field_array['before_value'];
|
$t_string .= $this->l->__($field_array['before_value']);
|
||||||
}
|
}
|
||||||
// must have res element set
|
// must have res element set
|
||||||
if (
|
if (
|
||||||
isset($field_array['name']) &&
|
!empty($field_array['name']) &&
|
||||||
isset($res[$field_array['name']])
|
isset($res[$field_array['name']])
|
||||||
) {
|
) {
|
||||||
if (isset($field_array['binary'])) {
|
$_t_value = '';
|
||||||
if (isset($field_array['binary'][0])) {
|
// if we have a binary set, where 0 = YES and 1 = NO
|
||||||
$t_string .= $field_array['binary'][0];
|
if (!empty($field_array['binary'])) {
|
||||||
} elseif (isset($field_array['binary'][1])) {
|
$_t_value = !empty($res[$field_array['name']]) ?
|
||||||
$t_string .= $field_array['binary'][1];
|
($field_array['binary'][0] ?? 'Yes') :
|
||||||
}
|
($field_array['binary'][1] ?? 'No');
|
||||||
} else {
|
} else {
|
||||||
$t_string .= $res[$field_array['name']];
|
$_t_value = $res[$field_array['name']];
|
||||||
}
|
}
|
||||||
|
$t_string .= $this->l->__($_t_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$pk_names[] = $t_string;
|
$pk_names[] = $t_string;
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ class Image
|
|||||||
if (!empty($dummy) && file_exists($filename) && is_file($filename)) {
|
if (!empty($dummy) && file_exists($filename) && is_file($filename)) {
|
||||||
$return_data = $filename;
|
$return_data = $filename;
|
||||||
} else {
|
} else {
|
||||||
throw new \Exception('Could not set dummy return file: ' . $dummy . ' in ' . $filename);
|
throw new \RuntimeException('Could not set dummy return file: ' . $dummy . ' in ' . $filename);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$return_data = $dummy;
|
$return_data = $dummy;
|
||||||
@@ -204,11 +204,11 @@ class Image
|
|||||||
E_USER_DEPRECATED
|
E_USER_DEPRECATED
|
||||||
);
|
);
|
||||||
// NOTE: we need to depracte this
|
// NOTE: we need to depracte this
|
||||||
$cache_folder = BASE . LAYOUT . CONTENT_PATH . CACHE . IMAGES;
|
$cache_folder = BASE . CONTENT_PATH . LAYOUT . CACHE . IMAGES;
|
||||||
$web_folder = LAYOUT . CACHE . IMAGES;
|
$web_folder = LAYOUT . CACHE . IMAGES;
|
||||||
if (!is_dir($cache_folder)) {
|
if (!is_dir($cache_folder)) {
|
||||||
if (false === mkdir($cache_folder)) {
|
if (false === mkdir($cache_folder)) {
|
||||||
$cache_folder = BASE . LAYOUT . CONTENT_PATH . CACHE;
|
$cache_folder = BASE . CONTENT_PATH . LAYOUT . CACHE;
|
||||||
$web_folder = LAYOUT . CACHE;
|
$web_folder = LAYOUT . CACHE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ class ProgressBar
|
|||||||
{
|
{
|
||||||
// avoid divison through 0
|
// avoid divison through 0
|
||||||
if ($this->max - $this->min == 0) {
|
if ($this->max - $this->min == 0) {
|
||||||
$this->max ++;
|
$this->max++;
|
||||||
}
|
}
|
||||||
$percent = round(($step - $this->min) / ($this->max - $this->min) * 100);
|
$percent = round(($step - $this->min) / ($this->max - $this->min) * 100);
|
||||||
if ($percent > 100) {
|
if ($percent > 100) {
|
||||||
@@ -186,7 +186,7 @@ class ProgressBar
|
|||||||
}
|
}
|
||||||
// avoid divison through 0
|
// avoid divison through 0
|
||||||
if ($this->max - $this->min == 0) {
|
if ($this->max - $this->min == 0) {
|
||||||
$this->max ++;
|
$this->max++;
|
||||||
}
|
}
|
||||||
$pixel = round(($step - $this->min) * ($bar - ($this->pedding * 2)) / ($this->max - $this->min));
|
$pixel = round(($step - $this->min) * ($bar - ($this->pedding * 2)) / ($this->max - $this->min));
|
||||||
if ($step <= $this->min) {
|
if ($step <= $this->min) {
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ final class CoreLibsCheckFileTest extends TestCase
|
|||||||
public function filesList(): array
|
public function filesList(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
['filename.txt', 'txt', 5],
|
['filename.txt', 'txt', 5, 'text/plain'],
|
||||||
['filename.csv', 'csv', 15],
|
['filename.csv', 'csv', 15, 'text/csv'],
|
||||||
['filename.tsv', 'tsv', 0],
|
['filename.tsv', 'tsv', 0, 'text/plain'],
|
||||||
['file_does_not_exits', '', -1],
|
['file_does_not_exits', '', -1, ''],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,6 +63,15 @@ final class CoreLibsCheckFileTest extends TestCase
|
|||||||
return $list;
|
return $list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function mimeTypeProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->filesList() as $row) {
|
||||||
|
$list[$row[0] . ' must be mime type ' . $row[3]] = [$row[0], $row[3]];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests if file extension matches
|
* Tests if file extension matches
|
||||||
*
|
*
|
||||||
@@ -115,6 +124,51 @@ final class CoreLibsCheckFileTest extends TestCase
|
|||||||
unlink($this->base_folder . $input);
|
unlink($this->base_folder . $input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getMimeType
|
||||||
|
* @dataProvider mimeTypeProvider
|
||||||
|
* @testdox getMimeType $input must be mime type $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetMimeType(string $input, string $expected): void
|
||||||
|
{
|
||||||
|
if (!empty($expected)) {
|
||||||
|
$file = $this->base_folder . $input;
|
||||||
|
$fp = fopen($file, 'w');
|
||||||
|
switch ($expected) {
|
||||||
|
case 'text/csv':
|
||||||
|
for ($i = 1; $i <= 10; $i++) {
|
||||||
|
fwrite($fp, '"This is row","' . $expected . '",' . $i . PHP_EOL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'text/tsv':
|
||||||
|
for ($i = 1; $i <= 10; $i++) {
|
||||||
|
fwrite($fp, "\"This is row\"\t\"" . $expected . "\"\t\"" . $i . PHP_EOL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'text/plain':
|
||||||
|
fwrite($fp, 'This is mime type: ' . $expected . PHP_EOL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
} else {
|
||||||
|
$this->expectException(\UnexpectedValueException::class);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\File::getMimeType($this->base_folder . $input)
|
||||||
|
);
|
||||||
|
// unlink file
|
||||||
|
if (is_file($this->base_folder . $input)) {
|
||||||
|
unlink($this->base_folder . $input);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -1098,16 +1098,109 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
* @testdox arrayFlatForKey array $input will be $expected [$_dataName]
|
* @testdox arrayFlatForKey array $input will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
* @param array $input
|
* @param array $input
|
||||||
|
* @param string $search
|
||||||
* @param array $expected
|
* @param array $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testArrayFlatForKey(array $input, $search, array $expected): void
|
public function testArrayFlatForKey(array $input, string $search, array $expected): void
|
||||||
{
|
{
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Combined\ArrayHandler::arrayFlatForKey($input, $search)
|
\CoreLibs\Combined\ArrayHandler::arrayFlatForKey($input, $search)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerArrayGetNextPrevKey(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'find, ok' => [
|
||||||
|
'input' => [
|
||||||
|
'a' => 'First',
|
||||||
|
'b' => 'Second',
|
||||||
|
'c' => 'Third',
|
||||||
|
],
|
||||||
|
'b',
|
||||||
|
'a',
|
||||||
|
'c'
|
||||||
|
],
|
||||||
|
'find, first' => [
|
||||||
|
'input' => [
|
||||||
|
'a' => 'First',
|
||||||
|
'b' => 'Second',
|
||||||
|
'c' => 'Third',
|
||||||
|
],
|
||||||
|
'a',
|
||||||
|
null,
|
||||||
|
'b'
|
||||||
|
],
|
||||||
|
'find, last' => [
|
||||||
|
'input' => [
|
||||||
|
'a' => 'First',
|
||||||
|
'b' => 'Second',
|
||||||
|
'c' => 'Third',
|
||||||
|
],
|
||||||
|
'c',
|
||||||
|
'b',
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'find, not found' => [
|
||||||
|
'input' => [
|
||||||
|
'a' => 'First',
|
||||||
|
'b' => 'Second',
|
||||||
|
'c' => 'Third',
|
||||||
|
],
|
||||||
|
'z',
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'int, index' => [
|
||||||
|
'input' => [
|
||||||
|
'a',
|
||||||
|
'b',
|
||||||
|
'c'
|
||||||
|
],
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::arrayGetPrevKey, ::arrayGetNextKey
|
||||||
|
* @dataProvider providerArrayGetNextPrevKey
|
||||||
|
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $input
|
||||||
|
* @param int|string $search
|
||||||
|
* @param int|string|null $expected_prev
|
||||||
|
* @param int|string|null $expected_next
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testArrayGetNextPrevKey(
|
||||||
|
array $input,
|
||||||
|
int|string $search,
|
||||||
|
int|string|null $expected_prev,
|
||||||
|
int|string|null $expected_next
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_prev,
|
||||||
|
\CoreLibs\Combined\ArrayHandler::arrayGetPrevKey($input, $search),
|
||||||
|
'Find prev key in array'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_next,
|
||||||
|
\CoreLibs\Combined\ArrayHandler::arrayGetNextKey($input, $search),
|
||||||
|
'Find next key in array'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -66,6 +66,34 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* date string convert test
|
||||||
|
*
|
||||||
|
* @covers ::dateStringFormat
|
||||||
|
* @dataProvider timestampProvider
|
||||||
|
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int|float $input
|
||||||
|
* @param bool $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDateStringFormat(
|
||||||
|
$input,
|
||||||
|
bool $flag_show_micro,
|
||||||
|
bool $flag_micro_as_float,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::dateStringFormat(
|
||||||
|
$input,
|
||||||
|
$flag_show_micro,
|
||||||
|
$flag_micro_as_float
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* interval for both directions
|
* interval for both directions
|
||||||
*
|
*
|
||||||
@@ -74,6 +102,11 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
public function intervalProvider(): array
|
public function intervalProvider(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
'on hour' => [
|
||||||
|
3600,
|
||||||
|
false,
|
||||||
|
'1h 0m 0s'
|
||||||
|
],
|
||||||
'interval no microtime' => [
|
'interval no microtime' => [
|
||||||
1641515890,
|
1641515890,
|
||||||
false,
|
false,
|
||||||
@@ -82,7 +115,7 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
'interval with microtime' => [
|
'interval with microtime' => [
|
||||||
1641515890,
|
1641515890,
|
||||||
true,
|
true,
|
||||||
'18999d 0h 38m 10s',
|
'18999d 0h 38m 10s 0ms',
|
||||||
],
|
],
|
||||||
'micro interval no microtime' => [
|
'micro interval no microtime' => [
|
||||||
1641515890.123456,
|
1641515890.123456,
|
||||||
@@ -92,7 +125,7 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
'micro interval with microtime' => [
|
'micro interval with microtime' => [
|
||||||
1641515890.123456,
|
1641515890.123456,
|
||||||
true,
|
true,
|
||||||
'18999d 0h 38m 10s 1235ms',
|
'18999d 0h 38m 10s 124ms',
|
||||||
],
|
],
|
||||||
'negative interval no microtime' => [
|
'negative interval no microtime' => [
|
||||||
-1641515890,
|
-1641515890,
|
||||||
@@ -103,27 +136,27 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
'microtime only' => [
|
'microtime only' => [
|
||||||
0.123456,
|
0.123456,
|
||||||
true,
|
true,
|
||||||
'0s 1235ms',
|
'0s 123ms',
|
||||||
],
|
],
|
||||||
'seconds only' => [
|
'seconds only' => [
|
||||||
30.123456,
|
30.123456,
|
||||||
true,
|
true,
|
||||||
'30s 1235ms',
|
'30s 123ms',
|
||||||
],
|
],
|
||||||
'minutes only' => [
|
'minutes only' => [
|
||||||
90.123456,
|
90.123456,
|
||||||
true,
|
true,
|
||||||
'1m 30s 1235ms',
|
'1m 30s 123ms',
|
||||||
],
|
],
|
||||||
'hours only' => [
|
'hours only' => [
|
||||||
3690.123456,
|
3690.123456,
|
||||||
true,
|
true,
|
||||||
'1h 1m 30s 1235ms',
|
'1h 1m 30s 123ms',
|
||||||
],
|
],
|
||||||
'days only' => [
|
'days only' => [
|
||||||
90090.123456,
|
90090.123456,
|
||||||
true,
|
true,
|
||||||
'1d 1h 1m 30s 1235ms',
|
'1d 1h 1m 30s 123ms',
|
||||||
],
|
],
|
||||||
'already set' => [
|
'already set' => [
|
||||||
'1d 1h 1m 30s 1235ms',
|
'1d 1h 1m 30s 1235ms',
|
||||||
@@ -143,6 +176,306 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* time seconds convert test
|
||||||
|
*
|
||||||
|
* @covers ::timeStringFormat
|
||||||
|
* @dataProvider intervalProvider
|
||||||
|
* @testdox timeStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int|float $input
|
||||||
|
* @param bool $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testTimeStringFormat(string|int|float $input, bool $flag, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::timeStringFormat($input, $flag)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* interval seconds convert
|
||||||
|
*
|
||||||
|
* @covers ::intervalStringFormat
|
||||||
|
* @dataProvider intervalProvider
|
||||||
|
* @testdox intervalStringFormat $input (microtime $show_micro) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int|float $input
|
||||||
|
* @param bool $show_micro
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testIntervalStringFormat(string|int|float $input, bool $show_micro, string $expected): void
|
||||||
|
{
|
||||||
|
// we skip string input, that is not allowed
|
||||||
|
if (is_string($input)) {
|
||||||
|
$this->assertTrue(true, 'Skip strings');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// invalid values throw exception in default
|
||||||
|
if ($input == 999999999999999) {
|
||||||
|
$this->expectException(\LengthException::class);
|
||||||
|
}
|
||||||
|
// below is equal to timeStringFormat
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::intervalStringFormat(
|
||||||
|
$input,
|
||||||
|
show_microseconds: $show_micro,
|
||||||
|
show_only_days: true,
|
||||||
|
skip_zero: false,
|
||||||
|
skip_last_zero: false,
|
||||||
|
truncate_nanoseconds: true,
|
||||||
|
truncate_zero_seconds_if_microseconds: false
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function intervalExtendedProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// A
|
||||||
|
'(60) default value' => [
|
||||||
|
[
|
||||||
|
'seconds' => 60,
|
||||||
|
],
|
||||||
|
'expected' => '1m',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
'(60) default value, skip_last_zero:false' => [
|
||||||
|
[
|
||||||
|
'seconds' => 60,
|
||||||
|
'skip_last_zero' => false,
|
||||||
|
],
|
||||||
|
'expected' => '1m 0s 0ms',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
// B
|
||||||
|
'(120.1) default value' => [
|
||||||
|
[
|
||||||
|
'seconds' => 120.1,
|
||||||
|
],
|
||||||
|
'expected' => '2m 100ms',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
'(120.1) default value, skip_zero:false' => [
|
||||||
|
[
|
||||||
|
'seconds' => 120.1,
|
||||||
|
'skip_zero' => false,
|
||||||
|
],
|
||||||
|
'expected' => '2m 0s 100ms',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
'(120.1) default value, skip_last_zero:false' => [
|
||||||
|
[
|
||||||
|
'seconds' => 120.1,
|
||||||
|
'skip_last_zero' => false,
|
||||||
|
],
|
||||||
|
'expected' => '2m 100ms',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
// C
|
||||||
|
'(3601) default value' => [
|
||||||
|
[
|
||||||
|
'seconds' => 3601,
|
||||||
|
],
|
||||||
|
'expected' => '1h 1s',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
'(3601) default value, skip_zero:false' => [
|
||||||
|
[
|
||||||
|
'seconds' => 3601,
|
||||||
|
'skip_zero' => false,
|
||||||
|
],
|
||||||
|
'expected' => '1h 0m 1s',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
'(3601) default value, skip_last_zero:false' => [
|
||||||
|
[
|
||||||
|
'seconds' => 3601,
|
||||||
|
'skip_last_zero' => false,
|
||||||
|
],
|
||||||
|
'expected' => '1h 1s 0ms',
|
||||||
|
'exception' => null
|
||||||
|
],
|
||||||
|
// TODO create unit tests for ALL edge cases
|
||||||
|
// CREATE abort tests, simple, all others are handled in exception tests
|
||||||
|
'exception: \UnexpectedValueException:1' => [
|
||||||
|
[
|
||||||
|
'seconds' => 99999999999999999999999
|
||||||
|
],
|
||||||
|
'expected' => null,
|
||||||
|
'exception' => [
|
||||||
|
'class' => \UnexpectedValueException::class,
|
||||||
|
'code' => 1,
|
||||||
|
],
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test all options for interval conversion
|
||||||
|
*
|
||||||
|
* @covers ::intervalStringFormat
|
||||||
|
* @dataProvider intervalExtendedProvider
|
||||||
|
* @testdox intervalStringFormat $input will be $expected / $exception [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array<string,null|int|float|bool> $parameter_list
|
||||||
|
* @param string $expected
|
||||||
|
* @param array<string,mixed> $exception
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testExtendedIntervalStringFormat(
|
||||||
|
array $parameter_list,
|
||||||
|
?string $expected,
|
||||||
|
?array $exception
|
||||||
|
): void {
|
||||||
|
if ($expected === null && $exception === null) {
|
||||||
|
$this->assertFalse(true, 'Cannot have expected and exception null in test data');
|
||||||
|
}
|
||||||
|
$parameters = [];
|
||||||
|
foreach (
|
||||||
|
[
|
||||||
|
'seconds' => null,
|
||||||
|
'truncate_after' => '',
|
||||||
|
'natural_seperator' => false,
|
||||||
|
'name_space_seperator' => false,
|
||||||
|
'show_microseconds' => true,
|
||||||
|
'short_time_name' => true,
|
||||||
|
'skip_last_zero' => true,
|
||||||
|
'skip_zero' => true,
|
||||||
|
'show_only_days' => false,
|
||||||
|
'auto_fix_microseconds' => false,
|
||||||
|
'truncate_nanoseconds' => false,
|
||||||
|
'truncate_zero_seconds_if_microseconds' => true,
|
||||||
|
] as $param => $default
|
||||||
|
) {
|
||||||
|
if (empty($parameter_list[$param]) && $default === null) {
|
||||||
|
$this->assertFalse(true, 'Parameter ' . $param . ' is mandatory ');
|
||||||
|
} elseif (!isset($parameter_list[$param]) || $parameter_list[$param] === null) {
|
||||||
|
$parameters[] = $default;
|
||||||
|
} else {
|
||||||
|
$parameters[] = $parameter_list[$param];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
call_user_func_array('CoreLibs\Combined\DateTime::intervalStringFormat', $parameters)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
if (empty($exception['class']) || empty($exception['code'])) {
|
||||||
|
$this->assertFalse(true, 'Exception tests need Exception name and Code');
|
||||||
|
}
|
||||||
|
$this->expectException($exception['class']);
|
||||||
|
$this->expectExceptionCode($exception['code']);
|
||||||
|
// if we have a message, must be regex
|
||||||
|
if (!empty($exception['message'])) {
|
||||||
|
$this->expectExceptionMessageMatches($exception['message']);
|
||||||
|
}
|
||||||
|
call_user_func_array('CoreLibs\Combined\DateTime::intervalStringFormat', $parameters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function exceptionsIntervalProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'UnexpectedValueException: 1 A' => [
|
||||||
|
'seconds' => 99999999999999999999999,
|
||||||
|
'params' => [],
|
||||||
|
'exception' => \UnexpectedValueException::class,
|
||||||
|
'exception_message' => "/^Seconds value is invalid, too large or more than six decimals: /",
|
||||||
|
'excpetion_code' => 1,
|
||||||
|
],
|
||||||
|
'UnexpectedValueException: 1 B' => [
|
||||||
|
'seconds' => 123.1234567,
|
||||||
|
'params' => [],
|
||||||
|
'exception' => \UnexpectedValueException::class,
|
||||||
|
'exception_message' => "/^Seconds value is invalid, too large or more than six decimals: /",
|
||||||
|
'excpetion_code' => 1,
|
||||||
|
],
|
||||||
|
// exception 2 is very likely covered by exception 1
|
||||||
|
'LengthException: 3' => [
|
||||||
|
'seconds' => 999999999999999999,
|
||||||
|
'params' => [
|
||||||
|
'show_only_days',
|
||||||
|
],
|
||||||
|
'exception' => \LengthException::class,
|
||||||
|
'exception_message' => "/^Input seconds value is too large for days output: /",
|
||||||
|
'excpetion_code' => 3,
|
||||||
|
],
|
||||||
|
'UnexpectedValueException: 4' => [
|
||||||
|
'seconds' => 1234567,
|
||||||
|
'params' => [
|
||||||
|
'truncate_after'
|
||||||
|
],
|
||||||
|
'exception' => \UnexpectedValueException::class,
|
||||||
|
'exception_message' => "/^truncate_after has an invalid value: /",
|
||||||
|
'excpetion_code' => 4,
|
||||||
|
],
|
||||||
|
'UnexpectedValueException: 5' => [
|
||||||
|
'seconds' => 1234567,
|
||||||
|
'params' => [
|
||||||
|
'show_only_days:truncate_after'
|
||||||
|
],
|
||||||
|
'exception' => \UnexpectedValueException::class,
|
||||||
|
'exception_message' =>
|
||||||
|
"/^If show_only_days is turned on, the truncate_after cannot be years or months: /",
|
||||||
|
'excpetion_code' => 5,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test all exceptions
|
||||||
|
*
|
||||||
|
* @covers ::intervalStringFormat
|
||||||
|
* @dataProvider exceptionsIntervalProvider
|
||||||
|
* @testdox intervalStringFormat: test Exceptions
|
||||||
|
*
|
||||||
|
* @param int|float $seconds
|
||||||
|
* @param array<string> $params
|
||||||
|
* @param string $exception
|
||||||
|
* @param string $exception_message
|
||||||
|
* @param int $excpetion_code
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testExceptionsIntervalStringFormat(
|
||||||
|
int|float $seconds,
|
||||||
|
array $params,
|
||||||
|
string $exception,
|
||||||
|
string $exception_message,
|
||||||
|
int $excpetion_code,
|
||||||
|
): void {
|
||||||
|
$this->expectException($exception);
|
||||||
|
$this->expectExceptionMessageMatches($exception_message);
|
||||||
|
$this->expectExceptionCode($excpetion_code);
|
||||||
|
if (empty($params)) {
|
||||||
|
\CoreLibs\Combined\DateTime::intervalStringFormat($seconds);
|
||||||
|
} else {
|
||||||
|
if (in_array('show_only_days', $params)) {
|
||||||
|
\CoreLibs\Combined\DateTime::intervalStringFormat($seconds, show_only_days:true);
|
||||||
|
} elseif (in_array('truncate_after', $params)) {
|
||||||
|
\CoreLibs\Combined\DateTime::intervalStringFormat($seconds, truncate_after: 'v');
|
||||||
|
} elseif (in_array('show_only_days:truncate_after', $params)) {
|
||||||
|
\CoreLibs\Combined\DateTime::intervalStringFormat($seconds, show_only_days:true, truncate_after: 'y');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -203,6 +536,25 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::stringToTime
|
||||||
|
* @dataProvider reverseIntervalProvider
|
||||||
|
* @testdox stringToTime $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int|float $input
|
||||||
|
* @param string|int|float $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringToTime($input, $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::stringToTime($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -238,6 +590,25 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkDate
|
||||||
|
* @dataProvider dateProvider
|
||||||
|
* @testdox checkDate $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckDate(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::checkDate($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -297,6 +668,25 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkDateTime
|
||||||
|
* @dataProvider dateTimeProvider
|
||||||
|
* @testdox checkDateTime $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckDateTime(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::checkDateTime($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -371,6 +761,37 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::compareDate
|
||||||
|
* @dataProvider dateCompareProvider
|
||||||
|
* @testdox compareDate $input_a compared to $input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input_a
|
||||||
|
* @param string $input_b
|
||||||
|
* @param int|bool $expected
|
||||||
|
* @param string|null $exception
|
||||||
|
* @param int|null $exception_code
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCompareDate(
|
||||||
|
string $input_a,
|
||||||
|
string $input_b,
|
||||||
|
int|bool $expected,
|
||||||
|
?string $exception,
|
||||||
|
?int $exception_code
|
||||||
|
): void {
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException($exception);
|
||||||
|
$this->expectExceptionCode($exception_code);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::compareDate($input_a, $input_b)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -466,6 +887,37 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::compareDateTime
|
||||||
|
* @dataProvider dateTimeCompareProvider
|
||||||
|
* @testdox compareDateTime $input_a compared to $input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input_a
|
||||||
|
* @param string $input_b
|
||||||
|
* @param int|bool $expected
|
||||||
|
* @param string|null $exception
|
||||||
|
* @param int|null $exception_code
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCompareDateTime(
|
||||||
|
string $input_a,
|
||||||
|
string $input_b,
|
||||||
|
int|bool $expected,
|
||||||
|
?string $exception,
|
||||||
|
?int $exception_code
|
||||||
|
): void {
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException($exception);
|
||||||
|
$this->expectExceptionCode($exception_code);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::compareDateTime($input_a, $input_b)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -520,214 +972,6 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function dateRangeHasWeekendProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'no weekend' => [
|
|
||||||
'2023-07-03',
|
|
||||||
'2023-07-04',
|
|
||||||
false
|
|
||||||
],
|
|
||||||
'start weekend sat' => [
|
|
||||||
'2023-07-01',
|
|
||||||
'2023-07-04',
|
|
||||||
true
|
|
||||||
],
|
|
||||||
'start weekend sun' => [
|
|
||||||
'2023-07-02',
|
|
||||||
'2023-07-04',
|
|
||||||
true
|
|
||||||
],
|
|
||||||
'end weekend sat' => [
|
|
||||||
'2023-07-03',
|
|
||||||
'2023-07-08',
|
|
||||||
true
|
|
||||||
],
|
|
||||||
'end weekend sun' => [
|
|
||||||
'2023-07-03',
|
|
||||||
'2023-07-09',
|
|
||||||
true
|
|
||||||
],
|
|
||||||
'long period > 6 days' => [
|
|
||||||
'2023-07-03',
|
|
||||||
'2023-07-27',
|
|
||||||
true
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* date string convert test
|
|
||||||
*
|
|
||||||
* @covers ::dateStringFormat
|
|
||||||
* @dataProvider timestampProvider
|
|
||||||
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param int|float $input
|
|
||||||
* @param bool $flag
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testDateStringFormat(
|
|
||||||
$input,
|
|
||||||
bool $flag_show_micro,
|
|
||||||
bool $flag_micro_as_float,
|
|
||||||
string $expected
|
|
||||||
): void {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::dateStringFormat(
|
|
||||||
$input,
|
|
||||||
$flag_show_micro,
|
|
||||||
$flag_micro_as_float
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* interval convert test
|
|
||||||
*
|
|
||||||
* @covers ::timeStringFormat
|
|
||||||
* @dataProvider intervalProvider
|
|
||||||
* @testdox timeStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param int|float $input
|
|
||||||
* @param bool $flag
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testTimeStringFormat($input, bool $flag, string $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::timeStringFormat($input, $flag)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::stringToTime
|
|
||||||
* @dataProvider reverseIntervalProvider
|
|
||||||
* @testdox stringToTime $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|int|float $input
|
|
||||||
* @param string|int|float $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testStringToTime($input, $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::stringToTime($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::checkDate
|
|
||||||
* @dataProvider dateProvider
|
|
||||||
* @testdox checkDate $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @param bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCheckDate(string $input, bool $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::checkDate($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::checkDateTime
|
|
||||||
* @dataProvider dateTimeProvider
|
|
||||||
* @testdox checkDateTime $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @param bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCheckDateTime(string $input, bool $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::checkDateTime($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::compareDate
|
|
||||||
* @dataProvider dateCompareProvider
|
|
||||||
* @testdox compareDate $input_a compared to $input_b will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input_a
|
|
||||||
* @param string $input_b
|
|
||||||
* @param int|bool $expected
|
|
||||||
* @param string|null $exception
|
|
||||||
* @param int|null $exception_code
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCompareDate(
|
|
||||||
string $input_a,
|
|
||||||
string $input_b,
|
|
||||||
int|bool $expected,
|
|
||||||
?string $exception,
|
|
||||||
?int $exception_code
|
|
||||||
): void {
|
|
||||||
if ($expected === false) {
|
|
||||||
$this->expectException($exception);
|
|
||||||
$this->expectExceptionCode($exception_code);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::compareDate($input_a, $input_b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::compareDateTime
|
|
||||||
* @dataProvider dateTimeCompareProvider
|
|
||||||
* @testdox compareDateTime $input_a compared to $input_b will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input_a
|
|
||||||
* @param string $input_b
|
|
||||||
* @param int|bool $expected
|
|
||||||
* @param string|null $exception
|
|
||||||
* @param int|null $exception_code
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCompareDateTime(
|
|
||||||
string $input_a,
|
|
||||||
string $input_b,
|
|
||||||
int|bool $expected,
|
|
||||||
?string $exception,
|
|
||||||
?int $exception_code
|
|
||||||
): void {
|
|
||||||
if ($expected === false) {
|
|
||||||
$this->expectException($exception);
|
|
||||||
$this->expectExceptionCode($exception_code);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::compareDateTime($input_a, $input_b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -906,6 +1150,47 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function dateRangeHasWeekendProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'no weekend' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-04',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'start weekend sat' => [
|
||||||
|
'2023-07-01',
|
||||||
|
'2023-07-04',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'start weekend sun' => [
|
||||||
|
'2023-07-02',
|
||||||
|
'2023-07-04',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'end weekend sat' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-08',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'end weekend sun' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-09',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'long period > 6 days' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-27',
|
||||||
|
true
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -253,7 +253,8 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testHumanReadableByteFormatException(int $flag): void
|
public function testHumanReadableByteFormatException(int $flag): void
|
||||||
{
|
{
|
||||||
$this->expectException(\Exception::class);
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionCode(1);
|
||||||
\CoreLibs\Convert\Byte::humanReadableByteFormat(12, $flag);
|
\CoreLibs\Convert\Byte::humanReadableByteFormat(12, $flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,7 +273,8 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testStringByteFormatException(int $flag): void
|
public function testStringByteFormatException(int $flag): void
|
||||||
{
|
{
|
||||||
$this->expectException(\Exception::class);
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionCode(1);
|
||||||
\CoreLibs\Convert\Byte::stringByteFormat(12, $flag);
|
\CoreLibs\Convert\Byte::stringByteFormat(12, $flag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,6 +256,80 @@ final class CoreLibsConvertStringsTest extends TestCase
|
|||||||
$output
|
$output
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* provider for testStripMultiplePathSlashes
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function stripMultiplePathSlashesProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'no slahses' => [
|
||||||
|
'input' => 'string_abc',
|
||||||
|
'expected' => 'string_abc',
|
||||||
|
],
|
||||||
|
'one slash' => [
|
||||||
|
'input' => 'some/foo',
|
||||||
|
'expected' => 'some/foo',
|
||||||
|
],
|
||||||
|
'two slashes' => [
|
||||||
|
'input' => 'some//foo',
|
||||||
|
'expected' => 'some/foo',
|
||||||
|
],
|
||||||
|
'three slashes' => [
|
||||||
|
'input' => 'some///foo',
|
||||||
|
'expected' => 'some/foo',
|
||||||
|
],
|
||||||
|
'slashes in front' => [
|
||||||
|
'input' => '/foo',
|
||||||
|
'expected' => '/foo',
|
||||||
|
],
|
||||||
|
'two slashes in front' => [
|
||||||
|
'input' => '//foo',
|
||||||
|
'expected' => '/foo',
|
||||||
|
],
|
||||||
|
'thee slashes in front' => [
|
||||||
|
'input' => '///foo',
|
||||||
|
'expected' => '/foo',
|
||||||
|
],
|
||||||
|
'slashes in back' => [
|
||||||
|
'input' => 'foo/',
|
||||||
|
'expected' => 'foo/',
|
||||||
|
],
|
||||||
|
'two slashes in back' => [
|
||||||
|
'input' => 'foo//',
|
||||||
|
'expected' => 'foo/',
|
||||||
|
],
|
||||||
|
'thee slashes in back' => [
|
||||||
|
'input' => 'foo///',
|
||||||
|
'expected' => 'foo/',
|
||||||
|
],
|
||||||
|
'multiple slashes' => [
|
||||||
|
'input' => '/foo//bar///string/end_times',
|
||||||
|
'expected' => '/foo/bar/string/end_times',
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test multiple slashes clean up
|
||||||
|
*
|
||||||
|
* @covers ::stripMultiplePathSlashes
|
||||||
|
* @dataProvider stripMultiplePathSlashesProvider
|
||||||
|
* @testdox stripMultiplePathSlashes $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStripMultiplePathSlashes(string $input, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Strings::stripMultiplePathSlashes($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$error,
|
$error,
|
||||||
$last_error,
|
$last_error,
|
||||||
'Assert query warning'
|
'Assert query error'
|
||||||
);
|
);
|
||||||
return [$last_warning, $last_error];
|
return [$last_warning, $last_error];
|
||||||
}
|
}
|
||||||
@@ -251,8 +251,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testDbVersion(): void
|
public function testDbVersion(): void
|
||||||
{
|
{
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -276,8 +274,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testDbVersionNumeric(): void
|
public function testDbVersionNumeric(): void
|
||||||
{
|
{
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -306,8 +302,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testDbVersionInfoParameters(): void
|
public function testDbVersionInfoParameters(): void
|
||||||
{
|
{
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -365,8 +359,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testDbVersionInfo(string $parameter, string $expected): void
|
public function testDbVersionInfo(string $parameter, string $expected): void
|
||||||
{
|
{
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -1592,8 +1584,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $error,
|
string $error,
|
||||||
bool $run_many_times = false
|
bool $run_many_times = false
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -1832,8 +1822,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $error,
|
string $error,
|
||||||
string $insert_data
|
string $insert_data
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -2002,8 +1990,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $error,
|
string $error,
|
||||||
string $insert_data
|
string $insert_data
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -3069,8 +3055,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $error,
|
string $error,
|
||||||
string $insert_data
|
string $insert_data
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -3465,7 +3449,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
$read_query,
|
$read_query,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
//
|
// warning: 20
|
||||||
true, '20', '',
|
true, '20', '',
|
||||||
//
|
//
|
||||||
'result', '', '',
|
'result', '', '',
|
||||||
@@ -3482,6 +3466,31 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
'returning_id' => false,
|
'returning_id' => false,
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
// prepare with different statement name
|
||||||
|
'prepare query with same statement name, different query' => [
|
||||||
|
'double_error',
|
||||||
|
$read_query,
|
||||||
|
// primary key
|
||||||
|
null,
|
||||||
|
// arguments (none)
|
||||||
|
null,
|
||||||
|
// expected return false, warning: no, error: 26
|
||||||
|
false, '', '26',
|
||||||
|
// return expected, warning, error
|
||||||
|
'', '', '',
|
||||||
|
// dummy query for second prepare with wrong query
|
||||||
|
$read_query . ' WHERE uid = $3',
|
||||||
|
[],
|
||||||
|
//
|
||||||
|
$insert_query,
|
||||||
|
//
|
||||||
|
[
|
||||||
|
'pk_name' => '',
|
||||||
|
'count' => 0,
|
||||||
|
'query' => 'SELECT row_int, uid FROM table_with_primary_key',
|
||||||
|
'returning_id' => false,
|
||||||
|
],
|
||||||
|
],
|
||||||
// insert wrong data count compared to needed (execute 23)
|
// insert wrong data count compared to needed (execute 23)
|
||||||
'wrong parmeter count' => [
|
'wrong parmeter count' => [
|
||||||
'wrong_param_count',
|
'wrong_param_count',
|
||||||
@@ -3554,8 +3563,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $insert_data,
|
string $insert_data,
|
||||||
array $prepare_cursor,
|
array $prepare_cursor,
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -3575,6 +3582,9 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
$db->dbPrepare($stm_name, $query) :
|
$db->dbPrepare($stm_name, $query) :
|
||||||
$db->dbPrepare($stm_name, $query, $pk_name);
|
$db->dbPrepare($stm_name, $query, $pk_name);
|
||||||
}
|
}
|
||||||
|
if ($error_prepare == '26') {
|
||||||
|
$prepare_result = $db->dbPrepare($stm_name, $expected_data_query);
|
||||||
|
}
|
||||||
// if result type, or if forced bool
|
// if result type, or if forced bool
|
||||||
if (is_string($expected_prepare) && $expected_prepare == 'result') {
|
if (is_string($expected_prepare) && $expected_prepare == 'result') {
|
||||||
// if PHP or newer, must be Object PgSql\Result
|
// if PHP or newer, must be Object PgSql\Result
|
||||||
@@ -3597,66 +3607,68 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
|
|
||||||
// for non fail prepare test exec
|
// for non fail prepare test exec
|
||||||
// check test result
|
// check test result
|
||||||
$execute_result = $query_data === null ?
|
if (!$error_prepare) {
|
||||||
$db->dbExecute($stm_name) :
|
$execute_result = $query_data === null ?
|
||||||
$db->dbExecute($stm_name, $query_data);
|
$db->dbExecute($stm_name) :
|
||||||
if ($expected_execute == 'result') {
|
$db->dbExecute($stm_name, $query_data);
|
||||||
// if PHP or newer, must be Object PgSql\Result
|
if ($expected_execute == 'result') {
|
||||||
$this->assertIsObject(
|
// if PHP or newer, must be Object PgSql\Result
|
||||||
$execute_result
|
$this->assertIsObject(
|
||||||
);
|
$execute_result
|
||||||
// also check that this is correct instance type
|
);
|
||||||
$this->assertInstanceOf(
|
// also check that this is correct instance type
|
||||||
'PgSql\Result',
|
$this->assertInstanceOf(
|
||||||
$execute_result
|
'PgSql\Result',
|
||||||
);
|
$execute_result
|
||||||
// if this is an select use dbFetchArray to get data and test
|
);
|
||||||
} else {
|
// if this is an select use dbFetchArray to get data and test
|
||||||
$this->assertEquals(
|
} else {
|
||||||
$expected_execute,
|
$this->assertEquals(
|
||||||
$execute_result
|
$expected_execute,
|
||||||
);
|
$execute_result
|
||||||
}
|
);
|
||||||
// error/warning check
|
}
|
||||||
$this->subAssertErrorTest($db, $warning_execute, $error_execute);
|
// error/warning check
|
||||||
// now check test result if expected return is result
|
$this->subAssertErrorTest($db, $warning_execute, $error_execute);
|
||||||
if (
|
// now check test result if expected return is result
|
||||||
$expected_execute == 'result' &&
|
if (
|
||||||
!empty($expected_data_query)
|
$expected_execute == 'result' &&
|
||||||
) {
|
!empty($expected_data_query)
|
||||||
// $expected_data_query
|
) {
|
||||||
// $expected_data
|
// $expected_data_query
|
||||||
$rows = $db->dbReturnArray($expected_data_query);
|
// $expected_data
|
||||||
$this->assertEquals(
|
$rows = $db->dbReturnArray($expected_data_query);
|
||||||
$expected_data,
|
$this->assertEquals(
|
||||||
$rows
|
$expected_data,
|
||||||
);
|
$rows
|
||||||
}
|
);
|
||||||
if (
|
}
|
||||||
$expected_execute == 'result' &&
|
if (
|
||||||
$execute_result !== false &&
|
$expected_execute == 'result' &&
|
||||||
empty($expected_data_query) &&
|
$execute_result !== false &&
|
||||||
count($expected_data)
|
empty($expected_data_query) &&
|
||||||
) {
|
count($expected_data)
|
||||||
// compare previously read data to compare data
|
) {
|
||||||
$compare_data = [];
|
// compare previously read data to compare data
|
||||||
// read in the query data
|
$compare_data = [];
|
||||||
while (is_array($row = $db->dbFetchArray($execute_result, true))) {
|
// read in the query data
|
||||||
$compare_data[] = $row;
|
while (is_array($row = $db->dbFetchArray($execute_result, true))) {
|
||||||
|
$compare_data[] = $row;
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_data,
|
||||||
|
$compare_data
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$this->assertEquals(
|
|
||||||
$expected_data,
|
|
||||||
$compare_data
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// check dbGetPrepareCursorValue
|
// check dbGetPrepareCursorValue
|
||||||
foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) {
|
foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$prepare_cursor[$key],
|
$prepare_cursor[$key],
|
||||||
$db->dbGetPrepareCursorValue($stm_name, $key),
|
$db->dbGetPrepareCursorValue($stm_name, $key),
|
||||||
'Prepared cursor: ' . $key . ': failed assertion'
|
'Prepared cursor: ' . $key . ': failed assertion'
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset all data
|
// reset all data
|
||||||
@@ -3844,8 +3856,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $expected_get_var,
|
string $expected_get_var,
|
||||||
string $expected_get_db
|
string $expected_get_db
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config[$connection],
|
self::$db_config[$connection],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -3910,7 +3920,10 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
// 'main::run::run::run::run::run::run::run::runBare::runTest::testDbErrorHandling::dbSetMaxQueryCall
|
// 'main::run::run::run::run::run::run::run::runBare::runTest::testDbErrorHandling::dbSetMaxQueryCall
|
||||||
'source' => "/^(include::)?main::(run::)+runBare::runTest::testDbErrorHandling::dbSetMaxQueryCall$/",
|
'source' => "/^(include::)?main::(run::)+runBare::runTest::testDbErrorHandling::dbSetMaxQueryCall$/",
|
||||||
'pg_error' => '',
|
'pg_error' => '',
|
||||||
'msg' => '',
|
'message' => '',
|
||||||
|
'context' => [
|
||||||
|
'max_calls' => 0
|
||||||
|
]
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'trigger warning' => [
|
'trigger warning' => [
|
||||||
@@ -3943,8 +3956,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $error_id,
|
string $error_id,
|
||||||
array $expected_history
|
array $expected_history
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -3970,7 +3981,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
foreach ($expected_history as $key => $value) {
|
foreach ($expected_history as $key => $value) {
|
||||||
// check if starts with / because this is regex (timestamp)
|
// check if starts with / because this is regex (timestamp)
|
||||||
// if (substr($expected_2, 0, 1) == '/) {
|
// if (substr($expected_2, 0, 1) == '/) {
|
||||||
if (strpos($value, '/') === 0) {
|
if (!is_array($value) && strpos($value, '/') === 0) {
|
||||||
// this is regex
|
// this is regex
|
||||||
$this->assertMatchesRegularExpression(
|
$this->assertMatchesRegularExpression(
|
||||||
$value,
|
$value,
|
||||||
@@ -4058,8 +4069,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
bool $expected_set_flag,
|
bool $expected_set_flag,
|
||||||
string $expected_get_encoding
|
string $expected_get_encoding
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config[$connection],
|
self::$db_config[$connection],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -4141,8 +4150,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
?string $encoding_php,
|
?string $encoding_php,
|
||||||
string $text
|
string $text
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config[$connection],
|
self::$db_config[$connection],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -4272,8 +4279,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $table,
|
string $table,
|
||||||
string $primary_key
|
string $primary_key
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -4330,7 +4335,7 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
// NOTE if there are different INSERTS before the primary keys
|
// NOTE if there are different INSERTS before the primary keys
|
||||||
// will not match anymore. Must be updated by hand
|
// will not match anymore. Must be updated by hand
|
||||||
// IMPORTANT: if this is stand alone the primary key will not match and fail
|
// IMPORTANT: if this is stand alone the primary key will not match and fail
|
||||||
$table_with_primary_key_id = 68;
|
$table_with_primary_key_id = 70;
|
||||||
// 0: query + returning
|
// 0: query + returning
|
||||||
// 1: params
|
// 1: params
|
||||||
// 1: pk name for db exec
|
// 1: pk name for db exec
|
||||||
@@ -4530,8 +4535,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
array|string|int|null $expected_ret_ext,
|
array|string|int|null $expected_ret_ext,
|
||||||
array $expected_ret_arr
|
array $expected_ret_arr
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -4875,8 +4878,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
array $expected_col_names,
|
array $expected_col_names,
|
||||||
array $expected_col_types
|
array $expected_col_types
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
@@ -5030,6 +5031,147 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
$db->dbClose();
|
$db->dbClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// query placeholder convert
|
||||||
|
|
||||||
|
public function queryPlaceholderReplaceProvider(): array
|
||||||
|
{
|
||||||
|
// WHERE row_varchar = $1
|
||||||
|
return [
|
||||||
|
'select, no change' => [
|
||||||
|
'query' => <<<SQL
|
||||||
|
SELECT row_varchar, row_varchar_literal, row_int, row_date
|
||||||
|
FROM table_with_primary_key
|
||||||
|
SQL,
|
||||||
|
'params' => [],
|
||||||
|
'found' => 0,
|
||||||
|
'expected_query' => '',
|
||||||
|
'expected_params' => [],
|
||||||
|
],
|
||||||
|
'select, params ?' => [
|
||||||
|
'query' => <<<SQL
|
||||||
|
SELECT row_varchar, row_varchar_literal, row_int, row_date
|
||||||
|
FROM table_with_primary_key
|
||||||
|
WHERE row_varchar = ?
|
||||||
|
SQL,
|
||||||
|
'params' => ['string a'],
|
||||||
|
'found' => 1,
|
||||||
|
'expected_query' => <<<SQL
|
||||||
|
SELECT row_varchar, row_varchar_literal, row_int, row_date
|
||||||
|
FROM table_with_primary_key
|
||||||
|
WHERE row_varchar = $1
|
||||||
|
SQL,
|
||||||
|
'expected_params' => ['string a'],
|
||||||
|
],
|
||||||
|
'select, params :' => [
|
||||||
|
'query' => <<<SQL
|
||||||
|
SELECT row_varchar, row_varchar_literal, row_int, row_date
|
||||||
|
FROM table_with_primary_key
|
||||||
|
WHERE row_varchar = :row_varchar
|
||||||
|
SQL,
|
||||||
|
'params' => [':row_varchar' => 'string a'],
|
||||||
|
'found' => 1,
|
||||||
|
'expected_query' => <<<SQL
|
||||||
|
SELECT row_varchar, row_varchar_literal, row_int, row_date
|
||||||
|
FROM table_with_primary_key
|
||||||
|
WHERE row_varchar = $1
|
||||||
|
SQL,
|
||||||
|
'expected_params' => ['string a'],
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test query string with placeholders convert
|
||||||
|
*
|
||||||
|
* @dataProvider queryPlaceholderReplaceProvider
|
||||||
|
* @testdox Query replacement test [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array $params
|
||||||
|
* @param string $expected_query
|
||||||
|
* @param array $expected_params
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testQueryPlaceholderReplace(
|
||||||
|
string $query,
|
||||||
|
array $params,
|
||||||
|
int $expected_found,
|
||||||
|
string $expected_query,
|
||||||
|
array $expected_params
|
||||||
|
): void {
|
||||||
|
$db = new \CoreLibs\DB\IO(
|
||||||
|
self::$db_config['valid'],
|
||||||
|
self::$log
|
||||||
|
);
|
||||||
|
$db->dbSetConvertPlaceholder(true);
|
||||||
|
//
|
||||||
|
if ($db->dbCheckQueryForSelect($query)) {
|
||||||
|
$res = $db->dbReturnRowParams($query, $params);
|
||||||
|
$converted = $db->dbGetPlaceholderConverted();
|
||||||
|
} else {
|
||||||
|
$db->dbExecParams($query, $params);
|
||||||
|
$converted = $db->dbGetPlaceholderConverted();
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_found,
|
||||||
|
$converted['found'],
|
||||||
|
'Found not equal'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_query,
|
||||||
|
$converted['query'],
|
||||||
|
'Query not equal'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_params,
|
||||||
|
$converted['params'],
|
||||||
|
'Params not equal'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test exception for placeholder convert
|
||||||
|
* -> internally converted to error
|
||||||
|
*
|
||||||
|
* @testdox Query Replace error tests
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testQueryPlaceholderReplaceException(): void
|
||||||
|
{
|
||||||
|
$db = new \CoreLibs\DB\IO(
|
||||||
|
self::$db_config['valid'],
|
||||||
|
self::$log
|
||||||
|
);
|
||||||
|
$db->dbSetConvertPlaceholder(true);
|
||||||
|
$db->dbExecParams(
|
||||||
|
<<<SQL
|
||||||
|
SELECT foo FROM bar
|
||||||
|
WHERE a = ? and b = :bname
|
||||||
|
SQL,
|
||||||
|
['a', 'b']
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
200,
|
||||||
|
$db->dbGetLastError()
|
||||||
|
);
|
||||||
|
|
||||||
|
// catch unset, for :names
|
||||||
|
$db->dbExecParams(
|
||||||
|
<<<SQL
|
||||||
|
SELECT foo FROM bar
|
||||||
|
WHERE a = :aname and b = :bname
|
||||||
|
SQL,
|
||||||
|
[':foo' => 'a', ':bname' => 'b']
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
210,
|
||||||
|
$db->dbGetLastError()
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO: other way around for to pdo
|
||||||
|
}
|
||||||
|
|
||||||
// TODO implement below checks
|
// TODO implement below checks
|
||||||
// - complex write sets
|
// - complex write sets
|
||||||
// dbWriteData, dbWriteDataExt
|
// dbWriteData, dbWriteDataExt
|
||||||
@@ -5158,8 +5300,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
string $warning_final,
|
string $warning_final,
|
||||||
string $error_final
|
string $error_final
|
||||||
): void {
|
): void {
|
||||||
// self::$log->setLogLevelAll('debug', true);
|
|
||||||
// self::$log->setLogLevelAll('print', true);
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
|
|||||||
@@ -513,7 +513,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
public function testGetCallerMethodList(array $expected): void
|
public function testGetCallerMethodList(array $expected): void
|
||||||
{
|
{
|
||||||
$compare = Support::getCallerMethodList();
|
$compare = Support::getCallerMethodList();
|
||||||
// 10: legact
|
// 10: legacy
|
||||||
// 11: direct
|
// 11: direct
|
||||||
// 12: full call
|
// 12: full call
|
||||||
switch (count($compare)) {
|
switch (count($compare)) {
|
||||||
@@ -571,6 +571,31 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallStack
|
||||||
|
* @testdox getCallStack check if it returns data [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallStack(): void
|
||||||
|
{
|
||||||
|
$call_stack = Support::getCallStack();
|
||||||
|
// print "Get CALL: " . print_r(Support::getCallStack(), true) . "\n";
|
||||||
|
if ($call_stack < 8) {
|
||||||
|
$this->assertFalse(true, 'getCallStack too low: 8');
|
||||||
|
} else {
|
||||||
|
$this->assertTrue(true, 'getCallSteck ok');
|
||||||
|
}
|
||||||
|
// just test top entry
|
||||||
|
$first = array_shift($call_stack);
|
||||||
|
$this->assertStringEndsWith(
|
||||||
|
':tests\CoreLibsDebugSupportTest->testGetCallStack',
|
||||||
|
$first,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test the lowest one (one above base)
|
* test the lowest one (one above base)
|
||||||
*
|
*
|
||||||
|
|||||||
1
www/vendor/egrajp/smarty-extended/.gitignore
vendored
1
www/vendor/egrajp/smarty-extended/.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
vendor
|
vendor
|
||||||
|
composer.lock
|
||||||
|
|||||||
46
www/vendor/egrajp/smarty-extended/ReadMe.md
vendored
Normal file
46
www/vendor/egrajp/smarty-extended/ReadMe.md
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Composer package from Smarty Extended
|
||||||
|
|
||||||
|
This is an updated package for smarty\smarty
|
||||||
|
|
||||||
|
Adds:
|
||||||
|
|
||||||
|
- translation block
|
||||||
|
- label and pos for checkboxes and radio buttons
|
||||||
|
|
||||||
|
For local install only
|
||||||
|
|
||||||
|
## Setup from central composer
|
||||||
|
|
||||||
|
Setup from gitea internal servers
|
||||||
|
|
||||||
|
```sh
|
||||||
|
composer config repositories.git.egplusww.jp.Composer composer https://git.egplusww.jp/api/packages/Composer/composer
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternative setup composer local zip file repot:
|
||||||
|
`composer config repositories.composer.egplusww.jp composer http://composer.egplusww.jp`
|
||||||
|
|
||||||
|
## Install package
|
||||||
|
|
||||||
|
`composer require egrajp/smarty-extended:^4.3`
|
||||||
|
|
||||||
|
## How to update
|
||||||
|
|
||||||
|
1) update the original composer for ^4.3
|
||||||
|
2) copy over the src/sysplugins and all base files in src/
|
||||||
|
3) check either function.html_checkboxes.php and function.html_options.php have changed
|
||||||
|
4) copy src/plugins except the above two files, be sure to keep the block.t.php and function_popup*.php
|
||||||
|
5) Create new release version as official relase number
|
||||||
|
|
||||||
|
## Updated files (different from master)
|
||||||
|
|
||||||
|
### New
|
||||||
|
|
||||||
|
`src/plugins/block.t.php`
|
||||||
|
`src/plugins/function_popup.php`
|
||||||
|
`src/plugins/function_popup.init.php`
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
`src/plugins/function.html_checkboxes.php`
|
||||||
|
`src/plugins/function.html_options.php`
|
||||||
@@ -8,9 +8,9 @@
|
|||||||
"homepage": "https://github.com/smarty-php/smarty/",
|
"homepage": "https://github.com/smarty-php/smarty/",
|
||||||
"license": "LGPL-3.0",
|
"license": "LGPL-3.0",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"classmap": [
|
||||||
"Smarty\\": "src/"
|
"src/"
|
||||||
}
|
]
|
||||||
},
|
},
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
|||||||
1
www/vendor/egrajp/smarty-extended/publish/.gitignore
vendored
Normal file
1
www/vendor/egrajp/smarty-extended/publish/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.env*
|
||||||
1
www/vendor/egrajp/smarty-extended/publish/last.published
vendored
Normal file
1
www/vendor/egrajp/smarty-extended/publish/last.published
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
4.3.4
|
||||||
1
www/vendor/egrajp/smarty-extended/publish/package-download/.gitignore
vendored
Normal file
1
www/vendor/egrajp/smarty-extended/publish/package-download/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.zip
|
||||||
88
www/vendor/egrajp/smarty-extended/publish/publish.sh
vendored
Executable file
88
www/vendor/egrajp/smarty-extended/publish/publish.sh
vendored
Executable file
@@ -0,0 +1,88 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
BASE_FOLDER=$(dirname $(readlink -f $0))"/";
|
||||||
|
PACKAGE_DOWNLOAD="${BASE_FOLDER}package-download/";
|
||||||
|
if [ ! -d "${PACKAGE_DOWNLOAD}" ]; then
|
||||||
|
mkdir "${PACKAGE_DOWNLOAD}";
|
||||||
|
fi;
|
||||||
|
VERSION=$(git tag --list | sort -V | tail -n1 | sed -e "s/^v//");
|
||||||
|
file_last_published="${BASE_FOLDER}last.published";
|
||||||
|
go_flag="$1";
|
||||||
|
|
||||||
|
if [ -z "${VERSION}" ]; then
|
||||||
|
echo "Version must be set in the form x.y.z without any leading characters";
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
# compare version, if different or newer, deploy
|
||||||
|
if [ -f "${file_last_published}" ]; then
|
||||||
|
LAST_PUBLISHED_VERSION=$(cat ${file_last_published});
|
||||||
|
if $(dpkg --compare-versions "${VERSION}" le "${LAST_PUBLISHED_VERSION}"); then
|
||||||
|
echo "git tag version ${VERSION} is not newer than previous published version ${LAST_PUBLISHED_VERSION}";
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# read in the .env.deploy file and we must have
|
||||||
|
# GITEA_UPLOAD_FILENAME
|
||||||
|
# GITLAB_USER
|
||||||
|
# GITLAB_TOKEN
|
||||||
|
# GITLAB_URL
|
||||||
|
# GITEA_USER
|
||||||
|
# GITEA_DEPLOY_TOKEN
|
||||||
|
# GITEA_URL_DL
|
||||||
|
# GITEA_URL_PUSH
|
||||||
|
if [ ! -f "${BASE_FOLDER}.env.deploy" ]; then
|
||||||
|
echo "Deploy enviroment file .env.deploy is missing";
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
set -o allexport;
|
||||||
|
cd ${BASE_FOLDER};
|
||||||
|
source .env.deploy;
|
||||||
|
cd -;
|
||||||
|
set +o allexport;
|
||||||
|
|
||||||
|
if [ "${go_flag}" != "go" ]; then
|
||||||
|
echo "No go flag given";
|
||||||
|
echo "Would publish ${VERSION}";
|
||||||
|
echo "[END]";
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
echo "[START]";
|
||||||
|
# gitea
|
||||||
|
if [ ! -z "${GITEA_UPLOAD_FILENAME}" ] &&
|
||||||
|
[ ! -z "${GITEA_URL_DL}" ] && [ ! -z "${GITEA_URL_PUSH}" ] &&
|
||||||
|
[ ! -z "${GITEA_USER}" ] && [ ! -z "${GITEA_TOKEN}" ]; then
|
||||||
|
curl -LJO \
|
||||||
|
--output-dir "${PACKAGE_DOWNLOAD}" \
|
||||||
|
${GITEA_URL_DL}/v${VERSION}.zip;
|
||||||
|
# echo "curl -LJO \
|
||||||
|
# --output-dir "${PACKAGE_DOWNLOAD}" \
|
||||||
|
# ${GITEA_URL_DL}/v${VERSION}.zip;"
|
||||||
|
curl --user ${GITEA_USER}:${GITEA_TOKEN} \
|
||||||
|
--upload-file "${PACKAGE_DOWNLOAD}${GITEA_UPLOAD_FILENAME}-v${VERSION}.zip" \
|
||||||
|
${GITEA_URL_PUSH}?version=${VERSION};
|
||||||
|
# echo "curl --user ${GITEA_USER}:${GITEA_TOKEN} \
|
||||||
|
# --upload-file "${PACKAGE_DOWNLOAD}${GITEA_UPLOAD_FILENAME}-v${VERSION}.zip" \
|
||||||
|
# ${GITEA_URL_PUSH}?version=${VERSION};"
|
||||||
|
echo "${VERSION}" > "${file_last_published}";
|
||||||
|
else
|
||||||
|
echo "Missing either GITEA_UPLOAD_FILENAME, GITEA_URL_DL, GITEA_URL_PUSH, GITEA_USER or GITEA_TOKEN environment variable";
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# gitlab
|
||||||
|
if [ ! -z "${GITLAB_URL}" ] && [ ! -z "${GITLAB_DEPLOY_TOKEN}" ]; then
|
||||||
|
curl --data tag=v${VERSION} \
|
||||||
|
--header "Deploy-Token: ${GITLAB_DEPLOY_TOKEN}" \
|
||||||
|
"${GITLAB_URL}";
|
||||||
|
curl --data branch=master \
|
||||||
|
--header "Deploy-Token: ${GITLAB_DEPLOY_TOKEN}" \
|
||||||
|
"${GITLAB_URL}";
|
||||||
|
echo "${VERSION}" > "${file_last_published}";
|
||||||
|
else
|
||||||
|
echo "Missing GITLAB_DEPLOY_TOKEN environment variable";
|
||||||
|
fi;
|
||||||
|
echo "";
|
||||||
|
echo "[DONE]";
|
||||||
|
|
||||||
|
# __END__
|
||||||
@@ -107,7 +107,7 @@ class Smarty extends Smarty_Internal_TemplateBase
|
|||||||
/**
|
/**
|
||||||
* smarty version
|
* smarty version
|
||||||
*/
|
*/
|
||||||
const SMARTY_VERSION = '4.3.0';
|
const SMARTY_VERSION = '4.4.1';
|
||||||
/**
|
/**
|
||||||
* define variable scopes
|
* define variable scopes
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -167,9 +167,7 @@
|
|||||||
</html>
|
</html>
|
||||||
{/capture}
|
{/capture}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
{$id = '__Smarty__'}
|
_smarty_console = window.open("", "console{$targetWindow}", "width=1024,height=600,left={$offset},top={$offset},resizable,scrollbars=yes");
|
||||||
{if $display_mode}{$id = "$offset$template_name"|md5}{/if}
|
|
||||||
_smarty_console = window.open("", "console{$id}", "width=1024,height=600,left={$offset},top={$offset},resizable,scrollbars=yes");
|
|
||||||
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
|
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
|
||||||
_smarty_console.document.close();
|
_smarty_console.document.close();
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ function smarty_function_math($params, $template)
|
|||||||
$equation = preg_replace('/\s+/', '', $equation);
|
$equation = preg_replace('/\s+/', '', $equation);
|
||||||
|
|
||||||
// Adapted from https://www.php.net/manual/en/function.eval.php#107377
|
// Adapted from https://www.php.net/manual/en/function.eval.php#107377
|
||||||
$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
|
$number = '-?(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
|
||||||
$functionsOrVars = '((?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))';
|
$functionsOrVars = '((?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))';
|
||||||
$operators = '[,+\/*\^%-]'; // Allowed math operators
|
$operators = '[,+\/*\^%-]'; // Allowed math operators
|
||||||
$regexp = '/^(('.$number.'|'.$functionsOrVars.'|('.$functionsOrVars.'\s*\((?1)*\)|\((?1)*\)))(?:'.$operators.'(?1))?)+$/';
|
$regexp = '/^(('.$number.'|'.$functionsOrVars.'|('.$functionsOrVars.'\s*\((?1)*\)|\((?1)*\)))(?:'.$operators.'(?1))?)+$/';
|
||||||
|
|||||||
@@ -115,7 +115,9 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $
|
|||||||
// see https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements
|
// see https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements
|
||||||
'<!--' => '<\!--',
|
'<!--' => '<\!--',
|
||||||
'<s' => '<\s',
|
'<s' => '<\s',
|
||||||
'<S' => '<\S'
|
'<S' => '<\S',
|
||||||
|
"`" => "\\\\`",
|
||||||
|
"\${" => "\\\\\\$\\{"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
case 'mail':
|
case 'mail':
|
||||||
|
|||||||
15
www/vendor/egrajp/smarty-extended/src/plugins/modifier.implode.php
vendored
Normal file
15
www/vendor/egrajp/smarty-extended/src/plugins/modifier.implode.php
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
function smarty_modifier_implode($values, $separator = '')
|
||||||
|
{
|
||||||
|
if (is_array($separator)) {
|
||||||
|
return implode((string) ($values ?? ''), (array) $separator);
|
||||||
|
}
|
||||||
|
return implode((string) ($separator ?? ''), (array) $values);
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
*/
|
*/
|
||||||
function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false)
|
function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false)
|
||||||
{
|
{
|
||||||
if ($length === 0) {
|
if ($length === 0 || $string === null) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
if (Smarty::$_MBSTRING) {
|
if (Smarty::$_MBSTRING) {
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ function smarty_modifiercompiler_count_characters($params)
|
|||||||
return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[ 0 ] . ', $tmp)';
|
return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[ 0 ] . ', $tmp)';
|
||||||
}
|
}
|
||||||
if (Smarty::$_MBSTRING) {
|
if (Smarty::$_MBSTRING) {
|
||||||
return 'mb_strlen(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
return 'mb_strlen((string) ' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
||||||
}
|
}
|
||||||
// no MBString fallback
|
// no MBString fallback
|
||||||
return 'strlen(' . $params[ 0 ] . ')';
|
return 'strlen((string) ' . $params[ 0 ] . ')';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,5 +27,5 @@ function smarty_modifiercompiler_count_words($params)
|
|||||||
$params[ 0 ] . ', $tmp)';
|
$params[ 0 ] . ', $tmp)';
|
||||||
}
|
}
|
||||||
// no MBString fallback
|
// no MBString fallback
|
||||||
return 'str_word_count(' . $params[ 0 ] . ')';
|
return 'str_word_count((string) ' . $params[ 0 ] . ')';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,9 @@ function smarty_modifiercompiler_escape($params, Smarty_Internal_TemplateCompile
|
|||||||
// see https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements
|
// see https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements
|
||||||
return 'strtr((string)' .
|
return 'strtr((string)' .
|
||||||
$params[ 0 ] .
|
$params[ 0 ] .
|
||||||
', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/", "<!--" => "<\!--", "<s" => "<\s", "<S" => "<\S" ))';
|
', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r",
|
||||||
|
"\\n" => "\\\n", "</" => "<\/", "<!--" => "<\!--", "<s" => "<\s", "<S" => "<\S",
|
||||||
|
"`" => "\\\\`", "\${" => "\\\\\\$\\{"))';
|
||||||
}
|
}
|
||||||
} catch (SmartyException $e) {
|
} catch (SmartyException $e) {
|
||||||
// pass through to regular plugin fallback
|
// pass through to regular plugin fallback
|
||||||
|
|||||||
11
www/vendor/egrajp/smarty-extended/src/plugins/modifiercompiler.json_encode.php
vendored
Normal file
11
www/vendor/egrajp/smarty-extended/src/plugins/modifiercompiler.json_encode.php
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_json_encode($params) {
|
||||||
|
return 'json_encode(' . $params[0] . (isset($params[1]) ? ', (int) ' . $params[1] : '') . ')';
|
||||||
|
}
|
||||||
@@ -22,8 +22,8 @@
|
|||||||
function smarty_modifiercompiler_lower($params)
|
function smarty_modifiercompiler_lower($params)
|
||||||
{
|
{
|
||||||
if (Smarty::$_MBSTRING) {
|
if (Smarty::$_MBSTRING) {
|
||||||
return 'mb_strtolower(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
return 'mb_strtolower((string) ' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
||||||
}
|
}
|
||||||
// no MBString fallback
|
// no MBString fallback
|
||||||
return 'strtolower(' . $params[ 0 ] . ')';
|
return 'strtolower((string) ' . $params[ 0 ] . ')';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
function smarty_modifiercompiler_strip_tags($params)
|
function smarty_modifiercompiler_strip_tags($params)
|
||||||
{
|
{
|
||||||
if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') === 'true') {
|
if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') === 'true') {
|
||||||
return "preg_replace('!<[^>]*?>!', ' ', {$params[0]} ?: '')";
|
return "preg_replace('!<[^>]*?>!', ' ', (string) {$params[0]})";
|
||||||
} else {
|
} else {
|
||||||
return 'strip_tags((string) ' . $params[ 0 ] . ')';
|
return 'strip_tags((string) ' . $params[ 0 ] . ')';
|
||||||
}
|
}
|
||||||
|
|||||||
12
www/vendor/egrajp/smarty-extended/src/plugins/modifiercompiler.substr.php
vendored
Normal file
12
www/vendor/egrajp/smarty-extended/src/plugins/modifiercompiler.substr.php
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsModifierCompiler
|
||||||
|
*/
|
||||||
|
function smarty_modifiercompiler_substr($params) {
|
||||||
|
return 'substr((string) ' . $params[0] . ', (int) ' . $params[1] .
|
||||||
|
(isset($params[2]) ? ', (int) ' . $params[2] : '') . ')';
|
||||||
|
}
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
function smarty_modifiercompiler_upper($params)
|
function smarty_modifiercompiler_upper($params)
|
||||||
{
|
{
|
||||||
if (Smarty::$_MBSTRING) {
|
if (Smarty::$_MBSTRING) {
|
||||||
return 'mb_strtoupper(' . $params[ 0 ] . ' ?? \'\', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
return 'mb_strtoupper((string) ' . $params[ 0 ] . ' ?? \'\', \'' . addslashes(Smarty::$_CHARSET) . '\')';
|
||||||
}
|
}
|
||||||
// no MBString fallback
|
// no MBString fallback
|
||||||
return 'strtoupper(' . $params[ 0 ] . ' ?? \'\')';
|
return 'strtoupper((string) ' . $params[ 0 ] . ' ?? \'\')';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ function smarty_outputfilter_trimwhitespace($source)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$expressions = array(// replace multiple spaces between tags by a single space
|
$expressions = array(// replace multiple spaces between tags by a single space
|
||||||
// can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
|
// can't remove them entirely, because that might break poorly implemented CSS display:inline-block elements
|
||||||
'#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
|
'#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
|
||||||
// remove spaces between attributes (but not in attribute values!)
|
// remove spaces between attributes (but not in attribute values!)
|
||||||
'#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
|
'#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
function smarty_function_escape_special_chars($string)
|
function smarty_function_escape_special_chars($string)
|
||||||
{
|
{
|
||||||
if (!is_array($string)) {
|
if (!is_array($string)) {
|
||||||
$string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false);
|
$string = htmlspecialchars((string) $string, ENT_COMPAT, Smarty::$_CHARSET, false);
|
||||||
}
|
}
|
||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,5 +15,5 @@
|
|||||||
*/
|
*/
|
||||||
function smarty_variablefilter_htmlspecialchars($source, Smarty_Internal_Template $template)
|
function smarty_variablefilter_htmlspecialchars($source, Smarty_Internal_Template $template)
|
||||||
{
|
{
|
||||||
return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET);
|
return htmlspecialchars((string) $source, ENT_QUOTES, Smarty::$_CHARSET);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_C
|
|||||||
}
|
}
|
||||||
// autoescape html
|
// autoescape html
|
||||||
if ($compiler->template->smarty->escape_html) {
|
if ($compiler->template->smarty->escape_html) {
|
||||||
$output = "htmlspecialchars((string) {$output}, ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')";
|
$output = "htmlspecialchars((string) ({$output}), ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')";
|
||||||
}
|
}
|
||||||
// loop over registered filters
|
// loop over registered filters
|
||||||
if (!empty($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ])) {
|
if (!empty($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ])) {
|
||||||
|
|||||||
@@ -238,9 +238,12 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
|
|||||||
$_config_vars = $ptr->config_vars;
|
$_config_vars = $ptr->config_vars;
|
||||||
ksort($_config_vars);
|
ksort($_config_vars);
|
||||||
$debugging = $smarty->debugging;
|
$debugging = $smarty->debugging;
|
||||||
|
$templateName = $obj->source->type . ':' . $obj->source->name;
|
||||||
|
$displayMode = $debugging === 2 || !$full;
|
||||||
|
$offset = $this->offset * 50;
|
||||||
$_template = new Smarty_Internal_Template($debObj->debug_tpl, $debObj);
|
$_template = new Smarty_Internal_Template($debObj->debug_tpl, $debObj);
|
||||||
if ($obj->_isTplObj()) {
|
if ($obj->_isTplObj()) {
|
||||||
$_template->assign('template_name', $obj->source->type . ':' . $obj->source->name);
|
$_template->assign('template_name', $templateName);
|
||||||
}
|
}
|
||||||
if ($obj->_objType === 1 || $full) {
|
if ($obj->_objType === 1 || $full) {
|
||||||
$_template->assign('template_data', $this->template_data[ $this->index ]);
|
$_template->assign('template_data', $this->template_data[ $this->index ]);
|
||||||
@@ -250,8 +253,8 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
|
|||||||
$_template->assign('assigned_vars', $_assigned_vars);
|
$_template->assign('assigned_vars', $_assigned_vars);
|
||||||
$_template->assign('config_vars', $_config_vars);
|
$_template->assign('config_vars', $_config_vars);
|
||||||
$_template->assign('execution_time', microtime(true) - $smarty->start_time);
|
$_template->assign('execution_time', microtime(true) - $smarty->start_time);
|
||||||
$_template->assign('display_mode', $debugging === 2 || !$full);
|
$_template->assign('targetWindow', $displayMode ? md5("$offset$templateName") : '__Smarty__');
|
||||||
$_template->assign('offset', $this->offset * 50);
|
$_template->assign('offset', $offset);
|
||||||
echo $_template->fetch();
|
echo $_template->fetch();
|
||||||
if (isset($full)) {
|
if (isset($full)) {
|
||||||
$this->index--;
|
$this->index--;
|
||||||
|
|||||||
@@ -17,6 +17,12 @@ class Smarty_Internal_ErrorHandler
|
|||||||
*/
|
*/
|
||||||
public $allowUndefinedVars = true;
|
public $allowUndefinedVars = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows {$foo->propName} where propName is undefined.
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $allowUndefinedProperties = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows {$foo.bar} where bar is unset and {$foo.bar1.bar2} where either bar1 or bar2 is unset.
|
* Allows {$foo.bar} where bar is unset and {$foo.bar1.bar2} where either bar1 or bar2 is unset.
|
||||||
* @var bool
|
* @var bool
|
||||||
@@ -80,8 +86,15 @@ class Smarty_Internal_ErrorHandler
|
|||||||
return; // suppresses this error
|
return; // suppresses this error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->allowUndefinedProperties && preg_match(
|
||||||
|
'/^(Undefined property)/',
|
||||||
|
$errstr
|
||||||
|
)) {
|
||||||
|
return; // suppresses this error
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->allowUndefinedArrayKeys && preg_match(
|
if ($this->allowUndefinedArrayKeys && preg_match(
|
||||||
'/^(Undefined index|Undefined array key|Trying to access array offset on value of type)/',
|
'/^(Undefined index|Undefined array key|Trying to access array offset on)/',
|
||||||
$errstr
|
$errstr
|
||||||
)) {
|
)) {
|
||||||
return; // suppresses this error
|
return; // suppresses this error
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
|||||||
*
|
*
|
||||||
* @param Smarty_Internal_Template $_template
|
* @param Smarty_Internal_Template $_template
|
||||||
*
|
*
|
||||||
* @return string
|
* @return void
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function render(Smarty_Internal_Template $_template)
|
public function render(Smarty_Internal_Template $_template)
|
||||||
|
|||||||
Reference in New Issue
Block a user