Compare commits

...

14 Commits

Author SHA1 Message Date
Clemens Schwaighofer
2e85bf5ee8 Bug fix in DB IO for wrong db debug check
Some debug print checks were done wrong
2017-11-02 18:42:41 +09:00
Clemens Schwaighofer
ff94efee8d Fix in class db io returning on insert
Skip add RETURNING on auto set if 'NULL' is set as a primary key.
On return, also run if count of returned ids is > 0 (so it actually runs
the extended return flow)
2017-11-02 17:04:43 +09:00
Clemens Schwaighofer
93f2cf9b73 DB IO Class: if not PK auto found, set to NULL to skip return
In case no primary key is set and the auto detect does not return a
primary key, set the primary key variable to 'NULL' string to trigger
skip in returning insert id flow.
2017-11-02 16:05:06 +09:00
Clemens Schwaighofer
c39e48a709 Bug fix Class DB IO data write function
The data write function did not write data correctly if it was empty or
null. Especially for boolean ones when set 0 was set NULL and not 'f'.

This is fixed now.
Also filles MUST set not null fields with 0/'' but does not add missing
column to list yet
2017-10-24 16:51:21 +09:00
Clemens Schwaighofer
1cc010818d Fix DB IO write array method
Data was not written correctly in connection with boolean field types as
the "has default" was used as if a default value, but it is just a flag
IF it has a default value
2017-09-26 13:33:52 +09:00
Clemens Schwaighofer
1e164f3b93 Delete wrong symlink, remove create_function call
create_function call is deprecated with PHP 7.2, so creat_function is
replaced by the correct anonymous function call for it
2017-09-11 14:28:47 +09:00
Clemens Schwaighofer
9f7ab65a15 Update Basic, DB IO, Login class
- DB IO: update the write data method to update data that is empty (aka
null) and not skip it (aka never unset data)
- Basic: add date time compare method based on strtotime
- Login: ACL for page level check if array is set before setting
anything
2017-09-07 18:24:52 +09:00
Clemens Schwaighofer
c69607323a Class DB IO update for db write
on UPDATE check if field is bool and then force write for unfilled (not
set) data
2017-09-04 19:02:20 +09:00
Clemens Schwaighofer
13a7900bd6 fix globals set check 2017-07-28 18:08:17 +09:00
Clemens Schwaighofer
dc94fa1cd5 PG class updates, basic class updates
In basic class, do SET_SESSION_NAME check with isset to avoid notice log
entries.

Change log/error return for execute data error

base postgresql calss calls set the last run query on error if no result
is returned for prepare and execute
2017-07-28 15:52:37 +09:00
Clemens Schwaighofer
fd191877cd Fix for not showing progress bar with single progress bar 2017-06-05 16:48:19 +09:00
Clemens Schwaighofer
65a5785ce5 Changed progress bar buffer clear
- send initial big buffer clear
- then do just flush/ob_flush
2017-04-13 14:52:07 +09:00
Clemens Schwaighofer
adcfaf5fa0 Progress bar class: centralize buffer clear method
Because browsers buffer size increased again I centralized the buffer
clear flow.

It now sends a 1024*256 bytes empty string before it runs an ob_flush
and flush call.

This should work with most browsers out there. Tested on macOS
firefox/safari/chrome
2017-04-13 14:28:43 +09:00
Clemens Schwaighofer
f7685463b4 error log ID settings added via global define
A global define for LOG_FILE_ID before any class is initialized (or any
place later allowed too) will add a sub id to the error_msg log file
before any other (level, class, etc) id.

This can be used to easily split between frontend and backend logs or
logs for a certain page without using pagename (eg to group all ajax
logs into one)
2017-04-11 10:25:07 +09:00
8 changed files with 126 additions and 34 deletions

View File

@@ -1 +0,0 @@
smarty-3.1.27/

View File

@@ -19,7 +19,8 @@
_spl_autoload('Class.'.$class.'.inc');
$lang = 'en_utf8';
DEFINE('LOG_FILE_ID', 'classTest');
$login = new login($DB_CONFIG[LOGIN_DB], $lang);
// init with standard
// $basic = new db_io($DB_CONFIG[MAIN_DB]);
@@ -85,6 +86,26 @@
$status = $basic->db_exec("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, 1)." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, 1)."<br>";
# db write class test
$table = 'foo';
print "TABLE META DATA: ".$basic->print_ar($basic->db_show_table_meta_data($table))."<br>";
$primary_key = ''; # unset
$db_write_table = array ('test', 'string_a', 'number_a', 'some_bool');
// $db_write_table = array ('test');
$object_fields_not_touch = array ();
$object_fields_not_update = array ();
$data = array ('test' => 'BOOL TEST SOMETHING '.time(), 'string_a' => 'SOME TEXT', 'number_a' => 5);
$primary_key = $basic->db_write_data_ext($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array ('test' => 'BOOL TEST ON '.time(), 'string_a' => '', 'number_a' => 0, 'some_bool' => 1);
$primary_key = $basic->db_write_data_ext($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array ('test' => 'BOOL TEST OFF '.time(), 'string_a' => null, 'number_a' => null, 'some_bool' => 0);
$primary_key = $basic->db_write_data_ext($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array ('test' => 'BOOL TEST UNSET '.time());
$primary_key = $basic->db_write_data_ext($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
# async test queries
/* $basic->db_exec_async("SELECT test FROM foo, (SELECT pg_sleep(10)) as sub WHERE foo_id IN (27, 50, 67, 44, 10)");

View File

@@ -99,7 +99,7 @@
// queue key
if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action))
{
$this->queue_key = join('', array_map(create_function('', '$range = $GLOBALS["_KEY_RANGE"]; return $range[rand(0, (count($range) - 1))];'), range(1, 3)));
$this->queue_key = join('', array_map(function () { $range = $GLOBALS['_KEY_RANGE']; return $range[rand(0, (count($range) - 1))]; }, range(1, 3)));
}
}

View File

@@ -54,6 +54,7 @@
* GenAssocArray -> generactes a new associativ array from an existing array
* CheckDate -> checks if a date is valid
* CompareDate -> compares two dates. -1 if the first is smaller, 0 if they are equal, 1 if the first is bigger
* CompareDateTime -> compares two dates with time. -1 if the first is smaller, 0 if they are equal, 1 if the first is bigger
* _crc32b -> behaves like the hash("crc32b") in php < 5.2.8. this function will flip the hash like it was (wrong)
* before if a new php version is found
* crypt* -> encrypt and decrypt login string data, used by Login class
@@ -118,9 +119,10 @@
// log file name
private $log_file_name_ext = 'log'; // use this for date rotate
public $log_max_filesize = 0; // set in kilobytes
private $log_print_file = 'error_msg##LEVEL####CLASS####PAGENAME####DATE##';
private $log_print_file = 'error_msg##LOGID####LEVEL####CLASS####PAGENAME####DATE##';
private $log_file_unique_id; // a unique ID set only once for call derived from this class
public $log_print_file_date = 1; // if set add Y-m-d and do automatic daily rotation
private $log_file_id = LOG_FILE_ID ? LOG_FILE_ID : ''; // a alphanumeric name that has to be set as global definition
public $log_per_level = 0; // set, it will split per level (first parameter in debug call)
public $log_per_class = 0; // set, will split log per class
public $log_per_page = 0; // set, will split log per called file
@@ -311,7 +313,7 @@
if (!session_id())
{
// check if we have an external session name given, else skip this step
if (SET_SESSION_NAME)
if (isset($GLOBALS['SET_SESSION_NAME']))
{
// set the session name for possible later check
$this->session_name = SET_SESSION_NAME;
@@ -611,6 +613,12 @@
$output = $error_string; // output formated error string to output file
// init base file path
$fn = ROOT.LOG.$this->log_print_file.'.'.$this->log_file_name_ext;
// log ID prefix settings, if not valid, replace with empty
if (preg_match("/^[A-Za-z0-9]+$/", $this->log_file_id))
$rpl_string = '_'.$this->log_file_id;
else
$rpl_string = '';
$fn = str_replace('##LOGID##', $rpl_string, $fn); // log id (like a log file prefix)
if ($this->log_per_run)
{
@@ -1267,6 +1275,25 @@
return 1;
}
// METHOD: CompareDateTime
// PARAMS: start_datetime, end_datetime (both YYYY-MM-DD HH:mm:ss)
// RETURN: -1 if the first date is smaller the last, 0 if both are equal, 1 if the end date is bigger than the last
// DESC : compares the two dates + times. if seconds missing in one set, add :00, converts / to -
public static function CompareDateTime($start_datetime, $end_datetime)
{
// pre check for empty or wrong
if ($start_date == '--' || $end_date == '--' || !$start_date || !$end_date)
return FALSE;
$start_timestamp = strtotime($start_datetime);
$end_timestamp = strtotime($end_datetime);
if ($start_timestamp < $end_timestamp)
return -1;
if ($start_timestamp == $end_timestamp)
return 0;
if ($start_timestamp > $end_timestamp)
return 1;
}
// METHOD: ArrayToString
// PARAMS: array, connect char
// RETRUN: string

View File

@@ -661,14 +661,14 @@
{
$this->pk_name_table[$table] = $this->db_functions->_db_primary_key($table, $schema);
}
$this->pk_name = $this->pk_name_table[$table];
$this->pk_name = $this->pk_name_table[$table] ? $this->pk_name_table[$table] : 'NULL';
}
if (!preg_match("/ returning /i", $this->query) && $this->pk_name)
if (!preg_match("/ returning /i", $this->query) && $this->pk_name && $this->pk_name != 'NULL')
{
$this->query .= " RETURNING ".$this->pk_name;
$this->returning_id = true;
}
elseif (preg_match("/ returning (.*)/i", $this->query, $matches) && $this->pk_name)
elseif (preg_match("/ returning (.*)/i", $this->query, $matches) && $this->pk_name && $this->pk_name != 'NULL')
{
// add the primary key if it is not in the returning set
if (!preg_match("/$this->pk_name/", $matches[1]))
@@ -714,7 +714,7 @@
if (!$this->cursor || $this->db_functions->_db_last_error_query())
{
// printout Query if debug is turned on
if (!$this->db_debug)
if ($this->db_debug)
$this->_db_debug('db', $this->query, 'db_exec', 'Q[nc]');
// internal error handling
$this->error_id = 13;
@@ -763,7 +763,7 @@
$this->insert_id[] = $_insert_id;
}
// if we have only one, revert from array to single
if (count($this->insert_id) == 1)
if (count($this->insert_id) >= 1)
{
// echo "* SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->pk_name, $this->insert_id[0])."<br>";
// echo "* PK DIRECT: ".$this->insert_id[0][$this->pk_name]."<Br>";
@@ -1015,7 +1015,7 @@
// if still no cursor ...
if (!$this->cursor_ext[$md5]['cursor'])
{
if (!$this->db_debug)
if ($this->db_debug)
$this->_db_debug('db', $this->cursor_ext[$md5]['query'], 'db_return', 'Q');
// internal error handling
$this->error_id = 13;
@@ -1530,7 +1530,8 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
// failed to get insert id
$this->insert_id = '';
$this->warning_id = 33;
$this->_db_error('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
$this->_db_error();
$this->_db_debug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
}
}
// this error handling is only for pgsql
@@ -1666,7 +1667,13 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
// DESC: writes into one table based on array of table columns
public function db_write_data($write_array, $not_write_array, $primary_key, $table, $data = array ())
{
$not_write_upodate_array = array ();
if (!is_array($write_array))
$write_array = array ();
if (!is_array($not_write_array))
$not_write_array = array ();
if (is_array($table))
return false;
$not_write_update_array = array ();
return $this->db_write_data_ext($write_array, $primary_key, $table, $not_write_array, $not_write_update_array, $data);
}
@@ -1690,7 +1697,9 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
'value' => $primary_key
);
}
// var set for strings
$q_sub_value = '';
$q_sub_data = '';
// get the table layout and row types
$table_data = $this->db_show_table_meta_data(($this->db_schema ? $this->db_schema.'.' : '').$table);
foreach ($write_array as $field)
@@ -1698,11 +1707,25 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
if ((!$primary_key['value'] || ($primary_key['value'] && !in_array($field, $not_write_update_array))) && !in_array($field, $not_write_array))
{
// data from external or data field
$_data = (count($data) >= 1) ? $data[$field] : $GLOBALS[$field];
$_data = null;
if (count($data) >= 1 && array_key_exists($field, $data))
$_data = $data[$field];
elseif (array_key_exists($field, $GLOBALS))
$_data = $GLOBALS[$field];
$has_default = $table_data[$field]['has default'];
$not_null = $table_data[$field]['not null'];
// write if the field has to be not null, or if there is no data and the field has no default values or if there is data
if (($not_null && !$_data) || (!$has_default && !$_data) || (is_numeric($_data) && isset($_data)) || $_data)
// if not null and string => '', if not null and int or numeric => 0, if bool => skip, all others skip
if ($not_null && !isset($_data))
{
if (strstr($table_data[$field]['type'], 'int') || strstr($table_data[$field]['type'], 'numeric'))
$_data = 0;
else
$_data = '';
}
// we detect bool, so we can force a write on "false"
$is_bool = $table_data[$field]['type'] == 'bool' ? true : false;
// write if the field has to be not null, or if there is no data and the field has no default values or if there is data or if this is an update and there is no data (set null)
if (($not_null && isset($_data)) || (!$has_default && !isset($_data)) || (is_numeric($_data) && isset($_data)) || ($primary_key['value'] && !isset($_data)) || isset($_data))
{
if ($q_sub_value && !$primary_key['value'])
$q_sub_value .= ', ';
@@ -1717,9 +1740,10 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
$_data = '';
// write data into sql string
if (strstr($table_data[$field]['type'], 'int'))
$q_sub_data .= (is_numeric($_data) && isset($_data)) ? $_data : ($has_default ? $has_default : 'NULL');
$q_sub_data .= (is_numeric($_data) && isset($_data)) ? $_data : 'NULL';
else
$q_sub_data .= ($_data) ? "'".$this->db_escape_string($_data)."'" : ($has_default ? "'".$this->db_escape_string($has_default)."'" : 'NULL');
// if bool -> set bool, else write data
$q_sub_data .= isset($_data) ? "'".($is_bool ? $this->db_boolean($_data, true) : $this->db_escape_string($_data))."'" : 'NULL';
}
}
}

View File

@@ -581,7 +581,7 @@
{
$this->acl['page'] = $_SESSION['GROUP_ACL_LEVEL'];
}
if ($_SESSION['PAGES_ACL_LEVEL'][$this->page_name] != -1)
if (isset($_SESSION['PAGES_ACL_LEVEL'][$this->page_name]) && $_SESSION['PAGES_ACL_LEVEL'][$this->page_name] != -1)
{
$this->acl['page'] = $_SESSION['PAGES_ACL_LEVEL'][$this->page_name];
}

View File

@@ -19,6 +19,9 @@ class ProgressBar
public $status = 'new'; // current status (new,show,hide)
public $step = 0; // current step
public $position = array(); // current bar position
public $clear_buffer_size = 1; // we need to send this before the lfush to get browser output
public $clear_buffer_size_init = 1024*1024; // if I don't send that junk, it won't send anything
// public vars
@@ -74,10 +77,22 @@ class ProgressBar
$this->width = $width;
if ($height > 0)
$this->height = $height;
// needs to be called twice or I do not get any output
$this->_flushCache($this->clear_buffer_size_init);
$this->_flushCache($this->clear_buffer_size_init);
}
// private functions
private function _flushCache($clear_buffer_size = 0)
{
if (!$clear_buffer_size)
$clear_buffer_size = $this->clear_buffer_size;
echo str_repeat(' ', $clear_buffer_size);
ob_flush();
flush();
}
private function _calculatePercent($step)
{
// avoid divison through 0
@@ -298,7 +313,7 @@ class ProgressBar
$output .= 'document.getElementById("plbl'.$name.$this->code.'").style.align="'.$this->label[$name]['align'].'";';
$output .= '</script>'."\n";
echo $output;
flush();
$this->_flushCache();
}
}
@@ -308,7 +323,7 @@ class ProgressBar
if ($this->status != 'new')
{
echo '<script type="text/JavaScript">document.getElementById("plbl'.$name.$this->code.'").style.color="'.$color.'";</script>'."\n";
flush();
$this->_flushCache();
}
}
@@ -318,7 +333,7 @@ class ProgressBar
if ($this->status != 'new')
{
echo '<script type="text/JavaScript">document.getElementById("plbl'.$name.$this->code.'").style.background="'.$color.'";</script>'."\n";
flush();
$this->_flushCache();
}
}
@@ -349,7 +364,7 @@ class ProgressBar
$output .= 'document.getElementById("plbl'.$name.$this->code.'").style.font-weight="'.$this->label[$name]['font-weight'].'";';
$output .= '</script>'."\n";
echo $output;
flush();
$this->_flushCache();
}
}
@@ -360,7 +375,7 @@ class ProgressBar
if ($this->status != 'new')
{
echo '<script type="text/JavaScript">PBlabelText'.$this->code.'("'.$name.'","'.$this->label[$name]['value'].'");</script>'."\n";
flush();
$this->_flushCache();
}
}
@@ -370,7 +385,7 @@ class ProgressBar
if ($this->status != 'new')
{
echo '<script type="text/JavaScript">document.getElementById("pbar'.$this->code.'").style.background="'.$color.'";</script>'."\n";
flush();
$this->_flushCache();
}
}
@@ -380,7 +395,7 @@ class ProgressBar
if ($this->status != 'new')
{
echo '<script type="text/JavaScript">document.getElementById("pbrd'.$this->code.'").style.background="'.$color.'";</script>'."\n";
flush();
$this->_flushCache();
}
}
@@ -398,7 +413,7 @@ class ProgressBar
echo 'PBposition'.$this->code.'("width",'.$this->position['width'].');';
echo 'PBposition'.$this->code.'("height",'.$this->position['height'].');';
echo '</script>'."\n";
flush();
$this->_flushCache();
}
}
@@ -547,7 +562,7 @@ class ProgressBar
{
$this->status = 'show';
echo $this->getHtml();
flush();
$this->_flushCache();
}
public function moveStep($step)
@@ -603,7 +618,7 @@ class ProgressBar
if ($js != '')
{
echo '<script type="text/JavaScript">'.$js.'</script>'."\n";
flush();
$this->_flushCache();
}
}
@@ -627,7 +642,7 @@ class ProgressBar
$output .= 'document.getElementById("pbm'.$this->code.'").style.visibility="hidden";document.getElementById("pbm'.$this->code.'").style.display="none";';
$output .= '</script>'."\n";
echo $output;
flush();
$this->_flushCache();
}
}
@@ -641,7 +656,7 @@ class ProgressBar
$output .= 'document.getElementById("pbm'.$this->code.'").style.visibility="visible";document.getElementById("pbm'.$this->code.'").style.visibility="block";';
$output .= '</script>'."\n";
echo $output;
flush();
$this->_flushCache();
}
}

View File

@@ -112,7 +112,10 @@
// DESC : wrapper for pg_prepare
public function _db_prepare($name, $query)
{
return @pg_prepare($this->dbh, $name, $query);
$result = @pg_prepare($this->dbh, $name, $query);
if (!$result)
$this->last_error_query = $query;
return $result;
}
// METHOD: _db_execute
@@ -121,7 +124,10 @@
// DESC : wrapper for pg_execute for running a prepared statement
public function _db_execute($name, $data)
{
return @pg_execute($this->dbh, $name, $data);
$result = @pg_execute($this->dbh, $name, $data);
if (!$result)
$this->last_error_query = $query;
return $result;
}
// METHOD: _db_num_rows