Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a6c65df0e | ||
|
|
24f553a17e | ||
|
|
9a3ea2f7db |
@@ -49,6 +49,24 @@ final class CoreLibsConvertStringsTest extends TestCase
|
||||
null,
|
||||
'12-34'
|
||||
],
|
||||
'string format trailing match' => [
|
||||
'1234',
|
||||
'2-2-',
|
||||
null,
|
||||
'12-34'
|
||||
],
|
||||
'string format leading match' => [
|
||||
'1234',
|
||||
'-2-2',
|
||||
null,
|
||||
'12-34'
|
||||
],
|
||||
'string format double inside match' => [
|
||||
'1234',
|
||||
'2--2',
|
||||
null,
|
||||
'12--34',
|
||||
],
|
||||
'string format short first' => [
|
||||
'1',
|
||||
'2-2',
|
||||
@@ -109,6 +127,12 @@ final class CoreLibsConvertStringsTest extends TestCase
|
||||
null,
|
||||
'あいうえ'
|
||||
],
|
||||
'mutltibyte split string' => [
|
||||
'1234',
|
||||
'2-2',
|
||||
null,
|
||||
'1234'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -148,6 +172,90 @@ final class CoreLibsConvertStringsTest extends TestCase
|
||||
$output
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function countSplitPartsProvider(): array
|
||||
{
|
||||
return [
|
||||
'0 elements' => [
|
||||
'',
|
||||
null,
|
||||
0
|
||||
],
|
||||
'1 element' => [
|
||||
'1',
|
||||
null,
|
||||
1,
|
||||
],
|
||||
'2 elements, trailing' => [
|
||||
'1-2-',
|
||||
null,
|
||||
2
|
||||
],
|
||||
'2 elements, leading' => [
|
||||
'-1-2',
|
||||
null,
|
||||
2
|
||||
],
|
||||
'2 elements, midde double' => [
|
||||
'1--2',
|
||||
null,
|
||||
2
|
||||
],
|
||||
'4 elements' => [
|
||||
'1-2-3-4',
|
||||
null,
|
||||
4
|
||||
],
|
||||
'3 elemenst, other splitter' => [
|
||||
'2-3_3',
|
||||
'-_',
|
||||
3
|
||||
],
|
||||
'illegal splitter' => [
|
||||
'あsdf',
|
||||
null,
|
||||
0
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* count split parts
|
||||
*
|
||||
* @covers ::countSplitParts
|
||||
* @dataProvider countSplitPartsProvider
|
||||
* @testdox countSplitParts $input with splitters $split_characters will be $expected [$_dataName]
|
||||
*
|
||||
* @param string $input
|
||||
* @param string|null $split_characters
|
||||
* @param int $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testCountSplitParts(
|
||||
string $input,
|
||||
?string $split_characters,
|
||||
int $expected
|
||||
): void {
|
||||
if ($split_characters === null) {
|
||||
$output = \CoreLibs\Convert\Strings::countSplitParts(
|
||||
$input
|
||||
);
|
||||
} else {
|
||||
$output = \CoreLibs\Convert\Strings::countSplitParts(
|
||||
$input,
|
||||
$split_characters
|
||||
);
|
||||
}
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$output
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -209,13 +209,12 @@ print "INSERT WITH NO PRIMARY KEY WITH RETURNING STATUS: " . Support::printToStr
|
||||
print "</pre>";
|
||||
|
||||
// READ PREPARE
|
||||
if (
|
||||
$db->dbPrepare(
|
||||
'sel_test_foo',
|
||||
"SELECT test_foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time "
|
||||
. "FROM test_foo ORDER BY test_foo_id DESC LIMIT 5"
|
||||
) === false
|
||||
) {
|
||||
$q_prep = "SELECT test_foo_id, test, some_bool, string_a, number_a, "
|
||||
. "number_a_numeric, some_time "
|
||||
. "FROM test_foo "
|
||||
. "WHERE test = $1 "
|
||||
. "ORDER BY test_foo_id DESC LIMIT 5";
|
||||
if ($db->dbPrepare('sel_test_foo', $q_prep) === false) {
|
||||
print "Error in sel_test_foo prepare<br>";
|
||||
} else {
|
||||
$max_rows = 6;
|
||||
@@ -229,6 +228,29 @@ if (
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
// prepre a second time on normal connection
|
||||
if ($db->dbPrepare('sel_test_foo', $q_prep) === false) {
|
||||
print "Error prepareing<br>";
|
||||
print "ERROR (dbPrepare on same query): "
|
||||
. $db->dbGetLastError() . "/" . $db->dbGetLastWarning() . "/"
|
||||
. "<pre>" . print_r($db->dbGetCombinedErrorHistory(), true) . "</pre><br>";
|
||||
}
|
||||
// NOTE: try to replacate connection still exists if script is run a second time
|
||||
// open pg bouncer connection
|
||||
$db_pgb = new CoreLibs\DB\IO($DB_CONFIG['test_pgbouncer'], $log);
|
||||
print "[PGB] DBINFO: " . $db_pgb->dbInfo() . "<br>";
|
||||
if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) {
|
||||
print "[PGB] [1] Error in pgb_sel_test_foo prepare<br>";
|
||||
} else {
|
||||
print "[PGB] [1] pgb_sel_test_foo prepare OK<br>";
|
||||
}
|
||||
// second prepare
|
||||
if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) {
|
||||
print "[PGB] [2] Error in pgb_sel_test_foo prepare<br>";
|
||||
} else {
|
||||
print "[PGB] [2] pgb_sel_test_foo prepare OK<br>";
|
||||
}
|
||||
$db_pgb->dbClose();
|
||||
|
||||
# db write class test
|
||||
$table = 'test_foo';
|
||||
|
||||
@@ -68,7 +68,15 @@ print "Convert: $string with $split to: "
|
||||
. \CoreLibs\Convert\Strings::splitFormatString($string, $split)
|
||||
. "<br>";
|
||||
|
||||
|
||||
$test_splits = [
|
||||
'',
|
||||
'2',
|
||||
'2-2',
|
||||
'2-3-4',
|
||||
];
|
||||
foreach ($test_splits as $split) {
|
||||
print "$split with count: " . \CoreLibs\Convert\Strings::countSplitParts($split) . "<br>";
|
||||
}
|
||||
|
||||
// error message
|
||||
print $log->printErrorMsg();
|
||||
|
||||
@@ -17,7 +17,20 @@ $DB_CONFIG = [
|
||||
'db_user' => $_ENV['DB_USER.TEST'] ?? '',
|
||||
'db_pass' => $_ENV['DB_PASS.TEST'] ?? '',
|
||||
'db_host' => $_ENV['DB_HOST.TEST'] ?? '',
|
||||
'db_port' => 5432,
|
||||
'db_port' => $_ENV['DB_PORT.PG'] ?? 5432,
|
||||
'db_schema' => 'public',
|
||||
'db_type' => 'pgsql',
|
||||
'db_encoding' => '',
|
||||
'db_ssl' => 'allow', // allow, disable, require, prefer
|
||||
'db_debug' => true, // turn on logging or not
|
||||
],
|
||||
// same as above, but uses pg bouncer
|
||||
'test_pgbouncer' => [
|
||||
'db_name' => $_ENV['DB_NAME.TEST'] ?? '',
|
||||
'db_user' => $_ENV['DB_USER.TEST'] ?? '',
|
||||
'db_pass' => $_ENV['DB_PASS.TEST'] ?? '',
|
||||
'db_host' => $_ENV['DB_HOST.TEST'] ?? '',
|
||||
'db_port' => $_ENV['DB_PORT.PG_BOUNCER'] ?? 5432,
|
||||
'db_schema' => 'public',
|
||||
'db_type' => 'pgsql',
|
||||
'db_encoding' => '',
|
||||
|
||||
@@ -252,7 +252,7 @@ if ($is_secure) {
|
||||
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
|
||||
define('DB_CONFIG', $DB_CONFIG[DB_CONFIG_NAME] ?? []);
|
||||
// because we can't change constant, but we want to for db debug flag
|
||||
$GLOBALS['DB_CONFIG'] = DB_CONFIG;
|
||||
$GLOBALS['DB_CONFIG_SET'] = DB_CONFIG;
|
||||
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
|
||||
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
|
||||
// override for login and global schemas
|
||||
|
||||
@@ -10,6 +10,39 @@ namespace CoreLibs\Convert;
|
||||
|
||||
class Strings
|
||||
{
|
||||
/**
|
||||
* return the number of elements in the split list
|
||||
* 0 if nothing / invalid split
|
||||
* 1 if no split character found
|
||||
* n for the numbers in the split list
|
||||
*
|
||||
* @param string $split_format
|
||||
* @param string $split_characters
|
||||
* @return int
|
||||
*/
|
||||
public static function countSplitParts(
|
||||
string $split_format,
|
||||
string $split_characters = '-'
|
||||
): int {
|
||||
if (
|
||||
empty($split_format) ||
|
||||
// non valid characters inside, abort
|
||||
!preg_match("/^[0-9" . $split_characters . "]/", $split_format) ||
|
||||
preg_match('/[^\x20-\x7e]/', $split_characters)
|
||||
) {
|
||||
return 0;
|
||||
}
|
||||
$split_list = preg_split(
|
||||
// allowed split characters
|
||||
"/([" . $split_characters . "]{1})/",
|
||||
$split_format
|
||||
);
|
||||
if (!is_array($split_list)) {
|
||||
return 0;
|
||||
}
|
||||
return count(array_filter($split_list));
|
||||
}
|
||||
|
||||
/**
|
||||
* split format a string base on a split format string
|
||||
* split format string is eg
|
||||
@@ -31,18 +64,19 @@ class Strings
|
||||
string $split_format,
|
||||
string $split_characters = '-'
|
||||
): string {
|
||||
// abort if split format is empty
|
||||
if (empty($split_format)) {
|
||||
if (
|
||||
// abort if split format is empty
|
||||
empty($split_format) ||
|
||||
// if not in the valid ASCII character range for any of the strings
|
||||
preg_match('/[^\x20-\x7e]/', $value) ||
|
||||
// preg_match('/[^\x20-\x7e]/', $split_format) ||
|
||||
preg_match('/[^\x20-\x7e]/', $split_characters) ||
|
||||
// only numbers and split characters in split_format
|
||||
!preg_match("/[0-9" . $split_characters . "]/", $split_format)
|
||||
) {
|
||||
return $value;
|
||||
}
|
||||
// if not in the valid ASCII character range
|
||||
// might need some tweaking
|
||||
if (preg_match('/[^\x20-\x7e]/', $value)) {
|
||||
return $value;
|
||||
}
|
||||
// if (!mb_check_encoding($value, 'ASCII')) {
|
||||
// return $value;
|
||||
// }
|
||||
// split format list
|
||||
$split_list = preg_split(
|
||||
// allowed split characters
|
||||
"/([" . $split_characters . "]{1})/",
|
||||
@@ -65,7 +99,7 @@ class Strings
|
||||
}
|
||||
$out .= $_part;
|
||||
$pos += (int)$offset;
|
||||
} else {
|
||||
} elseif ($pos) { // if first, do not add
|
||||
$out .= $offset;
|
||||
$last_split = $offset;
|
||||
}
|
||||
|
||||
@@ -2963,7 +2963,7 @@ class IO
|
||||
* Either as single array level for single insert
|
||||
* Or nested array for multiple insert values
|
||||
*
|
||||
* If key was set only returns tghose values directly or as array
|
||||
* If key was set only returns those values directly or as array
|
||||
*
|
||||
* On multiple insert return the position for which to return can be set too
|
||||
*
|
||||
@@ -2978,7 +2978,7 @@ class IO
|
||||
// return as is if key is null
|
||||
if ($key === null) {
|
||||
if (count($this->insert_id_arr) == 1) {
|
||||
// return as nul if not found
|
||||
// return as null if not found
|
||||
return $this->insert_id_arr[0] ?? null;
|
||||
} else {
|
||||
return $this->insert_id_arr;
|
||||
|
||||
Reference in New Issue
Block a user