Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 13602bdd73 | |||
| 1ef91305d4 | |||
| 4ab382990e | |||
| c61a68b131 | |||
| c7254c45b7 | |||
| 4edacc0d13 | |||
| 128d6533fc | |||
| c740fb1af1 | |||
| 64e60d97e7 | |||
| f414224c54 | |||
| 71c9fd401d | |||
| 0a885f215c | |||
| dad6b797e0 | |||
| 2d7c3c2bba | |||
| fb8216ae86 | |||
| df5070ffbb | |||
| 872409ef54 | |||
| c4d5cad9e8 | |||
| 90550746ab | |||
| 724031b944 | |||
| 027c35f9f0 | |||
| 6ad844b519 | |||
| e10987ce8b | |||
| b3617954eb | |||
| 67fd7b172a | |||
| fe729453ac | |||
| b939edac3f | |||
| 00528cb7d7 |
@@ -360,10 +360,7 @@ return [
|
|||||||
'directory_list' => [
|
'directory_list' => [
|
||||||
'src',
|
'src',
|
||||||
'vendor/egrajp/smarty-extended/src',
|
'vendor/egrajp/smarty-extended/src',
|
||||||
'vendor/phan/phan/src/Phan',
|
|
||||||
'vendor/phpunit/phpunit/src',
|
|
||||||
'vendor/psr/log/src',
|
'vendor/psr/log/src',
|
||||||
'vendor/vimeo/psalm/src/Psalm',
|
|
||||||
'vendor/gullevek/dotenv',
|
'vendor/gullevek/dotenv',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
9
.phive/phars.xml
Normal file
9
.phive/phars.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phive xmlns="https://phar.io/phive">
|
||||||
|
<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="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="phpstan" version="^1.10.37" installed="1.10.37" location="./tools/phpstan" copy="false"/>
|
||||||
|
<phar name="phan" version="^5.4.2" installed="5.4.2" location="./tools/phan" copy="false"/>
|
||||||
|
</phive>
|
||||||
18
ReadMe.md
18
ReadMe.md
@@ -23,3 +23,21 @@ Alternative setup composer local zip file repot:
|
|||||||
## Install package
|
## Install package
|
||||||
|
|
||||||
`composer require egrajp/corelibs-composer-all:^8.0`
|
`composer require egrajp/corelibs-composer-all:^8.0`
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
All tests must be run from the base folder
|
||||||
|
|
||||||
|
### phan
|
||||||
|
|
||||||
|
`phan --progress-bar -C --analyze-twic`
|
||||||
|
|
||||||
|
### phpstan
|
||||||
|
|
||||||
|
`phpstan`
|
||||||
|
|
||||||
|
### phpunit
|
||||||
|
|
||||||
|
PHP unit is installed via "phiev"
|
||||||
|
|
||||||
|
`tools/phpunit test/phpunit`
|
||||||
|
|||||||
@@ -20,11 +20,7 @@
|
|||||||
"psr/log": "^3.0@dev"
|
"psr/log": "^3.0@dev"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^1.10",
|
|
||||||
"phan/phan": "v5.x-dev",
|
|
||||||
"phpunit/phpunit": "^9",
|
|
||||||
"egrajp/smarty-extended": "^4.3",
|
"egrajp/smarty-extended": "^4.3",
|
||||||
"vimeo/psalm": "^5.0@dev",
|
|
||||||
"gullevek/dotenv": "dev-master"
|
"gullevek/dotenv": "dev-master"
|
||||||
},
|
},
|
||||||
"repositories": {
|
"repositories": {
|
||||||
|
|||||||
@@ -2,5 +2,6 @@
|
|||||||
cacheResultFile="/tmp/phpunit-corelibs-composer.result.cache"
|
cacheResultFile="/tmp/phpunit-corelibs-composer.result.cache"
|
||||||
colors="true"
|
colors="true"
|
||||||
verbose="true"
|
verbose="true"
|
||||||
|
bootstrap="test/phpunit/bootstrap.php"
|
||||||
>
|
>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
9.7.0
|
9.8.3
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ class EditBase
|
|||||||
private \CoreLibs\Output\Form\Generate $form;
|
private \CoreLibs\Output\Form\Generate $form;
|
||||||
/** @var \CoreLibs\Logging\Logging */
|
/** @var \CoreLibs\Logging\Logging */
|
||||||
public \CoreLibs\Logging\Logging $log;
|
public \CoreLibs\Logging\Logging $log;
|
||||||
|
/** @var \CoreLibs\Language\L10n */
|
||||||
|
public \CoreLibs\Language\L10n $l;
|
||||||
/** @var \CoreLibs\ACL\Login */
|
/** @var \CoreLibs\ACL\Login */
|
||||||
public \CoreLibs\ACL\Login $login;
|
public \CoreLibs\ACL\Login $login;
|
||||||
|
|
||||||
@@ -42,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
|
||||||
@@ -57,6 +59,7 @@ class EditBase
|
|||||||
) {
|
) {
|
||||||
$this->log = $log;
|
$this->log = $log;
|
||||||
$this->login = $login;
|
$this->login = $login;
|
||||||
|
$this->l = $l10n;
|
||||||
// smarty template engine (extended Translation version)
|
// smarty template engine (extended Translation version)
|
||||||
$this->smarty = new \CoreLibs\Template\SmartyExtend(
|
$this->smarty = new \CoreLibs\Template\SmartyExtend(
|
||||||
$l10n,
|
$l10n,
|
||||||
@@ -77,7 +80,7 @@ class EditBase
|
|||||||
echo "I am sorry, but this page cannot be viewed by a mobile phone";
|
echo "I am sorry, but this page cannot be viewed by a mobile phone";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
// $this->form->log->debug('POST', $this->form->log->prAr($_POST));
|
// $this->log->debug('POST', $this->log->prAr($_POST));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,7 +154,7 @@ class EditBase
|
|||||||
$q = "UPDATE " . $table_name
|
$q = "UPDATE " . $table_name
|
||||||
. " SET order_number = " . $row_data_order[$i]
|
. " SET order_number = " . $row_data_order[$i]
|
||||||
. " WHERE " . $table_name . "_id = " . $row_data_id[$i];
|
. " WHERE " . $table_name . "_id = " . $row_data_id[$i];
|
||||||
$q = $this->form->dbExec($q);
|
$q = $this->form->dba->dbExec($q);
|
||||||
}
|
}
|
||||||
} // for all article ids ...
|
} // for all article ids ...
|
||||||
} // if write
|
} // if write
|
||||||
@@ -170,7 +173,7 @@ class EditBase
|
|||||||
$options_name = [];
|
$options_name = [];
|
||||||
$options_selected = [];
|
$options_selected = [];
|
||||||
// DB read data for menu
|
// DB read data for menu
|
||||||
while (is_array($res = $this->form->dbReturn($q))) {
|
while (is_array($res = $this->form->dba->dbReturn($q))) {
|
||||||
$row_data[] = [
|
$row_data[] = [
|
||||||
"id" => $res[$table_name . "_id"],
|
"id" => $res[$table_name . "_id"],
|
||||||
"name" => $res["name"],
|
"name" => $res["name"],
|
||||||
@@ -179,7 +182,7 @@ class EditBase
|
|||||||
} // while read data ...
|
} // while read data ...
|
||||||
|
|
||||||
// html title
|
// html title
|
||||||
$this->HEADER['HTML_TITLE'] = $this->form->l->__('Edit Order');
|
$this->HEADER['HTML_TITLE'] = $this->l->__('Edit Order');
|
||||||
|
|
||||||
$messages = [];
|
$messages = [];
|
||||||
$error = $_POST['error'] ?? 0;
|
$error = $_POST['error'] ?? 0;
|
||||||
@@ -428,9 +431,9 @@ class EditBase
|
|||||||
$elements[] = $this->form->formCreateElement('template');
|
$elements[] = $this->form->formCreateElement('template');
|
||||||
break;
|
break;
|
||||||
case 'edit_pages':
|
case 'edit_pages':
|
||||||
if (!isset($this->form->table_array['edit_page_id']['value'])) {
|
if (!isset($this->form->dba->getTableArray()['edit_page_id']['value'])) {
|
||||||
$q = "DELETE FROM temp_files";
|
$q = "DELETE FROM temp_files";
|
||||||
$this->form->dbExec($q);
|
$this->form->dba->dbExec($q);
|
||||||
// gets all files in the current dir and dirs given ending with .php
|
// gets all files in the current dir and dirs given ending with .php
|
||||||
$folders = ['../admin/', '../frontend/'];
|
$folders = ['../admin/', '../frontend/'];
|
||||||
$files = ['*.php'];
|
$files = ['*.php'];
|
||||||
@@ -458,16 +461,16 @@ class EditBase
|
|||||||
if ($t_q) {
|
if ($t_q) {
|
||||||
$t_q .= ', ';
|
$t_q .= ', ';
|
||||||
}
|
}
|
||||||
$t_q .= "('" . $this->form->dbEscapeString($pathinfo['dirname']) . "', '"
|
$t_q .= "('" . $this->form->dba->dbEscapeString($pathinfo['dirname']) . "', '"
|
||||||
. $this->form->dbEscapeString($pathinfo['basename']) . "')";
|
. $this->form->dba->dbEscapeString($pathinfo['basename']) . "')";
|
||||||
}
|
}
|
||||||
$this->form->dbExec($q . $t_q, 'NULL');
|
$this->form->dba->dbExec($q . $t_q, 'NULL');
|
||||||
$elements[] = $this->form->formCreateElement('filename');
|
$elements[] = $this->form->formCreateElement('filename');
|
||||||
} else {
|
} else {
|
||||||
// show file menu
|
// show file menu
|
||||||
// just show name of file ...
|
// just show name of file ...
|
||||||
$this->DATA['filename_exist'] = 1;
|
$this->DATA['filename_exist'] = 1;
|
||||||
$this->DATA['filename'] = $this->form->table_array['filename']['value'];
|
$this->DATA['filename'] = $this->form->dba->getTableArray()['filename']['value'];
|
||||||
} // File Name View IF
|
} // File Name View IF
|
||||||
$elements[] = $this->form->formCreateElement('hostname');
|
$elements[] = $this->form->formCreateElement('hostname');
|
||||||
$elements[] = $this->form->formCreateElement('name');
|
$elements[] = $this->form->formCreateElement('name');
|
||||||
@@ -632,7 +635,7 @@ class EditBase
|
|||||||
'editAdmin_' . $this->smarty->lang
|
'editAdmin_' . $this->smarty->lang
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->form->log->debug('DEBUGEND', '==================================== [Form END]');
|
$this->log->debug('DEBUGEND', '==================================== [Form END]');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,13 +39,13 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
{
|
{
|
||||||
// main calss variables
|
// main calss variables
|
||||||
/** @var array<mixed> */
|
/** @var array<mixed> */
|
||||||
public array $table_array; // the array from the table to work on
|
private array $table_array; // the array from the table to work on
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public string $table_name; // the table_name
|
private string $table_name; // the table_name
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public string $pk_name = ''; // the primary key from this table
|
private string $pk_name = ''; // the primary key from this table
|
||||||
/** @var int|string|null */
|
/** @var int|string|null */
|
||||||
public int|string|null $pk_id; // the PK id
|
private int|string|null $pk_id; // the PK id
|
||||||
// security values
|
// security values
|
||||||
/** @var int base acl for current page */
|
/** @var int base acl for current page */
|
||||||
private int $base_acl_level = 0;
|
private int $base_acl_level = 0;
|
||||||
@@ -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
|
||||||
@@ -74,24 +74,21 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
// instance db_io class
|
// instance db_io class
|
||||||
parent::__construct($db_config, $log);
|
parent::__construct($db_config, $log);
|
||||||
// more error vars for this class
|
// more error vars for this class
|
||||||
$this->error_string['1999'] = 'No table array or table name set';
|
$this->error_string['1998'] = 'No table name set';
|
||||||
|
$this->error_string['1999'] = 'No table array set';
|
||||||
$this->error_string['1021'] = 'No Primary Key given';
|
$this->error_string['1021'] = 'No Primary Key given';
|
||||||
$this->error_string['1022'] = 'Could not run Array Query';
|
$this->error_string['1022'] = 'Could not run Array Query';
|
||||||
|
|
||||||
$this->table_array = $table_array;
|
$this->setTableArray($table_array);
|
||||||
$this->table_name = $table_name;
|
$this->setTableName($table_name);
|
||||||
|
|
||||||
// error abort if no table array or no table name
|
|
||||||
if (empty($table_array) || empty($table_name)) {
|
|
||||||
$this->__dbError(1999, false, 'MAJOR ERROR: Core settings missing');
|
|
||||||
throw new \RuntimeException('MAJOR ERROR: Core settings missing', 1999);
|
|
||||||
}
|
|
||||||
|
|
||||||
// set primary key for given table_array
|
// set primary key for given table_array
|
||||||
foreach ($this->table_array as $key => $value) {
|
foreach ($this->table_array as $key => $value) {
|
||||||
if (!empty($value['pk'])) {
|
if (empty($value['pk'])) {
|
||||||
$this->pk_name = $key;
|
continue;
|
||||||
}
|
}
|
||||||
|
$this->setPkName($key);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
$this->dbArrayIOSetAcl($base_acl_level, $acl_admin);
|
$this->dbArrayIOSetAcl($base_acl_level, $acl_admin);
|
||||||
}
|
}
|
||||||
@@ -104,6 +101,144 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
parent::__destruct();
|
parent::__destruct();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the overall table array
|
||||||
|
*
|
||||||
|
* @param array<mixed> $table_array
|
||||||
|
* @return void
|
||||||
|
* @throws \RuntimeException 1999 for empty table array
|
||||||
|
*/
|
||||||
|
public function setTableArray(array $table_array): void
|
||||||
|
{
|
||||||
|
$this->table_array = $table_array;
|
||||||
|
if (empty($this->table_array)) {
|
||||||
|
$this->__dbError(1999, false, 'MAJOR ERROR: Core settings missing: table_arrry');
|
||||||
|
throw new \RuntimeException('MAJOR ERROR: Core settings missing: table_array', 1999);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return full table array, or [] if empty
|
||||||
|
* of reset is set to true, will reset array first
|
||||||
|
*
|
||||||
|
* @param bool $reset [=false] run a reset before returning
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function getTableArray(bool $reset = false): array
|
||||||
|
{
|
||||||
|
if (!$reset) {
|
||||||
|
return $this->table_array ?? [];
|
||||||
|
}
|
||||||
|
$table_array = $this->table_array ?? [];
|
||||||
|
reset($table_array);
|
||||||
|
return $table_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get a table array entry under the key with element pos
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param string $pos
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getTableArrayEntry(string $key, string $pos): mixed
|
||||||
|
{
|
||||||
|
return $this->table_array[$key][$pos] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set a new value at key with pos
|
||||||
|
*
|
||||||
|
* @param mixed $value
|
||||||
|
* @param string $key
|
||||||
|
* @param string $pos
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setTableArrayEntry(mixed $value, string $key, string $pos): void
|
||||||
|
{
|
||||||
|
$this->table_array[$key][$pos] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unset entry at key with pos
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param string $pos
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetTableArrayEntry(string $key, string $pos): void
|
||||||
|
{
|
||||||
|
unset($this->table_array[$key][$pos]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set table name
|
||||||
|
*
|
||||||
|
* @param string $table_name
|
||||||
|
* @return void
|
||||||
|
* @throws \RuntimeException 1998 for empty table name
|
||||||
|
*/
|
||||||
|
public function setTableName(string $table_name): void
|
||||||
|
{
|
||||||
|
$this->table_name = $table_name;
|
||||||
|
if (empty($this->table_name)) {
|
||||||
|
$this->__dbError(1998, false, 'MAJOR ERROR: Core settings missing: table_name');
|
||||||
|
throw new \RuntimeException('MAJOR ERROR: Core settings missing: table_name', 1998);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return table name or empty string if not net
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTableName(): string
|
||||||
|
{
|
||||||
|
return $this->table_name ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set primary key name
|
||||||
|
*
|
||||||
|
* @param string $pk_name
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setPkName(string $pk_name): void
|
||||||
|
{
|
||||||
|
$this->pk_name = $pk_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get primary key name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPkName(): string
|
||||||
|
{
|
||||||
|
return $this->pk_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set primary key id, can be null for not yet set
|
||||||
|
*
|
||||||
|
* @param int|string|null $pk_id
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setPkId(int|string|null $pk_id): void
|
||||||
|
{
|
||||||
|
$this->pk_id = $pk_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return primary key id, or null if not set
|
||||||
|
*
|
||||||
|
* @return int|string|null
|
||||||
|
*/
|
||||||
|
public function getPkId(): int|string|null
|
||||||
|
{
|
||||||
|
return $this->pk_id;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set the base acl level and admin acl flag
|
* set the base acl level and admin acl flag
|
||||||
* This is needed for table array ACL checks
|
* This is needed for table array ACL checks
|
||||||
@@ -198,8 +333,8 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
public function dbCheckPkSet(): bool
|
public function dbCheckPkSet(): bool
|
||||||
{
|
{
|
||||||
// if pk_id is set, overrule ...
|
// if pk_id is set, overrule ...
|
||||||
if ($this->pk_id) {
|
if (!empty($this->getPkId())) {
|
||||||
$this->table_array[$this->pk_name]['value'] = $this->pk_id;
|
$this->table_array[$this->pk_name]['value'] = $this->getPkId();
|
||||||
}
|
}
|
||||||
// if not set ... produce error
|
// if not set ... produce error
|
||||||
if (!$this->table_array[$this->pk_name]['value']) {
|
if (!$this->table_array[$this->pk_name]['value']) {
|
||||||
@@ -287,7 +422,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
$q .= ' AND ' . $q_where;
|
$q .= ' AND ' . $q_where;
|
||||||
}
|
}
|
||||||
// if 0, error
|
// if 0, error
|
||||||
$this->pk_id = null;
|
$this->setPkId(null);
|
||||||
if (!$this->dbExec($q)) {
|
if (!$this->dbExec($q)) {
|
||||||
$this->__dbError(1022);
|
$this->__dbError(1022);
|
||||||
}
|
}
|
||||||
@@ -374,7 +509,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// possible dbFetchArray errors ...
|
// possible dbFetchArray errors ...
|
||||||
$this->pk_id = $this->table_array[$this->pk_name]['value'];
|
$this->setPkId($this->table_array[$this->pk_name]['value']);
|
||||||
} else {
|
} else {
|
||||||
$this->__dbError(1022);
|
$this->__dbError(1022);
|
||||||
}
|
}
|
||||||
@@ -397,10 +532,6 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
if (count($table_array)) {
|
if (count($table_array)) {
|
||||||
$this->table_array = $table_array;
|
$this->table_array = $table_array;
|
||||||
}
|
}
|
||||||
// PK ID check
|
|
||||||
// if ($this->pk_id && !$this->table_array[$this->pk_name]["value"]) {
|
|
||||||
// $this->table_array[$this->pk_name]["value"]=$this->pk_id;
|
|
||||||
// }
|
|
||||||
// checken ob PKs gesetzt, wenn alle -> update, wenn keiner -> insert, wenn ein paar -> ERROR!
|
// checken ob PKs gesetzt, wenn alle -> update, wenn keiner -> insert, wenn ein paar -> ERROR!
|
||||||
if (!$this->table_array[$this->pk_name]['value']) {
|
if (!$this->table_array[$this->pk_name]['value']) {
|
||||||
$insert = 1;
|
$insert = 1;
|
||||||
@@ -624,16 +755,11 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
$q .= ' AND ' . $q_where;
|
$q .= ' AND ' . $q_where;
|
||||||
}
|
}
|
||||||
// set pk_id ... if it has changed or so
|
// set pk_id ... if it has changed or so
|
||||||
$this->pk_id = $this->table_array[$this->pk_name]['value'];
|
$this->setPkId($this->table_array[$this->pk_name]['value']);
|
||||||
} else {
|
} else {
|
||||||
$q = 'INSERT INTO ' . $this->table_name . ' ';
|
$q = 'INSERT INTO ' . $this->table_name . ' ';
|
||||||
$q .= '(' . $q_vars . ') ';
|
$q .= '(' . $q_vars . ') ';
|
||||||
$q .= 'VALUES (' . $q_data . ')';
|
$q .= 'VALUES (' . $q_data . ')';
|
||||||
// write primary key too
|
|
||||||
// if ($q_data)
|
|
||||||
// $q .= ", ";
|
|
||||||
// $q .= $this->pk_name." = ".$this->table_array[$this->pk_name]['value']." ";
|
|
||||||
// $this->pk_id = $this->table_array[$this->pk_name]['value'];
|
|
||||||
}
|
}
|
||||||
// return success or not
|
// return success or not
|
||||||
if (!$this->dbExec($q)) {
|
if (!$this->dbExec($q)) {
|
||||||
@@ -646,7 +772,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
$insert_id = 0;
|
$insert_id = 0;
|
||||||
}
|
}
|
||||||
$this->table_array[$this->pk_name]['value'] = $insert_id;
|
$this->table_array[$this->pk_name]['value'] = $insert_id;
|
||||||
$this->pk_id = $insert_id;
|
$this->setPkId($insert_id);
|
||||||
}
|
}
|
||||||
// return the table if needed
|
// return the table if needed
|
||||||
return $this->table_array;
|
return $this->table_array;
|
||||||
|
|||||||
812
src/DB/IO.php
812
src/DB/IO.php
File diff suppressed because it is too large
Load Diff
220
src/DB/Support/ConvertPlaceholder.php
Normal file
220
src/DB/Support/ConvertPlaceholder.php
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__
|
||||||
@@ -15,15 +15,34 @@ use CoreLibs\Logging\Logger\MessageLevel;
|
|||||||
|
|
||||||
class ErrorMessage
|
class ErrorMessage
|
||||||
{
|
{
|
||||||
/** @var array<int,array{id:string,level:string,str:string,target:string,highlight:string[]}> */
|
/** @var array<int,array{id:string,level:string,str:string,target:string,target_style:string,highlight:string[]}> */
|
||||||
private array $error_str = [];
|
private array $error_str = [];
|
||||||
|
/** @var array<string,array{info:string,level:string}> */
|
||||||
|
private array $jump_targets = [];
|
||||||
/** @var \CoreLibs\Logging\Logging $log */
|
/** @var \CoreLibs\Logging\Logging $log */
|
||||||
public \CoreLibs\Logging\Logging $log;
|
public \CoreLibs\Logging\Logging $log;
|
||||||
|
|
||||||
|
/** @var bool $log_error global flag to log error level message */
|
||||||
|
private bool $log_error = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init ErrorMessage
|
||||||
|
*
|
||||||
|
* @param \CoreLibs\Logging\Logging $log
|
||||||
|
* @param null|bool $log_error [=null], defaults to false if log is not level debug
|
||||||
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
\CoreLibs\Logging\Logging $log
|
\CoreLibs\Logging\Logging $log,
|
||||||
|
?bool $log_error = null
|
||||||
) {
|
) {
|
||||||
$this->log = $log;
|
$this->log = $log;
|
||||||
|
// if log default logging is debug then log_error is default set to true
|
||||||
|
if ($this->log->loggingLevelIsDebug() && $log_error === null) {
|
||||||
|
$log_error = true;
|
||||||
|
} else {
|
||||||
|
$log_error = $log_error ?? false;
|
||||||
|
}
|
||||||
|
$this->log_error = $log_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -31,6 +50,7 @@ class ErrorMessage
|
|||||||
* error_id: internal Error ID (should be unique)
|
* error_id: internal Error ID (should be unique)
|
||||||
* level: error level, can only be ok, info, warn, error, abort, crash
|
* level: error level, can only be ok, info, warn, error, abort, crash
|
||||||
* ok and info are positive response: success
|
* ok and info are positive response: success
|
||||||
|
* notice: a debug message for information only
|
||||||
* warn: success, but there might be some things that are not 100% ok
|
* warn: success, but there might be some things that are not 100% ok
|
||||||
* error: input error or error in executing request
|
* error: input error or error in executing request
|
||||||
* abort: an internal error happened as mandatory information that normally is
|
* abort: an internal error happened as mandatory information that normally is
|
||||||
@@ -41,25 +61,42 @@ class ErrorMessage
|
|||||||
* not set: unkown, will be logged as "emergency"
|
* not set: unkown, will be logged as "emergency"
|
||||||
* target/highlight: id target name for frontend where to attach this message
|
* target/highlight: id target name for frontend where to attach this message
|
||||||
* highlight is a list of other target points to highlight
|
* highlight is a list of other target points to highlight
|
||||||
|
* for highlight targets css names are $level without a prefix and should be
|
||||||
|
* nested in the target element "input .error { ... }"
|
||||||
|
* jump_target: a target id for to jump and message, is stored in separate jump array
|
||||||
|
* where the target is unique, first one set is used for info message
|
||||||
|
* target_style: if not set uses 'error-' $level as css style. applies to targets or main only
|
||||||
*
|
*
|
||||||
* @param string $error_id Any internal error ID for this error
|
* @param string $error_id Any internal error ID for this error
|
||||||
* @param string $level Error level in ok/info/warn/error
|
* @param string $level Error level in ok/info/warn/error
|
||||||
* @param string $str Error message (out)
|
* @param string $str Error message (out)
|
||||||
* @param string $target alternate attachment point for this error message
|
* @param string $target alternate attachment point for this error message
|
||||||
* @param array<string> $highlight Any additional error data as error OR
|
* @param string $target_style Alternate color style for the error message
|
||||||
* highlight points for field highlights
|
* @param array<string> $highlight Any additional error data as error OR
|
||||||
* @param string|null $message If abort/crash, non localized $str
|
* highlight points for field highlights
|
||||||
* @param array<mixed> $context Additionl info for abort/crash messages
|
* @param array{}|array{target:string,info?:string} $jump_target with "target" for where to jump and
|
||||||
|
* "info" for string to show in jump list
|
||||||
|
* target must be set, if info not set, default message used
|
||||||
|
* @param string|null $message If abort/crash, non localized $str
|
||||||
|
* @param array<mixed> $context Additionl info for abort/crash messages
|
||||||
|
* @param bool|null $log_error [=null] log level 'error' to error, if null use global,
|
||||||
|
* else set for this call only
|
||||||
*/
|
*/
|
||||||
public function setErrorMsg(
|
public function setErrorMsg(
|
||||||
string $error_id,
|
string $error_id,
|
||||||
string $level,
|
string $level,
|
||||||
string $str,
|
string $str,
|
||||||
string $target = '',
|
string $target = '',
|
||||||
|
string $target_style = '',
|
||||||
array $highlight = [],
|
array $highlight = [],
|
||||||
|
array $jump_target = [],
|
||||||
?string $message = null,
|
?string $message = null,
|
||||||
array $context = [],
|
array $context = [],
|
||||||
|
?bool $log_error = null,
|
||||||
): void {
|
): void {
|
||||||
|
if ($log_error === null) {
|
||||||
|
$log_error = $this->log_error;
|
||||||
|
}
|
||||||
$original_level = $level;
|
$original_level = $level;
|
||||||
$level = MessageLevel::fromName($level)->name;
|
$level = MessageLevel::fromName($level)->name;
|
||||||
// if not string set, write message string if set, else level/error id
|
// if not string set, write message string if set, else level/error id
|
||||||
@@ -71,10 +108,27 @@ class ErrorMessage
|
|||||||
'level' => $level,
|
'level' => $level,
|
||||||
'str' => $str,
|
'str' => $str,
|
||||||
'target' => $target,
|
'target' => $target,
|
||||||
|
'target_style' => $target_style,
|
||||||
'highlight' => $highlight,
|
'highlight' => $highlight,
|
||||||
];
|
];
|
||||||
|
// set a jump target
|
||||||
|
$this->setJumpTarget($jump_target['target'] ?? null, $jump_target['info'] ?? null, $level);
|
||||||
// write to log for abort/crash
|
// write to log for abort/crash
|
||||||
switch ($level) {
|
switch ($level) {
|
||||||
|
case 'notice':
|
||||||
|
$this->log->notice($message ?? $str, array_merge([
|
||||||
|
'id' => $error_id,
|
||||||
|
'level' => $original_level,
|
||||||
|
], $context));
|
||||||
|
break;
|
||||||
|
case 'error':
|
||||||
|
if ($log_error) {
|
||||||
|
$this->log->error($message ?? $str, array_merge([
|
||||||
|
'id' => $error_id,
|
||||||
|
'level' => $original_level,
|
||||||
|
], $context));
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'abort':
|
case 'abort':
|
||||||
$this->log->critical($message ?? $str, array_merge([
|
$this->log->critical($message ?? $str, array_merge([
|
||||||
'id' => $error_id,
|
'id' => $error_id,
|
||||||
@@ -101,52 +155,77 @@ class ErrorMessage
|
|||||||
* Note, the parameter order is different and does not need an error id
|
* Note, the parameter order is different and does not need an error id
|
||||||
* This is for backend alerts
|
* This is for backend alerts
|
||||||
*
|
*
|
||||||
* @param string $level error level (ok/warn/info/error)
|
* @param string $level error level (ok/warn/info/error)
|
||||||
* @param string $str error string
|
* @param string $str error string
|
||||||
* @param string|null $error_id optional error id for precise error lookup
|
* @param string|null $error_id optional error id for precise error lookup
|
||||||
* @param string $target Alternate id name for output target on frontend
|
* @param string $target Alternate id name for output target on frontend
|
||||||
* @param array<string> $highlight Any additional error data as error OR
|
* @param string $target_style Alternate color style for the error message
|
||||||
* highlight points for field highlights
|
* @param array<string> $highlight Any additional error data as error OR
|
||||||
* @param string|null $message If abort/crash, non localized $str
|
* highlight points for field highlights
|
||||||
* @param array<mixed> $context Additionl info for abort/crash messages
|
* @param array{}|array{target:string,info?:string} $jump_target with "target" for where to jump and
|
||||||
* @deprecated 9.7 Use setError instead
|
* "info" for string to show in jump list
|
||||||
|
* target must be set, if info not set, default message used
|
||||||
|
* @param string|null $message If abort/crash, non localized $str
|
||||||
|
* @param array<mixed> $context Additionl info for abort/crash messages
|
||||||
|
* @param bool|null $log_error [=null] log level 'error' to error, if null use global,
|
||||||
|
* else set for this call only
|
||||||
*/
|
*/
|
||||||
public function setErrorMsgLevel(
|
public function setMessage(
|
||||||
string $level,
|
string $level,
|
||||||
string $str,
|
string $str,
|
||||||
?string $error_id = null,
|
?string $error_id = null,
|
||||||
string $target = '',
|
string $target = '',
|
||||||
|
string $target_style = '',
|
||||||
array $highlight = [],
|
array $highlight = [],
|
||||||
|
array $jump_target = [],
|
||||||
?string $message = null,
|
?string $message = null,
|
||||||
array $context = [],
|
array $context = [],
|
||||||
|
?bool $log_error = null,
|
||||||
): void {
|
): void {
|
||||||
$this->setErrorMsg($error_id ?? '', $level, $str, $target, $highlight, $message, $context);
|
$this->setErrorMsg(
|
||||||
|
$error_id ?? '',
|
||||||
|
$level,
|
||||||
|
$str,
|
||||||
|
$target,
|
||||||
|
$target_style,
|
||||||
|
$highlight,
|
||||||
|
$jump_target,
|
||||||
|
$message,
|
||||||
|
$context,
|
||||||
|
$log_error
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pushes new error message into the error_str array
|
* Set a jump target. This can be used to jump directly a frontend html block
|
||||||
* Note, the parameter order is different and does not need an error id
|
* with the target id set
|
||||||
* This is for backend alerts
|
|
||||||
*
|
*
|
||||||
* @param string $level error level (ok/warn/info/error)
|
* @param string|null $target
|
||||||
* @param string $str error string
|
* @param string|null $info
|
||||||
* @param string|null $error_id optional error id for precise error lookup
|
* @param string $level [='error']
|
||||||
* @param string $target Alternate id name for output target on frontend
|
* @return void
|
||||||
* @param array<string> $highlight Any additional error data as error OR
|
|
||||||
* highlight points for field highlights
|
|
||||||
* @param string|null $message If abort/crash, non localized $str
|
|
||||||
* @param array<mixed> $context Additionl info for abort/crash messages
|
|
||||||
*/
|
*/
|
||||||
public function setError(
|
public function setJumpTarget(
|
||||||
string $level,
|
?string $target,
|
||||||
string $str,
|
?string $info,
|
||||||
?string $error_id = null,
|
string $level = 'error',
|
||||||
string $target = '',
|
|
||||||
array $highlight = [],
|
|
||||||
?string $message = null,
|
|
||||||
array $context = [],
|
|
||||||
): void {
|
): void {
|
||||||
$this->setErrorMsg($error_id ?? '', $level, $str, $target, $highlight, $message, $context);
|
if (
|
||||||
|
empty($target) ||
|
||||||
|
array_key_exists($target, $this->jump_targets)
|
||||||
|
// !empty($this->jump_targets[$target])
|
||||||
|
// also check if this is an alphanumeric string? css id compatible?
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (empty($info)) {
|
||||||
|
$info = 'Jump to: ' . $target;
|
||||||
|
}
|
||||||
|
$level = MessageLevel::fromName($level)->name;
|
||||||
|
$this->jump_targets[$target] = [
|
||||||
|
'info' => $info,
|
||||||
|
'level' => $level,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
@@ -177,7 +256,7 @@ class ErrorMessage
|
|||||||
* Gets the LAST entry in the array list.
|
* Gets the LAST entry in the array list.
|
||||||
* If nothing found returns empty array set
|
* If nothing found returns empty array set
|
||||||
*
|
*
|
||||||
* @return array{id:string,level:string,str:string,target:string,highlight:string[]} Error block
|
* @return array{id:string,level:string,str:string,target:string,target:string,highlight:string[]} Error block
|
||||||
*/
|
*/
|
||||||
public function getLastErrorMsg(): array
|
public function getLastErrorMsg(): array
|
||||||
{
|
{
|
||||||
@@ -186,9 +265,55 @@ class ErrorMessage
|
|||||||
'str' => '',
|
'str' => '',
|
||||||
'id' => '',
|
'id' => '',
|
||||||
'target' => '',
|
'target' => '',
|
||||||
|
'target_string' => '',
|
||||||
'highlight' => [],
|
'highlight' => [],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the jump target list
|
||||||
|
*
|
||||||
|
* @return array{}|array<int,array{target:string,info:string,level:string}> List of jump targets with info text,
|
||||||
|
* or empty array if not set
|
||||||
|
*/
|
||||||
|
public function getJumpTarget(): array
|
||||||
|
{
|
||||||
|
$_jump_target = [];
|
||||||
|
foreach ($this->jump_targets as $target => $jump) {
|
||||||
|
$_jump_target[] = array_merge(
|
||||||
|
$jump,
|
||||||
|
[
|
||||||
|
'target' => $target,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $_jump_target;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// FLAG SETTERS
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the log error flag
|
||||||
|
*
|
||||||
|
* @param bool $flag True to log level error too, False for do not (Default)
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setFlagLogError(bool $flag): void
|
||||||
|
{
|
||||||
|
$this->log_error = $flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current log error flag
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function getFlagLogError(): bool
|
||||||
|
{
|
||||||
|
return $this->log_error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ enum MessageLevel: int
|
|||||||
{
|
{
|
||||||
case ok = 100;
|
case ok = 100;
|
||||||
case info = 200;
|
case info = 200;
|
||||||
|
case notice = 250;
|
||||||
case warn = 300;
|
case warn = 300;
|
||||||
case error = 400;
|
case error = 400;
|
||||||
case abort = 500;
|
case abort = 500;
|
||||||
@@ -30,6 +31,7 @@ enum MessageLevel: int
|
|||||||
return match (strtolower($name)) {
|
return match (strtolower($name)) {
|
||||||
'ok' => self::ok,
|
'ok' => self::ok,
|
||||||
'info' => self::info,
|
'info' => self::info,
|
||||||
|
'notice' => self::notice,
|
||||||
'warn', 'warning' => self::warn,
|
'warn', 'warning' => self::warn,
|
||||||
'error' => self::error,
|
'error' => self::error,
|
||||||
'abort' => self::abort,
|
'abort' => self::abort,
|
||||||
@@ -46,6 +48,39 @@ enum MessageLevel: int
|
|||||||
{
|
{
|
||||||
return self::tryFrom($value) ?? self::unknown;
|
return self::tryFrom($value) ?? self::unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the passed $level is higher or equal to $this
|
||||||
|
*
|
||||||
|
* @param MessageLevel $level
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function includes(MessageLevel $level): bool
|
||||||
|
{
|
||||||
|
return $this->value <= $level->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If level is higher than set one
|
||||||
|
*
|
||||||
|
* @param MessageLevel $level
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isHigherThan(MessageLevel $level): bool
|
||||||
|
{
|
||||||
|
return $this->value > $level->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if level is lower than set one
|
||||||
|
*
|
||||||
|
* @param MessageLevel $level
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isLowerThan(MessageLevel $level): bool
|
||||||
|
{
|
||||||
|
return $this->value < $level->value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
40
src/Output/Form/TableArrays/EditOrder.php
Normal file
40
src/Output/Form/TableArrays/EditOrder.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Output\Form\TableArrays;
|
||||||
|
|
||||||
|
class EditOrder implements Interface\TableArraysInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Output\Form\Generate */
|
||||||
|
private \CoreLibs\Output\Form\Generate $form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
* @param \CoreLibs\Output\Form\Generate $form base form class
|
||||||
|
*/
|
||||||
|
public function __construct(\CoreLibs\Output\Form\Generate $form)
|
||||||
|
{
|
||||||
|
$this->form = $form;
|
||||||
|
$this->form->log->debug('CLASS LOAD', __NAMESPACE__ . __CLASS__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOTE: this is a dummy array to just init the Form\Generate class and is not used for anything else
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setTableArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'table_array' => [
|
||||||
|
'-'
|
||||||
|
],
|
||||||
|
'table_name' => '-',
|
||||||
|
'load_query' => '',
|
||||||
|
'show_fields' => [],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -470,12 +470,20 @@ class Image
|
|||||||
*
|
*
|
||||||
* @param string $filename path + filename to rotate. This file must be writeable
|
* @param string $filename path + filename to rotate. This file must be writeable
|
||||||
* @return void
|
* @return void
|
||||||
|
* @throws \RuntimeException if exit_read_data is not found
|
||||||
|
* @throws \UnexpectedValueException if file name not writeable or file name not found
|
||||||
*/
|
*/
|
||||||
public static function correctImageOrientation(string $filename): void
|
public static function correctImageOrientation(string $filename): void
|
||||||
{
|
{
|
||||||
// function exists & file is writeable, else do nothing
|
// function exists & file is writeable, else do nothing
|
||||||
if (!function_exists('exif_read_data') || !is_writeable($filename)) {
|
if (!function_exists('exif_read_data')) {
|
||||||
return;
|
throw new \RuntimeException('Function \'exit_read_data\' does not exist');
|
||||||
|
}
|
||||||
|
if (!file_exists($filename) || !is_file($filename)) {
|
||||||
|
throw new \UnexpectedValueException('Missing image file: ' . $filename);
|
||||||
|
}
|
||||||
|
if (!is_writeable($filename)) {
|
||||||
|
throw new \UnexpectedValueException('File name is not writeable: ' . $filename);
|
||||||
}
|
}
|
||||||
[$inc_width, $inc_height, $img_type] = getimagesize($filename) ?: [0, 0, null];
|
[$inc_width, $inc_height, $img_type] = getimagesize($filename) ?: [0, 0, null];
|
||||||
// add @ to avoid "file not supported error"
|
// add @ to avoid "file not supported error"
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -3907,9 +3917,13 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
'id' => '51',
|
'id' => '51',
|
||||||
'error' => 'Max query call needs to be set to at least 1',
|
'error' => 'Max query call needs to be set to at least 1',
|
||||||
// run:: can be +1 if called in set and not direct
|
// run:: can be +1 if called in set and not direct
|
||||||
'source' => "/^include::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$/",
|
||||||
'pg_error' => '',
|
'pg_error' => '',
|
||||||
'msg' => '',
|
'message' => '',
|
||||||
|
'context' => [
|
||||||
|
'max_calls' => 0
|
||||||
|
]
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'trigger warning' => [
|
'trigger warning' => [
|
||||||
@@ -3942,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
|
||||||
@@ -3969,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,
|
||||||
@@ -4057,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
|
||||||
@@ -4140,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
|
||||||
@@ -4271,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
|
||||||
@@ -4329,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
|
||||||
@@ -4529,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
|
||||||
@@ -4874,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
|
||||||
@@ -5029,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
|
||||||
@@ -5157,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
|
||||||
|
|||||||
@@ -460,8 +460,8 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @cover ::getCallerFileLine
|
* @cover ::getCallerFileLine
|
||||||
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:"]
|
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:6434","phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php:6434"]
|
||||||
* @testdox getCallerFileLine check based on regex /[\w\-\/]/vendor/phpunit/phpunit/src/Framework/TestCase.php:\d+ [$_dataName]
|
* @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName]
|
||||||
*
|
*
|
||||||
* @param string $expected
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
@@ -469,7 +469,14 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
public function testGetCallerFileLine(): void
|
public function testGetCallerFileLine(): void
|
||||||
{
|
{
|
||||||
// regex prefix with path "/../" and then fixed vendor + \d+
|
// regex prefix with path "/../" and then fixed vendor + \d+
|
||||||
$regex = "/^\/[\w\-\/]+\/vendor\/phpunit\/phpunit\/src\/Framework\/TestCase.php:\d+$/";
|
// or phar start if phiev installed
|
||||||
|
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
|
||||||
|
$regex = "/^("
|
||||||
|
. "\/.*\/vendor\/phpunit\/phpunit\/src"
|
||||||
|
. "|"
|
||||||
|
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
|
||||||
|
. ")"
|
||||||
|
. "\/Framework\/TestCase.php:\d+$/";
|
||||||
$this->assertMatchesRegularExpression(
|
$this->assertMatchesRegularExpression(
|
||||||
$regex,
|
$regex,
|
||||||
Support::getCallerFileLine()
|
Support::getCallerFileLine()
|
||||||
@@ -514,27 +521,30 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
// add nothing
|
// add nothing
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
Support::getCallerMethodList(),
|
$compare,
|
||||||
'assert expected 10'
|
'assert expected 10'
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
// add one "run" before "runBare"
|
if ($compare[0] == 'include') {
|
||||||
// array_splice(
|
// add include at first
|
||||||
// $expected,
|
array_splice(
|
||||||
// 7,
|
$expected,
|
||||||
// 0,
|
0,
|
||||||
// ['run']
|
0,
|
||||||
// );
|
['include']
|
||||||
array_splice(
|
);
|
||||||
$expected,
|
} else {
|
||||||
0,
|
array_splice(
|
||||||
0,
|
$expected,
|
||||||
['include']
|
6,
|
||||||
);
|
0,
|
||||||
|
['run']
|
||||||
|
);
|
||||||
|
}
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
Support::getCallerMethodList(),
|
$compare,
|
||||||
'assert expected 11'
|
'assert expected 11'
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
@@ -554,7 +564,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
);
|
);
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
Support::getCallerMethodList(),
|
$compare,
|
||||||
'assert expected 12'
|
'assert expected 12'
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ final class CoreLibsGetSystemTest extends TestCase
|
|||||||
1 => 'phpunit',
|
1 => 'phpunit',
|
||||||
2 => 'phpunit',
|
2 => 'phpunit',
|
||||||
// NOTE: this can change, so it is a regex check
|
// NOTE: this can change, so it is a regex check
|
||||||
3 => "/^(\/?.*\/?)?vendor\/bin\/phpunit$/",
|
3 => "/^(\/?.*\/?)?(vendor\/bin|tools)\/phpunit$/",
|
||||||
],
|
],
|
||||||
'some path with extension' => [
|
'some path with extension' => [
|
||||||
0 => '/some/path/to/file.txt',
|
0 => '/some/path/to/file.txt',
|
||||||
|
|||||||
@@ -44,6 +44,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'str' => 'INFO',
|
'str' => 'INFO',
|
||||||
'expected' => 'info',
|
'expected' => 'info',
|
||||||
],
|
],
|
||||||
|
'notice' => [
|
||||||
|
'level' => 'notice',
|
||||||
|
'str' => 'NOTICE',
|
||||||
|
'expected' => 'notice',
|
||||||
|
],
|
||||||
'warn' => [
|
'warn' => [
|
||||||
'level' => 'warn',
|
'level' => 'warn',
|
||||||
'str' => 'WARN',
|
'str' => 'WARN',
|
||||||
@@ -91,12 +96,12 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
public function testErrorMessageLevelOk(string $level, string $str, string $expected): void
|
public function testErrorMessageLevelOk(string $level, string $str, string $expected): void
|
||||||
{
|
{
|
||||||
$log = new \CoreLibs\Logging\Logging([
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_file_id' => 'testErrorMessages',
|
'log_file_id' => 'testErrorMessagesLevelOk',
|
||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
'log_level' => Level::Debug,
|
'log_level' => Level::Error,
|
||||||
]);
|
]);
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setError(
|
$em->setMessage(
|
||||||
$level,
|
$level,
|
||||||
$str
|
$str
|
||||||
);
|
);
|
||||||
@@ -106,6 +111,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'str' => $str,
|
'str' => $str,
|
||||||
'id' => '',
|
'id' => '',
|
||||||
'target' => '',
|
'target' => '',
|
||||||
|
'target_style' => '',
|
||||||
'highlight' => [],
|
'highlight' => [],
|
||||||
],
|
],
|
||||||
$em->getLastErrorMsg()
|
$em->getLastErrorMsg()
|
||||||
@@ -122,9 +128,9 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
public function testErrorMessageOk(): void
|
public function testErrorMessageOk(): void
|
||||||
{
|
{
|
||||||
$log = new \CoreLibs\Logging\Logging([
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_file_id' => 'testErrorMessages',
|
'log_file_id' => 'testErrorMessagesOk',
|
||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
'log_level' => Level::Debug
|
'log_level' => Level::Error
|
||||||
]);
|
]);
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setErrorMsg(
|
$em->setErrorMsg(
|
||||||
@@ -139,6 +145,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'info',
|
'level' => 'info',
|
||||||
'str' => 'INFO MESSAGE',
|
'str' => 'INFO MESSAGE',
|
||||||
'target' => '',
|
'target' => '',
|
||||||
|
'target_style' => '',
|
||||||
'highlight' => [],
|
'highlight' => [],
|
||||||
],
|
],
|
||||||
$em->getLastErrorMsg()
|
$em->getLastErrorMsg()
|
||||||
@@ -154,6 +161,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'info',
|
'level' => 'info',
|
||||||
'str' => 'INFO MESSAGE',
|
'str' => 'INFO MESSAGE',
|
||||||
'target' => '',
|
'target' => '',
|
||||||
|
'target_style' => '',
|
||||||
'highlight' => [],
|
'highlight' => [],
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@@ -171,6 +179,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'error',
|
'level' => 'error',
|
||||||
'str' => 'ERROR MESSAGE',
|
'str' => 'ERROR MESSAGE',
|
||||||
'target' => '',
|
'target' => '',
|
||||||
|
'target_style' => '',
|
||||||
'highlight' => [],
|
'highlight' => [],
|
||||||
],
|
],
|
||||||
$em->getLastErrorMsg()
|
$em->getLastErrorMsg()
|
||||||
@@ -186,6 +195,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'info',
|
'level' => 'info',
|
||||||
'str' => 'INFO MESSAGE',
|
'str' => 'INFO MESSAGE',
|
||||||
'target' => '',
|
'target' => '',
|
||||||
|
'target_style' => '',
|
||||||
'highlight' => [],
|
'highlight' => [],
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -193,6 +203,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'error',
|
'level' => 'error',
|
||||||
'str' => 'ERROR MESSAGE',
|
'str' => 'ERROR MESSAGE',
|
||||||
'target' => '',
|
'target' => '',
|
||||||
|
'target_style' => '',
|
||||||
'highlight' => [],
|
'highlight' => [],
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@@ -200,14 +211,60 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function providerErrorMessageLog(): array
|
public function providerErrorMessageLog(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
'error, not logged' => [
|
||||||
|
'id' => '200',
|
||||||
|
'level' => 'error',
|
||||||
|
'str' => 'ERROR MESSAGE',
|
||||||
|
'message' => null,
|
||||||
|
'log_error' => null,
|
||||||
|
'expected' => '<ERROR> ERROR MESSAGE',
|
||||||
|
],
|
||||||
|
'error, logged' => [
|
||||||
|
'id' => '200',
|
||||||
|
'level' => 'error',
|
||||||
|
'str' => 'ERROR MESSAGE',
|
||||||
|
'message' => null,
|
||||||
|
'log_error' => true,
|
||||||
|
'expected' => '<ERROR> ERROR MESSAGE',
|
||||||
|
],
|
||||||
|
'error, logged, message' => [
|
||||||
|
'id' => '200',
|
||||||
|
'level' => 'error',
|
||||||
|
'str' => 'ERROR MESSAGE',
|
||||||
|
'message' => 'OTHER ERROR MESSAGE',
|
||||||
|
'log_error' => true,
|
||||||
|
'expected' => '<ERROR> OTHER ERROR MESSAGE',
|
||||||
|
],
|
||||||
|
'notice' => [
|
||||||
|
'id' => '100',
|
||||||
|
'level' => 'notice',
|
||||||
|
'str' => 'NOTICE MESSAGE',
|
||||||
|
'message' => null,
|
||||||
|
'log_error' => null,
|
||||||
|
'expected' => '<NOTICE> NOTICE MESSAGE',
|
||||||
|
],
|
||||||
|
'notice, message' => [
|
||||||
|
'id' => '100',
|
||||||
|
'level' => 'notice',
|
||||||
|
'str' => 'NOTICE MESSAGE',
|
||||||
|
'message' => 'OTHER NOTICE MESSAGE',
|
||||||
|
'log_error' => null,
|
||||||
|
'expected' => '<NOTICE> OTHER NOTICE MESSAGE',
|
||||||
|
],
|
||||||
'crash' => [
|
'crash' => [
|
||||||
'id' => '300',
|
'id' => '300',
|
||||||
'level' => 'crash',
|
'level' => 'crash',
|
||||||
'str' => 'CRASH MESSAGE',
|
'str' => 'CRASH MESSAGE',
|
||||||
'message' => null,
|
'message' => null,
|
||||||
|
'log_error' => null,
|
||||||
'expected' => '<ALERT> CRASH MESSAGE',
|
'expected' => '<ALERT> CRASH MESSAGE',
|
||||||
],
|
],
|
||||||
'crash, message' => [
|
'crash, message' => [
|
||||||
@@ -215,6 +272,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'crash',
|
'level' => 'crash',
|
||||||
'str' => 'CRASH MESSAGE',
|
'str' => 'CRASH MESSAGE',
|
||||||
'message' => 'OTHER CRASH MESSAGE',
|
'message' => 'OTHER CRASH MESSAGE',
|
||||||
|
'log_error' => null,
|
||||||
'expected' => '<ALERT> OTHER CRASH MESSAGE',
|
'expected' => '<ALERT> OTHER CRASH MESSAGE',
|
||||||
],
|
],
|
||||||
'abort' => [
|
'abort' => [
|
||||||
@@ -222,6 +280,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'abort',
|
'level' => 'abort',
|
||||||
'str' => 'ABORT MESSAGE',
|
'str' => 'ABORT MESSAGE',
|
||||||
'message' => null,
|
'message' => null,
|
||||||
|
'log_error' => null,
|
||||||
'expected' => '<CRITICAL> ABORT MESSAGE',
|
'expected' => '<CRITICAL> ABORT MESSAGE',
|
||||||
],
|
],
|
||||||
'abort, message' => [
|
'abort, message' => [
|
||||||
@@ -229,6 +288,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'abort',
|
'level' => 'abort',
|
||||||
'str' => 'ABORT MESSAGE',
|
'str' => 'ABORT MESSAGE',
|
||||||
'message' => 'OTHER ABORT MESSAGE',
|
'message' => 'OTHER ABORT MESSAGE',
|
||||||
|
'log_error' => null,
|
||||||
'expected' => '<CRITICAL> OTHER ABORT MESSAGE',
|
'expected' => '<CRITICAL> OTHER ABORT MESSAGE',
|
||||||
],
|
],
|
||||||
'unknown' => [
|
'unknown' => [
|
||||||
@@ -236,6 +296,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'wrong level',
|
'level' => 'wrong level',
|
||||||
'str' => 'WRONG LEVEL MESSAGE',
|
'str' => 'WRONG LEVEL MESSAGE',
|
||||||
'message' => null,
|
'message' => null,
|
||||||
|
'log_error' => null,
|
||||||
'expected' => '<EMERGENCY> WRONG LEVEL MESSAGE',
|
'expected' => '<EMERGENCY> WRONG LEVEL MESSAGE',
|
||||||
],
|
],
|
||||||
'unknown, message' => [
|
'unknown, message' => [
|
||||||
@@ -243,6 +304,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'level' => 'wrong level',
|
'level' => 'wrong level',
|
||||||
'str' => 'WRONG LEVEL MESSAGE',
|
'str' => 'WRONG LEVEL MESSAGE',
|
||||||
'message' => 'OTHER WRONG LEVEL MESSAGE',
|
'message' => 'OTHER WRONG LEVEL MESSAGE',
|
||||||
|
'log_error' => null,
|
||||||
'expected' => '<EMERGENCY> OTHER WRONG LEVEL MESSAGE',
|
'expected' => '<EMERGENCY> OTHER WRONG LEVEL MESSAGE',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
@@ -252,14 +314,82 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @dataProvider providerErrorMessageLog
|
* @dataProvider providerErrorMessageLog
|
||||||
* @testdox Test Log writing [$_dataName]
|
* @testdox Test Log writing with log level Error [$_dataName]
|
||||||
*
|
*
|
||||||
|
* @param string $id
|
||||||
|
* @param string $level
|
||||||
|
* @param string $str
|
||||||
|
* @param string|null $message
|
||||||
|
* @param bool|null $log_error
|
||||||
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testErrorMessageLog(string $id, string $level, string $str, ?string $message, string $expected)
|
public function testErrorMessageLogErrorLevel(
|
||||||
{
|
string $id,
|
||||||
|
string $level,
|
||||||
|
string $str,
|
||||||
|
?string $message,
|
||||||
|
?bool $log_error,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
$log = new \CoreLibs\Logging\Logging([
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_file_id' => 'testErrorMessages',
|
'log_file_id' => 'testErrorMessagesLogError',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_level' => Level::Notice,
|
||||||
|
'log_per_run' => true
|
||||||
|
]);
|
||||||
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
|
$em->setErrorMsg(
|
||||||
|
$id,
|
||||||
|
$level,
|
||||||
|
$str,
|
||||||
|
message: $message,
|
||||||
|
log_error: $log_error
|
||||||
|
);
|
||||||
|
$file_content = '';
|
||||||
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
|
$file_content = file_get_contents(
|
||||||
|
$log->getLogFolder() . $log->getLogFile()
|
||||||
|
) ?: '';
|
||||||
|
}
|
||||||
|
// if error, if null or false, it will not be logged
|
||||||
|
if ($level == 'error' && ($log_error === null || $log_error === false)) {
|
||||||
|
$this->assertStringNotContainsString(
|
||||||
|
$expected,
|
||||||
|
$file_content
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertStringContainsString(
|
||||||
|
$expected,
|
||||||
|
$file_content
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider providerErrorMessageLog
|
||||||
|
* @testdox Test Log writing with log Level Debug [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $id
|
||||||
|
* @param string $level
|
||||||
|
* @param string $str
|
||||||
|
* @param string|null $message
|
||||||
|
* @param bool|null $log_error
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testErrorMessageLogErrorDebug(
|
||||||
|
string $id,
|
||||||
|
string $level,
|
||||||
|
string $str,
|
||||||
|
?string $message,
|
||||||
|
?bool $log_error,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testErrorMessagesLogDebug',
|
||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
'log_level' => Level::Debug,
|
'log_level' => Level::Debug,
|
||||||
'log_per_run' => true
|
'log_per_run' => true
|
||||||
@@ -269,14 +399,104 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
$id,
|
$id,
|
||||||
$level,
|
$level,
|
||||||
$str,
|
$str,
|
||||||
message: $message
|
message: $message,
|
||||||
|
log_error: $log_error
|
||||||
);
|
);
|
||||||
$file_content = file_get_contents(
|
$file_content = '';
|
||||||
$log->getLogFolder() . $log->getLogFile()
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
) ?: '';
|
$file_content = file_get_contents(
|
||||||
$this->assertStringContainsString(
|
$log->getLogFolder() . $log->getLogFile()
|
||||||
$expected,
|
) ?: '';
|
||||||
$file_content
|
}
|
||||||
|
// if error, and log is debug level, only explicit false are not logged
|
||||||
|
if ($level == 'error' && $log_error === false) {
|
||||||
|
$this->assertStringNotContainsString(
|
||||||
|
$expected,
|
||||||
|
$file_content
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertStringContainsString(
|
||||||
|
$expected,
|
||||||
|
$file_content
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox Test jump target set and reporting
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJumpTarget(): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testErrorMessagesLogDebug',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_level' => Level::Debug,
|
||||||
|
'log_per_run' => true
|
||||||
|
]);
|
||||||
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
|
$em->setJumpTarget(
|
||||||
|
'target-f',
|
||||||
|
'Target text'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[
|
||||||
|
['target' => 'target-f', 'info' => 'Target text', 'level' => 'error']
|
||||||
|
],
|
||||||
|
$em->getJumpTarget()
|
||||||
|
);
|
||||||
|
// set same target, keep as before
|
||||||
|
$em->setJumpTarget(
|
||||||
|
'target-f',
|
||||||
|
'Other text'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[
|
||||||
|
['target' => 'target-f', 'info' => 'Target text', 'level' => 'error']
|
||||||
|
],
|
||||||
|
$em->getJumpTarget()
|
||||||
|
);
|
||||||
|
// add new now two messages
|
||||||
|
$em->setJumpTarget(
|
||||||
|
'target-s',
|
||||||
|
'More text'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[
|
||||||
|
['target' => 'target-f', 'info' => 'Target text', 'level' => 'error'],
|
||||||
|
['target' => 'target-s', 'info' => 'More text', 'level' => 'error'],
|
||||||
|
],
|
||||||
|
$em->getJumpTarget()
|
||||||
|
);
|
||||||
|
// add empty info
|
||||||
|
$em->setJumpTarget(
|
||||||
|
'target-e',
|
||||||
|
''
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[
|
||||||
|
['target' => 'target-f', 'info' => 'Target text', 'level' => 'error'],
|
||||||
|
['target' => 'target-s', 'info' => 'More text', 'level' => 'error'],
|
||||||
|
['target' => 'target-e', 'info' => 'Jump to: target-e', 'level' => 'error'],
|
||||||
|
],
|
||||||
|
$em->getJumpTarget()
|
||||||
|
);
|
||||||
|
// add through message
|
||||||
|
$em->setErrorMsg('E-101', 'abort', 'Abort message', jump_target:[
|
||||||
|
'target' => 'abort-target',
|
||||||
|
'info' => 'Abort error'
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
[
|
||||||
|
['target' => 'target-f', 'info' => 'Target text', 'level' => 'error'],
|
||||||
|
['target' => 'target-s', 'info' => 'More text', 'level' => 'error'],
|
||||||
|
['target' => 'target-e', 'info' => 'Jump to: target-e', 'level' => 'error'],
|
||||||
|
['target' => 'abort-target', 'info' => 'Abort error', 'level' => 'abort'],
|
||||||
|
],
|
||||||
|
$em->getJumpTarget()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
||||||
private const REGEX_BASE = "\[[\d\-\s\.:]+\]\s{1}" // date
|
private const REGEX_BASE = "\[[\d\-\s\.:]+\]\s{1}" // date
|
||||||
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
||||||
. "\[[\w\-\.\/]+:\d+\]\s{1}" // folder/file
|
. "\[(phar:\/\/)?[\w\-\.\/]+:\d+\]\s{1}" // folder/file [note phar:// is for phpunit]
|
||||||
. "\[\w+\]\s{1}" // run id
|
. "\[\w+\]\s{1}" // run id
|
||||||
. "{[\w\\\\]+((::|->)\w+)?}\s{1}"; // class
|
. "{[\w\\\\]+((::|->)\w+)?}\s{1}"; // class
|
||||||
|
|
||||||
|
|||||||
@@ -16,17 +16,89 @@ final class CoreLibsOutputImageTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @testdox Output\Image Class tests
|
* @covers ::createThumbnail
|
||||||
|
* @testdox createThumbnail checks
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testOutputImage()
|
public function testCreateThumbnail(): void
|
||||||
{
|
{
|
||||||
// $this->assertTrue(true, 'Output Image Tests not implemented');
|
// CONVERT does not exist
|
||||||
$this->markTestIncomplete(
|
$this->expectException(\RuntimeException::class);
|
||||||
'Output\Image Tests have not yet been implemented'
|
\CoreLibs\Output\Image::createThumbnail('do_not_exist.png', 200, 200);
|
||||||
|
// set convert
|
||||||
|
$paths = [
|
||||||
|
'/bin',
|
||||||
|
'/usr/bin',
|
||||||
|
'/usr/local/bin',
|
||||||
|
];
|
||||||
|
// find convert
|
||||||
|
foreach ($paths as $path) {
|
||||||
|
if (
|
||||||
|
file_exists($path . DIRECTORY_SEPARATOR . 'convert') &&
|
||||||
|
is_file($path . DIRECTORY_SEPARATOR . 'convert')
|
||||||
|
) {
|
||||||
|
// image magick convert location
|
||||||
|
define('CONVERT', $path . DIRECTORY_SEPARATOR . 'convert');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unset($paths);
|
||||||
|
// cannot set dummy file
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
\CoreLibs\Output\Image::createThumbnail('do_not_exist.png', 200, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::createThumbnailSimple
|
||||||
|
* @testdox createThumbnailSimple checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCreateThumbnailSimple(): void
|
||||||
|
{
|
||||||
|
// file does not exist
|
||||||
|
$this->expectException(\UnexpectedValueException::class);
|
||||||
|
\CoreLibs\Output\Image::createThumbnailSimple(
|
||||||
|
'do_not_exist.png',
|
||||||
|
200,
|
||||||
|
200,
|
||||||
|
cache_folder: '/tmp/',
|
||||||
|
web_folder: '/tmp/'
|
||||||
);
|
);
|
||||||
// $this->markTestSkipped('No implementation for Output\Image at the moment');
|
// cache folder is not dir
|
||||||
|
$this->expectException(\UnexpectedValueException::class);
|
||||||
|
\CoreLibs\Output\Image::createThumbnailSimple(
|
||||||
|
'do_not_exist.png',
|
||||||
|
200,
|
||||||
|
200,
|
||||||
|
cache_folder: '/foo/bar/',
|
||||||
|
web_folder: '/tmp/'
|
||||||
|
);
|
||||||
|
// target cache folder is not writeable
|
||||||
|
|
||||||
|
// RuntimeException: imagecreatetruecolor failed
|
||||||
|
// RuntimeException: imagecolorallocatealpha failed
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::correctImageOrientation
|
||||||
|
* @testdox correctImageOrientation checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCorrectImageOrientation(): void
|
||||||
|
{
|
||||||
|
// test file does not exist
|
||||||
|
$this->expectException(\UnexpectedValueException::class);
|
||||||
|
\CoreLibs\Output\Image::correctImageOrientation('do_not_exist.png');
|
||||||
|
// test folder not writeable
|
||||||
|
// test exit_read_data not present (how)?
|
||||||
|
// test image rotate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
15
test/phpunit/bootstrap.php
Normal file
15
test/phpunit/bootstrap.php
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$set = 0;
|
||||||
|
foreach (['/../../www', '/../www', '/../..', '/..', '/../../src', '/../src'] as $src) {
|
||||||
|
if (is_file(dirname(__DIR__) . $src . '/vendor/autoload.php')) {
|
||||||
|
require dirname(__DIR__) . $src . '/vendor/autoload.php';
|
||||||
|
$set = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$set) {
|
||||||
|
die("Cannot find /vendor/autoload.php in reference to: " . dirname(__DIR__));
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
1
tools/phan
Symbolic link
1
tools/phan
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/home/clemens/.phive/phars/phan-5.4.2.phar
|
||||||
1
tools/phpcbf
Symbolic link
1
tools/phpcbf
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/home/clemens/.phive/phars/phpcbf-3.7.2.phar
|
||||||
1
tools/phpcs
Symbolic link
1
tools/phpcs
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/home/clemens/.phive/phars/phpcs-3.7.2.phar
|
||||||
1
tools/phpstan
Symbolic link
1
tools/phpstan
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/home/clemens/.phive/phars/phpstan-1.10.37.phar
|
||||||
1
tools/phpunit
Symbolic link
1
tools/phpunit
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/home/clemens/.phive/phars/phpunit-9.6.13.phar
|
||||||
1
tools/psalm
Symbolic link
1
tools/psalm
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/home/clemens/.phive/phars/psalm-5.15.0.phar
|
||||||
Reference in New Issue
Block a user