<?php
##############################################################
# Database abstraction functions                             #
##############################################################
$MAX_CONNECT_ERROR = 3;

$GLOBALS["vg_pdo"] = new VG_PDO();

class VG_PDO{
	
	var $connection;
	var $dsn;
	var $select;
	var $stmt;
	



	private function sendFatalError($s)
	{
		global $ROOT_EMAIL, $SCRIPT_NAME, $GAME_NAME,$GAME_CODE_NAME, $LOGIN_PAGE,$ADMIN_USER,$ADMIN_PWD,$PRODMAN_SERVER_NAME;
		
		$date = date("Y-m-d H:i:s", my_local_time());
		//on désactive les mail d'alerte sql
		//mail($ROOT_EMAIL, "Error : ".$GAME_NAME, $date." : ".$SCRIPT_NAME." >> ".$s);
		
		//on appelle l'api de gestion d'erreur de prodman
		file("http://".$ADMIN_USER.":".$ADMIN_PWD."@".$PRODMAN_SERVER_NAME."/error_api_check_msg.php?GameName=".urlencode($GAME_CODE_NAME)."&Script=".urlencode($_SERVER["SCRIPT_NAME"])."&Error=".urlencode($s));
		
		debug("Error : ".$GAME_NAME." : ".$SCRIPT_NAME." >> ".$s);
		header("Location:".$LOGIN_PAGE."?errorLogin=".urlencode("Une erreur fatale est survenue, veuillez nous en excuser, merci de nous prévenir nous contactant via notre service client."));
		exit();
	}

	# connexion à la db
	# cette fonction n'a pas a être utilisé par le developpeur
	private function connect($database)	{
		global $DATABASE, $MAX_CONNECT_ERROR;
		
		# par défaut on prend $DATABASE, si une autre base n'est passpécifiée
		if (empty($database))
		{
			unset($database);
			$database = $DATABASE;
		}
		if (empty($database)){
			$this->sendFatalError("Connexion impossible à la bdd : Config indisponible");
		}
		
		//DataSourceName
		$this->dsn = "mysql:host=". $database["host"].";dbname=".$database["main_name"];
		 

		# plusieurs tentative de connexion à la BDD
		$iConnectErrorCounter = 0;
		/*do
		{*/
			try {
				$this->connection = new PDO( $this->dsn, $database["login"], $database["password"] );
			} catch ( Exception $e ) {

				//$iConnectErrorCounter++;
				$this->sendFatalError($this->dsn." : ".$this->dsn."[". $database["login"].", ".$database["password"] ."] | Erreur :".$e->getMessage());
			  	
			 	//on temporise avant essai suivant
			  	//sleep(2);
			}   			
		/*}
		while(!$this->connection and $iConnectErrorCounter < $MAX_CONNECT_ERROR);
		*/

		if($iConnectErrorCounter >= $MAX_CONNECT_ERROR)
		{
			$this->sendFatalError("Connexion impossible à la bdd : ".$dbId);
		}	

		//return $this->connection;
	}


	public function query($query, $args = Array(), $debug=0 )	{
		global $DATABASE, $DATABASE_SLAVE, $VG_DEBUG;

		
		if(!$this->connection ){
			if ($database != "")
				$this->connect($database);
			else
				$this->connect(($isMaster == 1) ? $DATABASE : $DATABASE_SLAVE);
		}
		

		$this->stmt = $this->connection->prepare($query);
		$this->stmt->execute($args);
		
		
		# en cas de pb de db on envoie un mail, on log et on retourne sur la home
		if ($this->stmt->errorCode() != "00000")
			$this->sendFatalError($this->dsn." >> ".$this->showQuery($query, $args)." >> ".json_encode($this->stmt->errorInfo()));
	
		switch($debug){
			case 1 : return $this->showQuery($query, $args);			
			break;
			case 2 : echo $this->showQuery($query, $args);			
			break;
			case 3 : debug($this->showQuery($query, $args));			
			break;
		}
		
	}

	private  function showQuery($query, $args)    {
        $keys = array();
        $values = array();
        
        # build a regular expression for each parameter
        foreach ($args as $key=>$value)
        {
            if (is_string($key))
                $keys[] = '/'.$key.'/';
			else
                $keys[] = '/[?]/';
                        
            $values[] = $this->connection->quote($value);

        }        
        $query = preg_replace($keys, $values, $query, 1, $count);
        return $query;
    }


	public function fetch_num()	{
		return  $this->stmt->fetch(PDO::FETCH_NUM);
	}

	public function fetch_assoc()	{
		return  $this->stmt->fetch(PDO::FETCH_ASSOC);
	}

	public function fetch_obj()	{
		return  $this->stmt->fetch(PDO::FETCH_OBJ);
	}

	public function fetch_lazy()	{
		return  $this->stmt->fetch(PDO::FETCH_LAZY);
	}

	//fonctionne apres un UPDATE,INSERT, DELETE (PAS SELECT)
	public function rowCount()	{
		return $this->stmt->rowCount();
	}
	//Retourne le nombre de colonne, peut etre utile pour verifier qu'un select à retourner des enregistrements
	public function columnCount(){
		return $this->stmt->columnCount();
	}
	public function fetchColumn(){
		return $this->stmt->fetchColumn();
	}

	public function lastInsertId()	{
		return $this->connection->lastInsertId();
	}

	
	/*function db_data_seek($result,$row)
	{
		return @mysql_data_seek($result,$row);
	}

	function db_free_result($result) {
	  return mysql_free_result($result);
	}

	function db_affected_rows()
	{
		return mysql_affected_rows();
	}*/
}
?>