Basic::json handling, better string to bytes function

Some basic json string to array with second function to check last
cought error.

Updated string to bytes convert to make it shorter and more compact

Some minor fixes in DB::IO helper methods
This commit is contained in:
Clemens Schwaighofer
2021-02-09 14:55:32 +09:00
parent 80993a06ac
commit b6c6d76b43
3 changed files with 108 additions and 50 deletions

View File

@@ -108,22 +108,24 @@ while ($res = $basic->dbReturn("SELECT * FROM max_test")) {
}
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>";
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->dbGetInsertPK()." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)." => ".print_r($basic->dbGetReturningExt(), true)."<br>";
// should throw deprecated error
// $basic->getReturningExt();
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
$basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
$status = $basic->dbExecute("ins_foo", array('BAR TEST '.time()));
print "PREPARE INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>";
print "PREPARE INSERT STATUS: $status | PRIMARY KEY: ".$basic->dbGetInsertPK()." | PRIMARY KEY EXT: ".print_r($basic->dbGetReturningExt(), true)."<br>";
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
// returning test with multiple entries
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
$status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
print "DIRECT MULTIPLE INSERT STATUS: $status | PRIMARY KEYS: ".print_r($basic->insert_id, true)." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
print "DIRECT MULTIPLE INSERT STATUS: $status | PRIMARY KEYS: ".print_r($basic->dbGetInsertPK(), true)." | PRIMARY KEY EXT: ".print_r($basic->dbGetReturningExt(), true)."<br>";
// no returning, but not needed ;
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');");
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->dbGetInsertPK()." | PRIMARY KEY EXT: ".print_r($basic->dbGetReturningExt(), true)."<br>";
// UPDATE WITH RETURNING
$status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test");
print "UPDATE STATUS: $status | RETURNING EXT: ".print_r($basic->insert_id_ext, true)."<br>";
print "UPDATE STATUS: $status | RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)."<br>";
// REEAD PREPARE
if ($basic->dbPrepare('sel_foo', "SELECT foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time FROM foo ORDER BY foo_id DESC LIMIT 5") === false) {
print "Error in sel_foo prepare<br>";

View File

@@ -183,6 +183,9 @@ class Basic
// mime application list
private $mime_apps = [];
// last json error
private $json_last_error;
/**
* main Basic constructor to init and check base settings
*/
@@ -1711,54 +1714,28 @@ class Basic
/**
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
* if the number has a non standard thousand seperator ","" inside, the second
* flag needs to be set true (eg german style notaded numbers)
* @param string|int|float $number any string or number to convert
* @param bool $dot_thousand default is ".", set true for ","
* @return string|int|float converted value or original value
*/
public static function stringByteFormat($number, bool $dot_thousand = false)
public static function stringByteFormat($number)
{
$matches = [];
// all valid units
$valid_units_ = 'bkmgtpezy';
// detects up to exo bytes
preg_match("/([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/", strtolower($number), $matches);
preg_match("/([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i", strtolower($number), $matches);
if (isset($matches[1]) && isset($matches[2])) {
// $last = strtolower($number[strlen($number) - 1]);
if ($dot_thousand === false) {
$number = str_replace(',', '', $matches[1]);
} else {
$number = str_replace('.', '', $matches[1]);
}
// remove all non valid characters from the number
$number = preg_replace('/[^0-9\.]/', '', $matches[1]);
// final clean up and convert to float
$number = (float)trim($number);
// match string in type to calculate
switch ($matches[2]) {
// exo bytes
case 'e':
case 'eb':
$number *= 1024;
// peta bytes
case 'p':
case 'pb':
$number *= 1024;
// tera bytes
case 't':
case 'tb':
$number *= 1024;
// giga bytes
case 'g':
case 'gb':
$number *= 1024;
// mega bytes
case 'm':
case 'mb':
$number *= 1024;
// kilo bytes
case 'k':
case 'kb':
$number *= 1024;
break;
// convert any mb/gb/etc to single m/b
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[2]);
if ($unit) {
$number = $number * pow(1024, stripos($valid_units_, $unit[0]));
}
$number = (int)round($number, 0);
// convert to INT to avoid +E output
$number = (int)round($number);
}
// if not matching return as is
return $number;
@@ -3456,6 +3433,77 @@ class Basic
{
return $this->mime_apps[$mime] ?? 'Other file';
}
/**
* converts a json string to an array
* or inits an empty array on null string
* or failed convert to array
* In ANY case it will ALWAYS return array.
* Does not throw errors
* @param string|null $json a json string, or null data
* @param bool $override if set to true, then on json error
* set original value as array
* @return array returns an array from the json values
*/
public function jsonConvertToArray(?string $json, bool $override = false): array
{
if ($json !== null) {
$_json = json_decode($json, true);
if ($this->json_last_error = json_last_error()) {
if ($override == true) {
// init return as array with original as element
$json = [$json];
} else {
$json = [];
}
} else {
$json = $_json;
}
} else {
$json = [];
}
// be sure that we return an array
return (array)$json;
}
/**
* [jsonGetLastError description]
* @param bool|boolean $return_string [default=false] if set to true
* it will return the message string and not
* the error number
* @return int|string Either error number (0 for no error)
* or error string ('' for no error)
*/
public function jsonGetLastError(bool $return_string = false)
{
$json_error_string = '';
// valid errors as of php 8.0
switch ($this->json_last_error) {
case JSON_ERROR_NONE:
$json_error_string = '';
break;
case JSON_ERROR_DEPTH:
$json_error_string = 'Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
$json_error_string = 'Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
$json_error_string = 'Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
$json_error_string = 'Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
$json_error_string = 'Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
$json_error_string = 'Unknown error';
break;
}
return $return_string === true ? $json_error_string : $this->json_last_error;
}
}
// __END__

View File

@@ -2110,12 +2110,20 @@ class IO extends \CoreLibs\Basic
/**
* Switches db debug flag on or off
* OR
* with the optional parameter fix sets debug
* returns current set stats
* @param bool|null $debug Flag to turn debug on off
* @return bool True for debug is on, False for off
*/
public function dbToggleDebug()
public function dbToggleDebug(?bool $debug = null)
{
return $this->db_debug = $this->db_debug ? false : true;
if ($debug !== null) {
$this->db_debug = $debug;
} else {
$this->db_debug = $this->db_debug ? false : true;
}
return $this->db_debug;
}
// DEPEREACTED CALLS
@@ -2156,7 +2164,7 @@ class IO extends \CoreLibs\Basic
/**
* DEPRECATED: getReturningExt
* @param string|null $lkey [DEPRECATED]
* @param string|null $key [DEPRECATED]
* @return array|string|null [DEPRECATED]
* @deprecated use dbGetReturningExt($key = null) instead
*/
@@ -2186,7 +2194,7 @@ class IO extends \CoreLibs\Basic
public function getNumRows()
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetNumRows()', E_USER_DEPRECATED);
return $this->getNumRows();
return $this->dbGetNumRows();
}
} // end if db class