Compare commits
14 Commits
v9.31.1
...
5c6a5c2d20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c6a5c2d20 | ||
|
|
074d5bed4c | ||
|
|
93cb7e0cab | ||
|
|
7fbce6529b | ||
|
|
6e086fe7b3 | ||
|
|
0ec19d5b75 | ||
|
|
8134da349f | ||
|
|
8396f7856b | ||
|
|
b18866077e | ||
|
|
b033a718ad | ||
|
|
51e3cc7c7f | ||
|
|
b7935dcb71 | ||
|
|
89e8f79cae | ||
|
|
1a027e5c7d |
@@ -12,6 +12,8 @@ Not yet covered tests:
|
|||||||
- loginGetLocale
|
- loginGetLocale
|
||||||
- loginGetHeaderColor
|
- loginGetHeaderColor
|
||||||
- loginGetPages
|
- loginGetPages
|
||||||
|
- loginGetPageLookupList
|
||||||
|
- loginPageAccessAllowed
|
||||||
- loginGetEuid
|
- loginGetEuid
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1286,6 +1286,118 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* provider for arrayModifyKey
|
||||||
|
*
|
||||||
|
* @return array<string,array<mixed>>
|
||||||
|
*/
|
||||||
|
public function providerArrayModifyKey(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'prefix and suffix add' => [
|
||||||
|
'array' => [
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar',
|
||||||
|
],
|
||||||
|
'prefix' => 'Prefix: ',
|
||||||
|
'suffix' => '.suffix',
|
||||||
|
'expected' => [
|
||||||
|
'Prefix: a.suffix' => 'foo',
|
||||||
|
'Prefix: b.suffix' => 'bar',
|
||||||
|
'Prefix: c.suffix' => 'foobar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'prefix add only' => [
|
||||||
|
'array' => [
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar',
|
||||||
|
],
|
||||||
|
'prefix' => 'Prefix: ',
|
||||||
|
'suffix' => '',
|
||||||
|
'expected' => [
|
||||||
|
'Prefix: a' => 'foo',
|
||||||
|
'Prefix: b' => 'bar',
|
||||||
|
'Prefix: c' => 'foobar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'suffix add only' => [
|
||||||
|
'array' => [
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar',
|
||||||
|
],
|
||||||
|
'prefix' => '',
|
||||||
|
'suffix' => '.suffix',
|
||||||
|
'expected' => [
|
||||||
|
'a.suffix' => 'foo',
|
||||||
|
'b.suffix' => 'bar',
|
||||||
|
'c.suffix' => 'foobar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'empty array' => [
|
||||||
|
'array' => [],
|
||||||
|
'prefix' => '',
|
||||||
|
'suffix' => '.suffix',
|
||||||
|
'expected' => [],
|
||||||
|
],
|
||||||
|
'no suffix or prefix' => [
|
||||||
|
'array' => [
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar',
|
||||||
|
],
|
||||||
|
'prefix' => '',
|
||||||
|
'suffix' => '',
|
||||||
|
'expected' => [
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'integer index mixed' => [
|
||||||
|
'array' => [
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
3 => 'foobar',
|
||||||
|
],
|
||||||
|
'prefix' => '',
|
||||||
|
'suffix' => '.suffix',
|
||||||
|
'expected' => [
|
||||||
|
'a.suffix' => 'foo',
|
||||||
|
'b.suffix' => 'bar',
|
||||||
|
'3.suffix' => 'foobar',
|
||||||
|
],
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::arrayModifyKey
|
||||||
|
* @dataProvider providerArrayModifyKey
|
||||||
|
* @testdox arrayModifyKey check that key is correctly modified with $key_mod_prefix and $key_mod_suffix [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array<mixed> $in_array
|
||||||
|
* @param string $key_mod_prefix
|
||||||
|
* @param string $key_mod_suffix
|
||||||
|
* @param array<mixed> $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testArrayModifyKey(
|
||||||
|
array $in_array,
|
||||||
|
string $key_mod_prefix,
|
||||||
|
string $key_mod_suffix,
|
||||||
|
array $expected
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
\CoreLibs\Combined\ArrayHandler::arrayModifyKey($in_array, $key_mod_prefix, $key_mod_suffix),
|
||||||
|
$expected
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
46
4dev/tests/DB/CoreLibsDBSqLiteTest.php
Normal file
46
4dev/tests/DB/CoreLibsDBSqLiteTest.php
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for DB\SqLite
|
||||||
|
* This will only test the SqLite parts
|
||||||
|
* @coversDefaultClass \CoreLibs\DB\SqLite
|
||||||
|
* @testdox \CoreLibs\SqLite method tests for extended DB interface
|
||||||
|
*/
|
||||||
|
final class CoreLibsDBESqLiteTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
if (!extension_loaded('sqlite')) {
|
||||||
|
$this->markTestSkipped(
|
||||||
|
'The SqLite extension is not available.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox DB\SqLite Class tests
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSqLite()
|
||||||
|
{
|
||||||
|
$this->markTestIncomplete(
|
||||||
|
'DB\SqLite Tests have not yet been implemented'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -263,6 +263,8 @@ $out = array_intersect_key(
|
|||||||
);
|
);
|
||||||
print "array intersect key: " . DgS::printAr($keys) . ": " . DgS::printAr($out) . "<br>";
|
print "array intersect key: " . DgS::printAr($keys) . ": " . DgS::printAr($out) . "<br>";
|
||||||
|
|
||||||
|
print "array + suffix: " . DgS::printAr(ArrayHandler::arrayModifyKey($array, key_mod_suffix:'_attached')) . "<br>";
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
157
www/admin/class_test.db.sqlite.php
Normal file
157
www/admin/class_test.db.sqlite.php
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
// turn on all error reporting
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', true);
|
||||||
|
define('DATABASE', 'sqlite' . DIRECTORY_SEPARATOR);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-db';
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
$sql_file = BASE . MEDIA . DATABASE . "class_test.db.sqlite.sq3";
|
||||||
|
|
||||||
|
use CoreLibs\DB\SqLite;
|
||||||
|
use CoreLibs\Debug\Support;
|
||||||
|
use CoreLibs\Convert\SetVarType;
|
||||||
|
|
||||||
|
$log = new CoreLibs\Logging\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'log_file_id' => $LOG_FILE_ID,
|
||||||
|
'log_per_date' => true,
|
||||||
|
]);
|
||||||
|
// db connection and attach logger
|
||||||
|
$db = new CoreLibs\DB\SqLite($log, "sqlite:" . $sql_file);
|
||||||
|
$db->log->debug('START', '=============================>');
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: DB: SqLite';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title></head>";
|
||||||
|
print "<body>";
|
||||||
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
echo "Create Tables on demand<br>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS test (
|
||||||
|
test_id INTEGER PRIMARY KEY,
|
||||||
|
c_text TEXT,
|
||||||
|
c_integer INTEGER,
|
||||||
|
c_integer_default INTEGER DEFAULT -1,
|
||||||
|
c_bool BOOLEAN,
|
||||||
|
c_datetime TEXT,
|
||||||
|
c_datetime_microseconds TEXT,
|
||||||
|
c_datetime_default TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
c_date TEXT,
|
||||||
|
c_julian REAL,
|
||||||
|
c_unixtime DATETIME,
|
||||||
|
c_unixtime_alt DATETIME,
|
||||||
|
c_numeric NUMERIC,
|
||||||
|
c_real REAL,
|
||||||
|
c_blob
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExec($query);
|
||||||
|
// **********************
|
||||||
|
$query = <<<SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS test_no_pk (
|
||||||
|
c_text TEXT,
|
||||||
|
c_integer INTEGER
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExec($query);
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
$table = 'test';
|
||||||
|
echo "Table info for: " . $table . "<br>";
|
||||||
|
|
||||||
|
if (($table_info = $db->dbShowTableMetaData($table)) === false) {
|
||||||
|
print "Read problem for: $table<br>";
|
||||||
|
} else {
|
||||||
|
print "TABLE INFO: <pre>" . print_r($table_info, true) . "</pre><br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
echo "Insert into 'test'<br>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
INSERT INTO test (
|
||||||
|
c_text, c_integer, c_bool,
|
||||||
|
c_datetime, c_datetime_microseconds, c_date,
|
||||||
|
c_julian, c_unixtime, c_unixtime_alt,
|
||||||
|
c_numeric, c_real, c_blob
|
||||||
|
) VALUES (
|
||||||
|
?, ?, ?,
|
||||||
|
?, ?, ?,
|
||||||
|
julianday(?), ?, unixepoch(?),
|
||||||
|
?, ?, ?
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExecParams($query, [
|
||||||
|
'test', rand(1, 100), true,
|
||||||
|
date('Y-m-d H:i:s'), date_format(date_create("now"), 'Y-m-d H:i:s.u'), date('Y-m-d'),
|
||||||
|
// julianday pass through
|
||||||
|
date('Y-m-d H:i:s'),
|
||||||
|
// use "U" if no unixepoch in query
|
||||||
|
date('U'), date('Y-m-d H:i:s'),
|
||||||
|
1.5, 10.5, 'Anything'
|
||||||
|
]);
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
echo "Insert into 'test_no_pk'<br>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
INSERT INTO test_no_pk (
|
||||||
|
c_text, c_integer
|
||||||
|
) VALUES (
|
||||||
|
?, ?
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExecParams($query, ['test no pk', rand(100, 200)]);
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
SELECT test_id, c_text, c_integer, c_integer_default, c_datetime_default
|
||||||
|
FROM test
|
||||||
|
SQL;
|
||||||
|
while (is_array($row = $db->dbReturnArray($query))) {
|
||||||
|
print "ROW: PK(test_id): " . $row["test_id"]
|
||||||
|
. ", Text: " . $row["c_text"] . ", Int: " . $row["c_integer"]
|
||||||
|
. ", Int Default: " . $row["c_integer_default"]
|
||||||
|
. ", Date Default: " . $row["c_datetime_default"]
|
||||||
|
. "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "<hr>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
SELECT rowid, c_text, c_integer
|
||||||
|
FROM test_no_pk
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
while (is_array($row = $db->dbReturnArray($query))) {
|
||||||
|
print "ROW[CURSOR]: PK(rowid): " . $row["rowid"]
|
||||||
|
. ", Text: " . $row["c_text"] . ", Int: " . $row["c_integer"]
|
||||||
|
. "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -31,6 +31,7 @@ $log = new CoreLibs\Logging\Logging([
|
|||||||
'log_per_date' => true,
|
'log_per_date' => true,
|
||||||
]);
|
]);
|
||||||
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||||
|
$log->setLogFileId('classTest-login-override');
|
||||||
$login = new CoreLibs\ACL\Login(
|
$login = new CoreLibs\ACL\Login(
|
||||||
$db,
|
$db,
|
||||||
$log,
|
$log,
|
||||||
@@ -45,6 +46,7 @@ $login = new CoreLibs\ACL\Login(
|
|||||||
'locale_path' => BASE . INCLUDES . LOCALE,
|
'locale_path' => BASE . INCLUDES . LOCALE,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
$log->setLogFileId($LOG_FILE_ID);
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
$login->loginMainCall();
|
$login->loginMainCall();
|
||||||
|
|
||||||
@@ -127,6 +129,12 @@ if (isset($login->loginGetAcl()['unit'])) {
|
|||||||
// IP check: 'REMOTE_ADDR', 'HTTP_X_FORWARDED_FOR', 'CLIENT_IP' in _SERVER
|
// IP check: 'REMOTE_ADDR', 'HTTP_X_FORWARDED_FOR', 'CLIENT_IP' in _SERVER
|
||||||
// Agent check: 'HTTP_USER_AGENT'
|
// Agent check: 'HTTP_USER_AGENT'
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
print "PAGE lookup:<br>";
|
||||||
|
$file_name = 'test_edit_base.php';
|
||||||
|
print "Access to '$file_name': " . $log->prAr($login->loginPageAccessAllowed($file_name)) . "<br>";
|
||||||
|
$file_name = 'i_do_not_exists.php';
|
||||||
|
print "Access to '$file_name': " . $log->prAr($login->loginPageAccessAllowed($file_name)) . "<br>";
|
||||||
|
|
||||||
echo "<hr>";
|
echo "<hr>";
|
||||||
print "SESSION: " . Support::printAr($_SESSION) . "<br>";
|
print "SESSION: " . Support::printAr($_SESSION) . "<br>";
|
||||||
@@ -152,5 +160,6 @@ if (is_string($edit_access_cuid)) {
|
|||||||
print "EA ID: " . $edit_access_id . "<br>";
|
print "EA ID: " . $edit_access_id . "<br>";
|
||||||
print "EA CUID: " . $log->prAr($edit_access_cuid) . "<br>";
|
print "EA CUID: " . $log->prAr($edit_access_cuid) . "<br>";
|
||||||
print "REV EA CUID: " . $log->prAr($edit_access_id_rev) . "<br>";
|
print "REV EA CUID: " . $log->prAr($edit_access_id_rev) . "<br>";
|
||||||
|
$log->info('This is a test');
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|||||||
@@ -924,7 +924,9 @@ class Login
|
|||||||
$mandatory_session_vars = [
|
$mandatory_session_vars = [
|
||||||
'LOGIN_USER_NAME', 'LOGIN_GROUP_NAME', 'LOGIN_EUCUID', 'LOGIN_EUCUUID',
|
'LOGIN_USER_NAME', 'LOGIN_GROUP_NAME', 'LOGIN_EUCUID', 'LOGIN_EUCUUID',
|
||||||
'LOGIN_USER_ADDITIONAL_ACL', 'LOGIN_GROUP_ADDITIONAL_ACL',
|
'LOGIN_USER_ADDITIONAL_ACL', 'LOGIN_GROUP_ADDITIONAL_ACL',
|
||||||
'LOGIN_ADMIN', 'LOGIN_GROUP_ACL_LEVEL', 'LOGIN_PAGES_ACL_LEVEL', 'LOGIN_USER_ACL_LEVEL',
|
'LOGIN_ADMIN', 'LOGIN_GROUP_ACL_LEVEL',
|
||||||
|
'LOGIN_PAGES', 'LOGIN_PAGES_LOOKUP', 'LOGIN_PAGES_ACL_LEVEL',
|
||||||
|
'LOGIN_USER_ACL_LEVEL',
|
||||||
'LOGIN_UNIT', 'LOGIN_UNIT_DEFAULT_EACUID'
|
'LOGIN_UNIT', 'LOGIN_UNIT_DEFAULT_EACUID'
|
||||||
];
|
];
|
||||||
$force_reauth = false;
|
$force_reauth = false;
|
||||||
@@ -1152,7 +1154,7 @@ class Login
|
|||||||
$q
|
$q
|
||||||
);
|
);
|
||||||
// reset any query data that might exist
|
// reset any query data that might exist
|
||||||
$this->db->dbCacheReset($q, $params);
|
$this->db->dbCacheReset($q, $params, show_warning:false);
|
||||||
// never cache return data
|
// never cache return data
|
||||||
$res = $this->db->dbReturnParams($q, $params, $this->db::NO_CACHE);
|
$res = $this->db->dbReturnParams($q, $params, $this->db::NO_CACHE);
|
||||||
// query was not run successful
|
// query was not run successful
|
||||||
@@ -1264,6 +1266,7 @@ class Login
|
|||||||
}
|
}
|
||||||
$edit_page_ids = [];
|
$edit_page_ids = [];
|
||||||
$pages = [];
|
$pages = [];
|
||||||
|
$pages_lookup = [];
|
||||||
$pages_acl = [];
|
$pages_acl = [];
|
||||||
// set pages access
|
// set pages access
|
||||||
$q = <<<SQL
|
$q = <<<SQL
|
||||||
@@ -1307,6 +1310,7 @@ class Login
|
|||||||
'query' => [],
|
'query' => [],
|
||||||
'visible' => []
|
'visible' => []
|
||||||
];
|
];
|
||||||
|
$pages_lookup[$res['filename']] = $res['cuid'];
|
||||||
// make reference filename -> level
|
// make reference filename -> level
|
||||||
$pages_acl[$res['filename']] = $res['level'];
|
$pages_acl[$res['filename']] = $res['level'];
|
||||||
} // for each page
|
} // for each page
|
||||||
@@ -1367,6 +1371,7 @@ class Login
|
|||||||
// write back the pages data to the output array
|
// write back the pages data to the output array
|
||||||
$this->session->setMany([
|
$this->session->setMany([
|
||||||
'LOGIN_PAGES' => $pages,
|
'LOGIN_PAGES' => $pages,
|
||||||
|
'LOGIN_PAGES_LOOKUP' => $pages_lookup,
|
||||||
'LOGIN_PAGES_ACL_LEVEL' => $pages_acl,
|
'LOGIN_PAGES_ACL_LEVEL' => $pages_acl,
|
||||||
]);
|
]);
|
||||||
// load the edit_access user rights
|
// load the edit_access user rights
|
||||||
@@ -1526,6 +1531,8 @@ class Login
|
|||||||
) {
|
) {
|
||||||
$this->acl['page'] = $_SESSION['LOGIN_PAGES_ACL_LEVEL'][$this->page_name];
|
$this->acl['page'] = $_SESSION['LOGIN_PAGES_ACL_LEVEL'][$this->page_name];
|
||||||
}
|
}
|
||||||
|
$this->acl['pages_detail'] = $_SESSION['LOGIN_PAGES'];
|
||||||
|
$this->acl['pages_lookup_cuid'] = $_SESSION['LOGIN_PAGES_LOOKUP'];
|
||||||
|
|
||||||
$this->acl['unit_cuid'] = null;
|
$this->acl['unit_cuid'] = null;
|
||||||
$this->acl['unit_name'] = null;
|
$this->acl['unit_name'] = null;
|
||||||
@@ -2728,6 +2735,31 @@ HTML;
|
|||||||
return $this->session->get('LOGIN_PAGES');
|
return $this->session->get('LOGIN_PAGES');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the current loaded list of pages the user can access
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function loginGetPageLookupList(): array
|
||||||
|
{
|
||||||
|
return $this->session->get('LOGIN_PAGES_LOOKUP');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check access to a file in the pages list
|
||||||
|
*
|
||||||
|
* @param string $filename File name to check
|
||||||
|
* @return bool True if page in list and anything other than None access, False if failed
|
||||||
|
*/
|
||||||
|
public function loginPageAccessAllowed(string $filename): bool
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
$this->session->get('LOGIN_PAGES')[
|
||||||
|
$this->session->get('LOGIN_PAGES_LOOKUP')[$filename] ?? ''
|
||||||
|
] ?? 0
|
||||||
|
) != 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: logged in uid(pk)/eucuid/eucuuid
|
// MARK: logged in uid(pk)/eucuid/eucuuid
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -551,6 +551,36 @@ class ArrayHandler
|
|||||||
ARRAY_FILTER_USE_KEY
|
ARRAY_FILTER_USE_KEY
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modifieds the key of an array with a prefix and/or suffix and returns it with the original value
|
||||||
|
* does not change order in array
|
||||||
|
*
|
||||||
|
* @param array<string|int,mixed> $in_array
|
||||||
|
* @param string $key_mod_prefix [default=''] key prefix string
|
||||||
|
* @param string $key_mod_suffix [default=''] key suffix string
|
||||||
|
* @return array<string|int,mixed>
|
||||||
|
*/
|
||||||
|
public static function arrayModifyKey(
|
||||||
|
array $in_array,
|
||||||
|
string $key_mod_prefix = '',
|
||||||
|
string $key_mod_suffix = ''
|
||||||
|
): array {
|
||||||
|
// skip if array is empty or neither prefix or suffix are set
|
||||||
|
if (
|
||||||
|
$in_array == [] ||
|
||||||
|
($key_mod_prefix == '' && $key_mod_suffix == '')
|
||||||
|
) {
|
||||||
|
return $in_array;
|
||||||
|
}
|
||||||
|
return array_combine(
|
||||||
|
array_map(
|
||||||
|
fn($key) => $key_mod_prefix . $key . $key_mod_suffix,
|
||||||
|
array_keys($in_array)
|
||||||
|
),
|
||||||
|
array_values($in_array)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
{
|
{
|
||||||
// main calss variables
|
// main calss variables
|
||||||
/** @var array<mixed> */
|
/** @var array<mixed> */
|
||||||
private 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 */
|
||||||
private string $table_name; // the table_name
|
private string $table_name = ''; // the table_name
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private 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 */
|
||||||
@@ -127,9 +127,9 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
public function getTableArray(bool $reset = false): array
|
public function getTableArray(bool $reset = false): array
|
||||||
{
|
{
|
||||||
if (!$reset) {
|
if (!$reset) {
|
||||||
return $this->table_array ?? [];
|
return $this->table_array;
|
||||||
}
|
}
|
||||||
$table_array = $this->table_array ?? [];
|
$table_array = $this->table_array;
|
||||||
reset($table_array);
|
reset($table_array);
|
||||||
return $table_array;
|
return $table_array;
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
*/
|
*/
|
||||||
public function getTableName(): string
|
public function getTableName(): string
|
||||||
{
|
{
|
||||||
return $this->table_name ?? '';
|
return $this->table_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2544,7 +2544,10 @@ class IO
|
|||||||
} // only go if NO cursor exists
|
} // only go if NO cursor exists
|
||||||
|
|
||||||
// if cursor exists ...
|
// if cursor exists ...
|
||||||
if ($this->cursor_ext[$query_hash]['cursor']) {
|
if (
|
||||||
|
$this->cursor_ext[$query_hash]['cursor'] instanceof \PgSql\Result ||
|
||||||
|
$this->cursor_ext[$query_hash]['cursor'] == 1
|
||||||
|
) {
|
||||||
if ($first_call === true) {
|
if ($first_call === true) {
|
||||||
$this->cursor_ext[$query_hash]['log'][] = 'First call';
|
$this->cursor_ext[$query_hash]['log'][] = 'First call';
|
||||||
// count the rows returned (if select)
|
// count the rows returned (if select)
|
||||||
@@ -2942,12 +2945,14 @@ class IO
|
|||||||
* data to create a unique call one, optional
|
* data to create a unique call one, optional
|
||||||
* @return bool False if query not found, true if success
|
* @return bool False if query not found, true if success
|
||||||
*/
|
*/
|
||||||
public function dbCacheReset(string $query, array $params = []): bool
|
public function dbCacheReset(string $query, array $params = [], bool $show_warning = true): bool
|
||||||
{
|
{
|
||||||
$this->__dbErrorReset();
|
|
||||||
$query_hash = $this->dbBuildQueryHash($query, $params);
|
$query_hash = $this->dbBuildQueryHash($query, $params);
|
||||||
// clears cache for this query
|
// clears cache for this query
|
||||||
if (empty($this->cursor_ext[$query_hash]['query'])) {
|
if (
|
||||||
|
$show_warning &&
|
||||||
|
empty($this->cursor_ext[$query_hash]['query'])
|
||||||
|
) {
|
||||||
$this->__dbWarning(18, context: [
|
$this->__dbWarning(18, context: [
|
||||||
'query' => $query,
|
'query' => $query,
|
||||||
'params' => $params,
|
'params' => $params,
|
||||||
|
|||||||
90
www/lib/CoreLibs/DB/Interface/DatabaseInterface.php
Normal file
90
www/lib/CoreLibs/DB/Interface/DatabaseInterface.php
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AUTHOR: Clemens Schwaighofer
|
||||||
|
* CREATED: Ymd
|
||||||
|
* DESCRIPTION:
|
||||||
|
* DescriptionHere
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\DB\Interface;
|
||||||
|
|
||||||
|
interface DatabaseInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Table meta data
|
||||||
|
* Note that if columns have multi
|
||||||
|
*
|
||||||
|
* @param string $table
|
||||||
|
* @return array<array<string,mixed>>|false
|
||||||
|
*/
|
||||||
|
public function dbShowTableMetaData(string $table): array|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for reading or simple execution, no return data
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return int|false
|
||||||
|
*/
|
||||||
|
public function dbExec(string $query): int|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a simple query and return its statement
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbQuery(string $query): \PDOStatement|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute one query with params
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbExecParams(string $query, array $params): \PDOStatement|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbPrepare(string $query): \PDOStatement|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* execute a cursor
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function dbCursorExecute(\PDOStatement $cursor, array $params): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return array with data, when finshed return false
|
||||||
|
* also returns false on error
|
||||||
|
*
|
||||||
|
* TODO: This is currently a one time run
|
||||||
|
* if the same query needs to be run again, the cursor_ext must be reest
|
||||||
|
* with dbCacheReset
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return array<mixed>|false
|
||||||
|
*/
|
||||||
|
public function dbReturnArray(string $query, array $params = []): array|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get current db handler
|
||||||
|
* this is for raw access
|
||||||
|
*
|
||||||
|
* @return \PDO
|
||||||
|
*/
|
||||||
|
public function getDbh(): \PDO;
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
432
www/lib/CoreLibs/DB/SqLite.php
Normal file
432
www/lib/CoreLibs/DB/SqLite.php
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AUTHOR: Clemens Schwaighofer
|
||||||
|
* CREATED: 2024/8/21
|
||||||
|
* DESCRIPTION:
|
||||||
|
* SQL Lite interface
|
||||||
|
* Note: This is a very simple library and in future should perhaps merge with the master
|
||||||
|
* CoreLibs SQL interface
|
||||||
|
*
|
||||||
|
* TODO: This should move to the CoreLibs\DB\IO class as a sub type for "sqlite" next to "pgsql"
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\DB;
|
||||||
|
|
||||||
|
use CoreLibs\Create\Hash;
|
||||||
|
|
||||||
|
class SqLite implements Interface\DatabaseInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Logging\Logging logging */
|
||||||
|
public \CoreLibs\Logging\Logging $log;
|
||||||
|
|
||||||
|
/** @var string database connection string */
|
||||||
|
private string $dsn;
|
||||||
|
/** @var \PDO database handler */
|
||||||
|
private \PDO $dbh;
|
||||||
|
/** @var PDOStatement|false one cursor, for internal handling */
|
||||||
|
// private \PDOStatement|false $cursor;
|
||||||
|
/** @var array<string,mixed> extended cursoers string index with content */
|
||||||
|
private array $cursor_ext = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init database system
|
||||||
|
*
|
||||||
|
* @param \CoreLibs\Logging\Logging $log
|
||||||
|
* @param string $dsn
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
\CoreLibs\Logging\Logging $log,
|
||||||
|
string $dsn
|
||||||
|
) {
|
||||||
|
$this->log = $log;
|
||||||
|
// open new connection
|
||||||
|
if ($this->__connectToDB($dsn) === false) {
|
||||||
|
throw new \ErrorException("Cannot load database: " . $dsn, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// MARK: PRIVATE METHODS
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a cursor dump with all info
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @return string|false
|
||||||
|
*/
|
||||||
|
private function __dbGetCursorDump(\PDOStatement $cursor): string|false
|
||||||
|
{
|
||||||
|
// get the cursor info
|
||||||
|
ob_start();
|
||||||
|
$cursor->debugDumpParams();
|
||||||
|
$cursor_dump = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
return $cursor_dump;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch rows from a cursor (post execute)
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @return array<mixed>|false
|
||||||
|
*/
|
||||||
|
private function __dbFetchArray(\PDOStatement $cursor): array|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// on empty array return false
|
||||||
|
// TODO make that more elegant?
|
||||||
|
return empty($row = $cursor->fetch(mode:\PDO::FETCH_NAMED)) ? false : $row;
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot fetch from cursor",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"DumpParams" => $this->__dbGetCursorDump($cursor),
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: open database
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open database
|
||||||
|
* reports errors for wrong DSN or failed connection
|
||||||
|
*
|
||||||
|
* @param string $dsn
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function __connectToDB(string $dsn): bool
|
||||||
|
{
|
||||||
|
// check if dsn starts with ":"
|
||||||
|
if (!str_starts_with($dsn, "sqlite:")) {
|
||||||
|
$this->log->error(
|
||||||
|
"Invalid dsn string",
|
||||||
|
[
|
||||||
|
"dsn" => $dsn
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// TODO: if not ":memory:" check if path to file is writeable by system
|
||||||
|
// avoid double open
|
||||||
|
if (!empty($this->dsn) && $dsn == $this->dsn && $this->dbh instanceof \PDO) {
|
||||||
|
$this->log->info(
|
||||||
|
"Connection already establisehd with this dsn",
|
||||||
|
[
|
||||||
|
"dsn" => $dsn,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// TODO: check that folder is writeable
|
||||||
|
// set DSN and open connection
|
||||||
|
$this->dsn = $dsn;
|
||||||
|
try {
|
||||||
|
$this->dbh = new \PDO($this->dsn);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot open database",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// MARK: PUBLIC METHODS
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
// MARK: db meta data (table info)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table meta data
|
||||||
|
* Note that if columns have multi
|
||||||
|
*
|
||||||
|
* @param string $table
|
||||||
|
* @return array<array<string,mixed>>|false
|
||||||
|
*/
|
||||||
|
public function dbShowTableMetaData(string $table): array|false
|
||||||
|
{
|
||||||
|
$table_info = [];
|
||||||
|
$query = <<<SQL
|
||||||
|
SELECT
|
||||||
|
ti.cid, ti.name, ti.type, ti.'notnull', ti.dflt_value, ti.pk,
|
||||||
|
il_ii.idx_name, il_ii.idx_unique, il_ii.idx_origin, il_ii.idx_partial
|
||||||
|
FROM
|
||||||
|
sqlite_schema AS m,
|
||||||
|
pragma_table_info(m.name) AS ti
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
il.name AS idx_name, il.'unique' AS idx_unique, il.origin AS idx_origin, il.partial AS idx_partial,
|
||||||
|
ii.cid AS tbl_cid
|
||||||
|
FROM
|
||||||
|
sqlite_schema AS m,
|
||||||
|
pragma_index_list(m.name) AS il,
|
||||||
|
pragma_index_info(il.name) AS ii
|
||||||
|
WHERE m.name = ?1
|
||||||
|
) AS il_ii ON (ti.cid = il_ii.tbl_cid)
|
||||||
|
WHERE
|
||||||
|
m.name = ?1
|
||||||
|
SQL;
|
||||||
|
while (is_array($row = $this->dbReturnArray($query, [$table]))) {
|
||||||
|
$table_info[] = [
|
||||||
|
'cid' => $row['cid'],
|
||||||
|
'name' => $row['name'],
|
||||||
|
'type' => $row['type'],
|
||||||
|
'notnull' => $row['notnull'],
|
||||||
|
'dflt_value' => $row['dflt_value'],
|
||||||
|
'pk' => $row['pk'],
|
||||||
|
'idx_name' => $row['idx_name'],
|
||||||
|
'idx_unique' => $row['idx_unique'],
|
||||||
|
'idx_origin' => $row['idx_origin'],
|
||||||
|
'idx_partial' => $row['idx_partial'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$table_info) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $table_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db exec
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for reading or simple execution, no return data
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return int|false
|
||||||
|
*/
|
||||||
|
public function dbExec(string $query): int|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return $this->dbh->exec($query);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot execute query",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"query" => $query,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db query
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a simple query and return its statement
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbQuery(string $query): \PDOStatement|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return $this->dbh->query($query, \PDO::FETCH_NAMED);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot run query",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"query" => $query,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db prepare & execute calls
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute one query with params
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbExecParams(string $query, array $params): \PDOStatement|false
|
||||||
|
{
|
||||||
|
// prepare query
|
||||||
|
if (($cursor = $this->dbPrepare($query)) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// execute the query, on failure return false
|
||||||
|
if ($this->dbCursorExecute($cursor, $params) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbPrepare(string $query): \PDOStatement|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// store query with cursor so we can reference?
|
||||||
|
return $this->dbh->prepare($query);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot open cursor",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"query" => $query,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* execute a cursor
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function dbCursorExecute(\PDOStatement $cursor, array $params): bool
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return $cursor->execute($params);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
// write error log
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot execute prepared query",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"params" => $params,
|
||||||
|
"DumpParams" => $this->__dbGetCursorDump($cursor),
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db return array
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns hash for query
|
||||||
|
* Hash is used in all internal storage systems for return data
|
||||||
|
*
|
||||||
|
* @param string $query The query to create the hash from
|
||||||
|
* @param array<mixed> $params If the query is params type we need params
|
||||||
|
* data to create a unique call one, optional
|
||||||
|
* @return string Hash, as set by hash long
|
||||||
|
*/
|
||||||
|
public function dbGetQueryHash(string $query, array $params = []): string
|
||||||
|
{
|
||||||
|
return Hash::__hashLong(
|
||||||
|
$query . (
|
||||||
|
$params !== [] ?
|
||||||
|
'#' . json_encode($params) : ''
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* resets all data stored to this query
|
||||||
|
* @param string $query The Query whose cache should be cleaned
|
||||||
|
* @param array<mixed> $params If the query is params type we need params
|
||||||
|
* data to create a unique call one, optional
|
||||||
|
* @return bool False if query not found, true if success
|
||||||
|
*/
|
||||||
|
public function dbCacheReset(string $query, array $params = []): bool
|
||||||
|
{
|
||||||
|
$query_hash = $this->dbGetQueryHash($query, $params);
|
||||||
|
// clears cache for this query
|
||||||
|
if (empty($this->cursor_ext[$query_hash]['query'])) {
|
||||||
|
$this->log->error('Cannot reset cursor_ext with given query and params', [
|
||||||
|
"query" => $query,
|
||||||
|
"params" => $params,
|
||||||
|
]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unset($this->cursor_ext[$query_hash]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return array with data, when finshed return false
|
||||||
|
* also returns false on error
|
||||||
|
*
|
||||||
|
* TODO: This is currently a one time run
|
||||||
|
* if the same query needs to be run again, the cursor_ext must be reest
|
||||||
|
* with dbCacheReset
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return array<mixed>|false
|
||||||
|
*/
|
||||||
|
public function dbReturnArray(string $query, array $params = []): array|false
|
||||||
|
{
|
||||||
|
$query_hash = $this->dbGetQueryHash($query, $params);
|
||||||
|
if (!isset($this->cursor_ext[$query_hash])) {
|
||||||
|
$this->cursor_ext[$query_hash] = [
|
||||||
|
// cursor null: unset, if set \PDOStatement
|
||||||
|
'cursor' => null,
|
||||||
|
// the query used in this call
|
||||||
|
'query' => $query,
|
||||||
|
// parameter
|
||||||
|
'params' => $params,
|
||||||
|
// how many rows have been read from db
|
||||||
|
'read_rows' => 0,
|
||||||
|
// when fetch array or cache read returns false
|
||||||
|
// in loop read that means dbReturn retuns false without error
|
||||||
|
'finished' => false,
|
||||||
|
];
|
||||||
|
if (!empty($params)) {
|
||||||
|
if (($cursor = $this->dbExecParams($query, $params)) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (($cursor = $this->dbQuery($query)) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->cursor_ext[$query_hash]['cursor'] = $cursor;
|
||||||
|
}
|
||||||
|
// flag finished if row is false
|
||||||
|
$row = $this->__dbFetchArray($this->cursor_ext[$query_hash]['cursor']);
|
||||||
|
if ($row === false) {
|
||||||
|
$this->cursor_ext[$query_hash]['finished'] = true;
|
||||||
|
} else {
|
||||||
|
$this->cursor_ext[$query_hash]['read_rows']++;
|
||||||
|
}
|
||||||
|
return $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK other interface
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get current db handler
|
||||||
|
* this is for raw access
|
||||||
|
*
|
||||||
|
* @return \PDO
|
||||||
|
*/
|
||||||
|
public function getDbh(): \PDO
|
||||||
|
{
|
||||||
|
return $this->dbh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -50,7 +50,8 @@ class EditUsers implements Interface\TableArraysInterface
|
|||||||
'HIDDEN_value' => $_POST['HIDDEN_password'] ?? '',
|
'HIDDEN_value' => $_POST['HIDDEN_password'] ?? '',
|
||||||
'CONFIRM_value' => $_POST['CONFIRM_password'] ?? '',
|
'CONFIRM_value' => $_POST['CONFIRM_password'] ?? '',
|
||||||
'output_name' => 'Password',
|
'output_name' => 'Password',
|
||||||
'mandatory' => 1,
|
// make it not mandatory to create dummy accounts that can only login via login url id
|
||||||
|
'mandatory' => 0,
|
||||||
'type' => 'password', // later has to be password for encryption in database
|
'type' => 'password', // later has to be password for encryption in database
|
||||||
'update' => [ // connected field updates, and update data
|
'update' => [ // connected field updates, and update data
|
||||||
'password_change_date' => [ // db row to update
|
'password_change_date' => [ // db row to update
|
||||||
|
|||||||
Reference in New Issue
Block a user