From 7cd9971f543f12a5fb60b67631190712d0d9788e Mon Sep 17 00:00:00 2001
From: latham <latham@ispconfig3>
Date: Thu, 05 May 2011 14:57:13 -0400
Subject: [PATCH] First upload of the email quota reporting. All parts are disabled at the moment. Please help update the language files.

---
 server/lib/classes/db_mysql.inc.php |  256 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 185 insertions(+), 71 deletions(-)

diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php
index 1a3b978..2c113b5 100644
--- a/server/lib/classes/db_mysql.inc.php
+++ b/server/lib/classes/db_mysql.inc.php
@@ -29,18 +29,19 @@
 
 	class db
 	{
-		var $dbHost = "";		// hostname of the MySQL server
-		var $dbName = "";		// logical database name on that server
-		var $dbUser = "";		// database authorized user
-		var $dbPass = "";		// user's password
+		var $dbHost = '';		// hostname of the MySQL server
+		var $dbName = '';		// logical database name on that server
+		var $dbUser = '';		// database authorized user
+		var $dbPass = '';		// user's password
+		var $dbCharset = 'utf8';// Database charset
 		var $linkId = 0;		// last result of mysql_connect()
 		var $queryId = 0;		// last result of mysql_query()
 		var $record	= array();	// last record fetched
-        var $autoCommit = 1;    // Autocommit Transactions
+		var $autoCommit = 1;    // Autocommit Transactions
 		var $currentRow;		// current row number
 		var $errorNumber = 0;	// last error number
-		var $errorMessage = "";	// last error message
-		var $errorLocation = "";// last error location
+		var $errorMessage = '';	// last error message
+		var $errorLocation = '';// last error location
 		var $show_error_messages = true;
 
 		// constructor
@@ -48,10 +49,11 @@
 		{
 			
 			global $conf;
-			$this->dbHost = $conf["db_host"];
-			$this->dbName = $conf["db_database"];
-			$this->dbUser = $conf["db_user"];
-			$this->dbPass = $conf["db_password"];
+			$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->connect();
 		}
 
@@ -59,13 +61,13 @@
 		function updateError($location)
 		{
 			global $app;
-			$this->errorNumber = mysql_errno($this->linkId);
-			$this->errorMessage = mysql_error($this->linkId);
+			$this->errorNumber = @mysql_errno($this->linkId);
+			$this->errorMessage = @mysql_error($this->linkId);
 			$this->errorLocation = $location;
 			if($this->errorNumber && $this->show_error_messages && method_exists($app,'log'))
 			{
 				// echo('<br /><b>'.$this->errorLocation.'</b><br />'.$this->errorMessage);
-				$app->log($this->errorLocation." ".$this->errorMessage,LOGLEVEL_WARN);
+				$app->log($this->errorLocation.' '.$this->errorMessage,LOGLEVEL_WARN);
 				//flush();
 			}
 		}
@@ -74,12 +76,14 @@
 		{
 			if($this->linkId == 0)
 			{
-				$this->linkId = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass);
+				$this->linkId = @mysql_connect($this->dbHost, $this->dbUser, $this->dbPass);
 				if(!$this->linkId)
 				{
 					$this->updateError('DB::connect()-> mysql_connect');
 					return false;
 				}
+				$this->queryId = @mysql_query('SET NAMES '.$this->dbCharset, $this->linkId);
+				$this->queryId = @mysql_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."'", $this->linkId);
 			}
 			return true;
 		}
@@ -226,7 +230,118 @@
            }
        }
 	   */
-       
+	   
+	   public function diffrec($record_old, $record_new) {
+		$diffrec_full = array();
+		$diff_num = 0;
+
+		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) {
+					// Record has changed
+					$diffrec_full['old'][$key] = $val;
+					$diffrec_full['new'][$key] = $record_new[$key];
+					$diff_num++;
+				} else {
+					$diffrec_full['old'][$key] = $val;
+					$diffrec_full['new'][$key] = $val;
+				}
+			}
+		} elseif(is_array($record_new)) {
+			foreach($record_new as $key => $val) {
+				if(isset($record_new[$key]) && @$record_old[$key] != $val) {
+					// Record has changed
+					$diffrec_full['new'][$key] = $val;
+					$diffrec_full['old'][$key] = @$record_old[$key];
+					$diff_num++;
+				} else {
+					$diffrec_full['new'][$key] = $val;
+					$diffrec_full['old'][$key] = $val;
+				}
+			}
+		}
+		
+		return array('diff_num' => $diff_num, 'diff_rec' => $diffrec_full);
+		
+	}
+	
+	//** Function to fill the datalog with a full differential record.
+	public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new) {
+		global $app,$conf;
+
+		// Insert backticks only for incomplete table names.
+		if(stristr($db_table,'.')) {
+			$escape = '';
+		} else {
+			$escape = '`';
+		}
+
+		$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;
+		if(isset($record_new['server_id'])) $server_id = $record_new['server_id'];
+		
+
+		if($diff_num > 0) {
+			//print_r($diff_num);
+			//print_r($diffrec_full);
+			$diffstr = $app->db->quote(serialize($diffrec_full));
+			$username = $app->db->quote($_SESSION['s']['user']['username']);
+			$dbidx = $primary_field.':'.$primary_id;
+						
+			if($action == 'INSERT') $action = 'i';
+			if($action == 'UPDATE') $action = 'u';
+			if($action == 'DELETE') $action = 'd';
+			$sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$db_table."','$dbidx','$server_id','$action','".time()."','$username','$diffstr')";
+			$app->db->query($sql);
+		}
+
+		return true;
+	}
+	
+	//** Inserts a record and saves the changes into the datalog
+	public function datalogInsert($tablename, $insert_data, $index_field) {
+		global $app;
+		
+		$old_rec = array();
+		$this->query("INSERT INTO $tablename $insert_data");
+		$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);
+		
+		return $index_value;
+	}
+	
+	//** Updates a record and saves the changes into the datalog
+	public function datalogUpdate($tablename, $update_data, $index_field, $index_value) {
+		global $app;
+		
+		$old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'");
+		$this->query("UPDATE $tablename SET $update_data 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);
+		
+		return true;
+	}
+	
+	//** Deletes a record and saves the changes into the datalog
+	public function datalogDelete($tablename, $index_field, $index_value) {
+		global $app;
+		
+		$old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'");
+		$this->query("DELETE FROM $tablename WHERE $index_field = '$index_value'");
+		$new_rec = array();
+		$this->datalogSave($tablename, 'DELETE', $index_field, $index_value, $old_rec, $new_rec);
+		
+		return true;
+	}
+
+ 
        public function closeConn()
     	{
     		if($this->linkId)
@@ -270,31 +385,30 @@
        */
        
        function createTable($table_name,$columns) {
-       $index = "";
+       $index = '';
        $sql = "CREATE TABLE $table_name (";
        foreach($columns as $col){
-            $sql .= $col["name"]." ".$this->mapType($col["type"],$col["typeValue"])." ";
+            $sql .= $col['name'].' '.$this->mapType($col['type'],$col['typeValue']).' ';
        
-            if($col["defaultValue"] != "") $sql .= "DEFAULT '".$col["defaultValue"]."' ";
-            if($col["notNull"] == true) {
-                $sql .= "NOT NULL ";
+            if($col['defaultValue'] != '') $sql .= "DEFAULT '".$col['defaultValue']."' ";
+            if($col['notNull'] == true) {
+                $sql .= 'NOT NULL ';
             } else {
-                $sql .= "NULL ";
+                $sql .= 'NULL ';
             }
-            if($col["autoInc"] == true) $sql .= "auto_increment ";
-            $sql.= ",";
+            if($col['autoInc'] == true) $sql .= 'auto_increment ';
+            $sql.= ',';
             // key Definitionen
-            if($col["option"] == "primary") $index .= "PRIMARY KEY (".$col["name"]."),";
-            if($col["option"] == "index") $index .= "INDEX (".$col["name"]."),";
-            if($col["option"] == "unique") $index .= "UNIQUE (".$col["name"]."),";
+            if($col['option'] == 'primary') $index .= 'PRIMARY KEY ('.$col['name'].'),';
+            if($col['option'] == 'index') $index .= 'INDEX ('.$col['name'].'),';
+            if($col['option'] == 'unique') $index .= 'UNIQUE ('.$col['name'].'),';
        }
        $sql .= $index;
        $sql = substr($sql,0,-1);
-       $sql .= ")";
-       
+       $sql .= ')';
        $this->query($sql);
        return true;
-       }
+    }
        
        /*
        $columns = array(action =>   add | alter | drop
@@ -310,29 +424,29 @@
        
        */
        function alterTable($table_name,$columns) {
-       $index = "";
+       $index = '';
        $sql = "ALTER TABLE $table_name ";
        foreach($columns as $col){
-            if($col["action"] == 'add') {
-                $sql .= "ADD ".$col["name"]." ".$this->mapType($col["type"],$col["typeValue"])." ";
-            } elseif ($col["action"] == 'alter') {
-                $sql .= "CHANGE ".$col["name"]." ".$col["name_new"]." ".$this->mapType($col["type"],$col["typeValue"])." ";
-            } elseif ($col["action"] == 'drop') {
-                $sql .= "DROP ".$col["name"]." ";
+            if($col['action'] == 'add') {
+                $sql .= 'ADD '.$col['name'].' '.$this->mapType($col['type'],$col['typeValue']).' ';
+            } elseif ($col['action'] == 'alter') {
+                $sql .= 'CHANGE '.$col['name'].' '.$col['name_new'].' '.$this->mapType($col['type'],$col['typeValue']).' ';
+            } elseif ($col['action'] == 'drop') {
+                $sql .= 'DROP '.$col['name'].' ';
             }
-            if($col["action"] != 'drop') {  
-            if($col["defaultValue"] != "") $sql .= "DEFAULT '".$col["defaultValue"]."' ";
-            if($col["notNull"] == true) {
-                $sql .= "NOT NULL ";
+            if($col['action'] != 'drop') {  
+            if($col['defaultValue'] != '') $sql .= "DEFAULT '".$col['defaultValue']."' ";
+            if($col['notNull'] == true) {
+                $sql .= 'NOT NULL ';
             } else {
-                $sql .= "NULL ";
+                $sql .= 'NULL ';
             }
-            if($col["autoInc"] == true) $sql .= "auto_increment ";
-            $sql.= ",";
-            // key Definitionen
-            if($col["option"] == "primary") $index .= "PRIMARY KEY (".$col["name"]."),";
-            if($col["option"] == "index") $index .= "INDEX (".$col["name"]."),";
-            if($col["option"] == "unique") $index .= "UNIQUE (".$col["name"]."),";
+            if($col['autoInc'] == true) $sql .= 'auto_increment ';
+            $sql.= ',';
+            // Index definitions
+            if($col['option'] == 'primary') $index .= 'PRIMARY KEY ('.$col['name'].'),';
+            if($col['option'] == 'index') $index .= 'INDEX ('.$col['name'].'),';
+            if($col['option'] == 'unique') $index .= 'UNIQUE ('.$col['name'].'),';
             }
        }
        $sql .= $index;
@@ -349,7 +463,7 @@
        return $this->query($sql);
        }
        
-       // gibt Array mit Tabellennamen zur�ck
+       // gibt Array mit Tabellennamen zur�ck
        function getTables($database_name = '') {
 	   	
 			if($database_name == '') $database_name = $this->dbName;
@@ -360,7 +474,7 @@
             return $tb_names;       
        }
        
-       // gibt Feldinformationen zur Tabelle zur�ck
+       // gibt Feldinformationen zur Tabelle zur�ck
        /*
        $columns = array(action =>   add | alter | drop
                         name =>     Spaltenname
@@ -380,7 +494,7 @@
        global $go_api,$go_info;
        // Tabellenfelder einlesen
         
-        if($rows = $go_api->db->queryAllRecords("SHOW FIELDS FROM ".$table_name)){
+        if($rows = $go_api->db->queryAllRecords('SHOW FIELDS FROM '.$table_name)){
         foreach($rows as $row) {
             $name = $row[0];
             $default = $row[4];
@@ -392,38 +506,38 @@
             
             $column = array();
         
-            $column["name"] = $name;
-            //$column["type"] = $type;
-            $column["defaultValue"] = $default;
-            if(stristr($key,"PRI")) $column["option"] = "primary";
-            if(stristr($isnull,"YES")) {
-                $column["notNull"] = false;
+            $column['name'] = $name;
+            //$column['type'] = $type;
+            $column['defaultValue'] = $default;
+            if(stristr($key,'PRI')) $column['option'] = 'primary';
+            if(stristr($isnull,'YES')) {
+                $column['notNull'] = false;
             } else {
-               $column["notNull"] = true; 
+               $column['notNull'] = true; 
             }
-            if($extra == 'auto_increment') $column["autoInc"] = true;
+            if($extra == 'auto_increment') $column['autoInc'] = true;
             
             
             // Type in Metatype umsetzen
             
-            if(stristr($type,"int(")) $metaType = 'int32';
-            if(stristr($type,"bigint")) $metaType = 'int64';
-            if(stristr($type,"char")) {
+            if(stristr($type,'int(')) $metaType = 'int32';
+            if(stristr($type,'bigint')) $metaType = 'int64';
+            if(stristr($type,'char')) {
                 $metaType = 'char';
                 $tmp_typeValue = explode('(',$type);
-                $column["typeValue"] = substr($tmp_typeValue[1],0,-1);  
+                $column['typeValue'] = substr($tmp_typeValue[1],0,-1);  
             }
-            if(stristr($type,"varchar")) {
+            if(stristr($type,'varchar')) {
                 $metaType = 'varchar';
                 $tmp_typeValue = explode('(',$type);
-                $column["typeValue"] = substr($tmp_typeValue[1],0,-1);  
+                $column['typeValue'] = substr($tmp_typeValue[1],0,-1);  
             }
-            if(stristr($type,"text")) $metaType = 'text';
-            if(stristr($type,"double")) $metaType = 'double';
-            if(stristr($type,"blob")) $metaType = 'blob';
+            if(stristr($type,'text')) $metaType = 'text';
+            if(stristr($type,'double')) $metaType = 'double';
+            if(stristr($type,'blob')) $metaType = 'blob';
             
             
-            $column["type"] = $metaType;
+            $column['type'] = $metaType;
             
         $columns[] = $column;
         }
@@ -482,7 +596,7 @@
             return 'char';
        break;
        case 'varchar':
-            if($typeValue < 1) die("Datenbank Fehler: F�r diesen Datentyp ist eine L�ngenangabe notwendig.");
+            if($typeValue < 1) die('Database failure: Lenght required for these data types.');
             return 'varchar('.$typeValue.')';
        break;
        case 'text':
@@ -496,4 +610,4 @@
 		
 	}
 
-?>
\ No newline at end of file
+?>

--
Gitblit v1.9.1