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 |  122 +++++++++++++++++++++++++++++++++-------
 1 files changed, 100 insertions(+), 22 deletions(-)

diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php
index e2232e8..4672998 100644
--- a/interface/lib/classes/db_mysql.inc.php
+++ b/interface/lib/classes/db_mysql.inc.php
@@ -44,7 +44,8 @@
   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($prefix = '') {
@@ -58,13 +59,23 @@
     $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']);
-    if ($this->connect_error) {
+    $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() {
@@ -73,32 +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) debug_print_backtrace();
+    if($this->errorNumber && $conf['demo_mode'] === false) debug_print_backtrace();
     if(!$this->queryId) {
       return false;
     }
@@ -143,11 +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 $this->queryId->affected_rows;
+	return intval($this->queryId->affected_rows);
   }
 
   // returns mySQL insert id
@@ -183,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;
@@ -317,6 +364,28 @@
 
       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;
+    }
 
 
     public function freeResult($query) 
@@ -435,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++) {
@@ -461,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