From aa370627b211a51dc46891cfa4b6e3d2ef3e52db Mon Sep 17 00:00:00 2001 From: mcramer <m.cramer@pixcept.de> Date: Tue, 16 Jul 2013 10:45:17 -0400 Subject: [PATCH] - Fixed FS#2924 - the month will not set automatically in the autoresponder by click now Along with this fixed some display problems with the combo boxes introduced in 3.0.5. Some fields were not correctly displayed with the predefined values if value and text of the underlying option element differ. --- interface/lib/classes/db_mysql.inc.php | 242 +++++++++++++++++++++++++++++++----------------- 1 files changed, 157 insertions(+), 85 deletions(-) diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php index 471af6f..4672998 100644 --- a/interface/lib/classes/db_mysql.inc.php +++ b/interface/lib/classes/db_mysql.inc.php @@ -44,26 +44,38 @@ private $errorNumber = 0; // last error number public $errorMessage = ''; // last error message private $errorLocation = '';// last error location - public $show_error_messages = true; // false in server, true in interface + public $show_error_messages = false; // false in server, true in interface + private $isConnected = false; // needed to know if we have a valid mysqli object from the constructor // constructor - public function __construct() { + public function __construct($prefix = '') { global $conf; - $this->dbHost = $conf['db_host']; - $this->dbName = $conf['db_database']; - $this->dbUser = $conf['db_user']; - $this->dbPass = $conf['db_password']; - $this->dbCharset = $conf['db_charset']; - $this->dbNewLink = $conf['db_new_link']; - $this->dbClientFlags = $conf['db_client_flags']; - parent::__construct($conf['db_host'], $conf['db_user'],$conf['db_password'],$conf['db_database']); - if ($this->connect_error) { + if($prefix != '') $prefix .= '_'; + $this->dbHost = $conf[$prefix.'db_host']; + $this->dbName = $conf[$prefix.'db_database']; + $this->dbUser = $conf[$prefix.'db_user']; + $this->dbPass = $conf[$prefix.'db_password']; + $this->dbCharset = $conf[$prefix.'db_charset']; + $this->dbNewLink = $conf[$prefix.'db_new_link']; + $this->dbClientFlags = $conf[$prefix.'db_client_flags']; + parent::__construct($conf[$prefix.'db_host'], $conf[$prefix.'db_user'],$conf[$prefix.'db_password'],$conf[$prefix.'db_database']); + $try = 0; + //while(!is_null($this->connect_error) && $try < 5) { + while(mysqli_connect_error() && $try < 5) { + if($try > 0) sleep(1); + + $try++; $this->updateError('DB::__construct'); - return false; + + parent::__construct($conf[$prefix.'db_host'], $conf[$prefix.'db_user'],$conf[$prefix.'db_password'],$conf[$prefix.'db_database']); } - parent::query( 'SET NAMES '.$this->dbCharset); - parent::query( "SET character_set_results = '".$this->dbCharset."', character_set_client = '".$this->dbCharset."', character_set_connection = '".$this->dbCharset."', character_set_database = '".$this->dbCharset."', character_set_server = '".$this->dbCharset."'"); - + + //if(is_null($this->connect_error)) $this->isConnected = true; + //else return false; + if(!mysqli_connect_error()) $this->isConnected = true; + else return false; + + $this->setCharacterEncoding(); } public function __destruct() { @@ -72,31 +84,68 @@ // error handler public function updateError($location) { - global $app; + global $app, $conf; - if($this->connect_error) { + /* + if(!is_null($this->connect_error)) { $this->errorNumber = $this->connect_errno; $this->errorMessage = $this->connect_error; } else { $this->errorNumber = $this->errno; $this->errorMessage = $this->error; } + */ + if(mysqli_connect_error()) { + $this->errorNumber = mysqli_connect_errno(); + $this->errorMessage = mysqli_connect_error(); + } else { + $this->errorNumber = mysqli_errno($this); + $this->errorMessage = mysqli_error($this); + } + $this->errorLocation = $location; if($this->errorNumber) { $error_msg = $this->errorLocation .' '. $this->errorMessage; - // This right here will allow us to use the samefile for server & interface - if($this->show_error_messages) { - echo $error_msg; - } else if(method_exists($app, 'log')) { - $app->log($error_msg, LOGLEVEL_WARN); + // This right here will allow us to use the same file for server & interface + if($this->show_error_messages && $conf['demo_mode'] === false) { + echo $error_msg; + } else if(is_object($app) && method_exists($app, 'log')) { + $app->log($error_msg, LOGLEVEL_WARN); } } } + + private function setCharacterEncoding() { + if($this->isConnected == false) return false; + parent::query( 'SET NAMES '.$this->dbCharset); + parent::query( "SET character_set_results = '".$this->dbCharset."', character_set_client = '".$this->dbCharset."', character_set_connection = '".$this->dbCharset."', character_set_database = '".$this->dbCharset."', character_set_server = '".$this->dbCharset."'"); + } public function query($queryString) { - $this->queryId = parent::query($queryString); + global $conf; + if($this->isConnected == false) return false; + $try = 0; + do { + $try++; + $ok = $this->ping(); + if(!$ok) { + if(!$this->real_connect($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName)) { + if($try > 4) { + $this->updateError('DB::query -> reconnect'); + return false; + } else { + sleep(1); + } + } else { + $this->setCharacterEncoding(); + $ok = true; + } + } + } while($ok == false); + $this->queryId = parent::query($queryString); $this->updateError('DB::query('.$queryString.') -> mysqli_query'); + if($this->errorNumber && $conf['demo_mode'] === false) debug_print_backtrace(); if(!$this->queryId) { return false; } @@ -141,7 +190,11 @@ // returns number of rows returned by the last select query public function numRows() { - return $this->queryId->num_rows; + return intval($this->queryId->num_rows); + } + + public function affectedRows() { + return intval($this->queryId->affected_rows); } // returns mySQL insert id @@ -150,14 +203,12 @@ } - // Check der variablen - // Really.. using quote should be phased out in favor of using bind_param's. Though, for legacy code.. - // here's the equivalent + //* Function to quote strings public function quote($formfield) { return $this->escape_string($formfield); } - // Check der variablen + //* Function to unquotae strings public function unquote($formfield) { return stripslashes($formfield); } @@ -172,44 +223,6 @@ return $out; } - /* - //* These functions are deprecated and will be removed. - function insert($tablename,$form,$debug = 0) - { - if(is_array($form)){ - foreach($form as $key => $value) - { - $sql_key .= "$key, "; - $sql_value .= "'".$this->check($value)."', "; - } - $sql_key = substr($sql_key,0,strlen($sql_key) - 2); - $sql_value = substr($sql_value,0,strlen($sql_value) - 2); - - $sql = "INSERT INTO $tablename (" . $sql_key . ") VALUES (" . $sql_value .")"; - - if($debug == 1) echo "SQL-Statement: ".$sql."<br><br>"; - $this->query($sql); - if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage; - } - } - - function update($tablename,$form,$bedingung,$debug = 0) - { - - if(is_array($form)){ - foreach($form as $key => $value) - { - $insql .= "$key = '".$this->check($value)."', "; - } - $insql = substr($insql,0,strlen($insql) - 2); - $sql = "UPDATE $tablename SET " . $insql . " WHERE $bedingung"; - if($debug == 1) echo "SQL-Statement: ".$sql."<br><br>"; - $this->query($sql); - if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage; - } - } - */ - public function diffrec($record_old, $record_new) { $diffrec_full = array(); $diff_num = 0; @@ -217,10 +230,10 @@ if(is_array($record_old) && count($record_old) > 0) { foreach($record_old as $key => $val) { // if(!isset($record_new[$key]) || $record_new[$key] != $val) { - if($record_new[$key] != $val) { + if(@$record_new[$key] != $val) { // Record has changed $diffrec_full['old'][$key] = $val; - $diffrec_full['new'][$key] = $record_new[$key]; + $diffrec_full['new'][$key] = @$record_new[$key]; $diff_num++; } else { $diffrec_full['old'][$key] = $val; @@ -246,7 +259,7 @@ } //** Function to fill the datalog with a full differential record. - public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new) { + public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new, $force_update = false) { global $app,$conf; // Insert backticks only for incomplete table names. @@ -256,10 +269,17 @@ $escape = '`'; } - $tmp = $this->diffrec($record_old, $record_new); - $diffrec_full = $tmp['diff_rec']; - $diff_num = $tmp['diff_num']; - unset($tmp); + if($force_update == true) { + //* We force a update even if no record has changed + $diffrec_full = array('new' => $record_new,'old' => $record_old); + $diff_num = count($record_new); + } else { + //* get the difference record between old and new record + $tmp = $this->diffrec($record_old, $record_new); + $diffrec_full = $tmp['diff_rec']; + $diff_num = $tmp['diff_num']; + unset($tmp); + } // Insert the server_id, if the record has a server_id $server_id = (isset($record_old['server_id']) && $record_old['server_id'] > 0)?$record_old['server_id']:0; @@ -286,9 +306,23 @@ //** Inserts a record and saves the changes into the datalog public function datalogInsert($tablename, $insert_data, $index_field) { global $app; + + if(is_array($insert_data)) { + $key_str = ''; + $val_str = ''; + foreach($insert_data as $key => $val) { + $key_str .= "`".$key ."`,"; + $val_str .= "'".$this->quote($val)."',"; + } + $key_str = substr($key_str,0,-1); + $val_str = substr($val_str,0,-1); + $insert_data_str = '('.$key_str.') VALUES ('.$val_str.')'; + } else { + $insert_data_str = $insert_data; + } $old_rec = array(); - $this->query("INSERT INTO $tablename $insert_data"); + $this->query("INSERT INTO $tablename $insert_data_str"); $index_value = $this->insertID(); $new_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); $this->datalogSave($tablename, 'INSERT', $index_field, $index_value, $old_rec, $new_rec); @@ -298,16 +332,23 @@ //** Updates a record and saves the changes into the datalog public function datalogUpdate($tablename, $update_data, $index_field, $index_value, $force_update = false) { - global $app; + global $app; - if($force_update == true) { - $old_rec = array(); - } else { - $old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); - } - $this->query("UPDATE $tablename SET $update_data WHERE $index_field = '$index_value'"); + $old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + + if(is_array($update_data)) { + $update_data_str = ''; + foreach($update_data as $key => $val) { + $update_data_str .= "`".$key ."` = '".$this->quote($val)."',"; + } + $update_data_str = substr($update_data_str,0,-1); + } else { + $update_data_str = $update_data; + } + + $this->query("UPDATE $tablename SET $update_data_str WHERE $index_field = '$index_value'"); $new_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); - $this->datalogSave($tablename, 'UPDATE', $index_field, $index_value, $old_rec, $new_rec); + $this->datalogSave($tablename, 'UPDATE', $index_field, $index_value, $old_rec, $new_rec, $force_update); return true; } @@ -322,6 +363,28 @@ $this->datalogSave($tablename, 'DELETE', $index_field, $index_value, $old_rec, $new_rec); return true; + } + + //* get the current datalog status for the specified login (or currently logged in user) + public function datalogStatus($login = '') { + global $app; + + $return = array('count' => 0, 'entries' => array()); + if($_SESSION['s']['user']['typ'] == 'admin') return $return; // these information should not be displayed to admin users + + if($login == '' && isset($_SESSION['s']['user'])) { + $login = $_SESSION['s']['user']['username']; + } + + $result = $this->queryAllRecords("SELECT COUNT( * ) AS cnt, sys_datalog.action, sys_datalog.dbtable FROM sys_datalog, server WHERE server.server_id = sys_datalog.server_id AND sys_datalog.user = '" . $this->quote($login) . "' AND sys_datalog.datalog_id > server.updated GROUP BY sys_datalog.dbtable, sys_datalog.action"); + foreach($result as $row) { + if(!$row['dbtable'] || in_array($row['dbtable'], array('aps_instances', 'aps_instances_settings', 'mail_access', 'mail_content_filter'))) continue; // ignore some entries, maybe more to come + $return['entries'][] = array('table' => $row['dbtable'], 'action' => $row['action'], 'count' => $row['cnt'], 'text' => $app->lng('datalog_status_' . $row['action'] . '_' . $row['dbtable'])); + $return['count'] += $row['cnt']; + } + unset($result); + + return $return; } @@ -441,7 +504,7 @@ // gibt Array mit Tabellennamen zur�ck public function getTables($database_name = '') { - + if($this->isConnected == false) return false; if($database_name == '') $database_name = $this->dbName; $result = parent::query("SHOW TABLES FROM $database_name"); for ($i = 0; $i < $result->num_rows; $i++) { @@ -467,17 +530,26 @@ function tableInfo($table_name) { - global $go_api,$go_info; + global $go_api,$go_info,$app; // Tabellenfelder einlesen - if($rows = $go_api->db->queryAllRecords('SHOW FIELDS FROM '.$table_name)){ + if($rows = $app->db->queryAllRecords('SHOW FIELDS FROM '.$table_name)){ foreach($rows as $row) { + /* $name = $row[0]; $default = $row[4]; $key = $row[3]; $extra = $row[5]; $isnull = $row[2]; $type = $row[1]; + */ + + $name = $row['Field']; + $default = $row['Default']; + $key = $row['Key']; + $extra = $row['Extra']; + $isnull = $row['Null']; + $type = $row['Type']; $column = array(); -- Gitblit v1.9.1