<?php

/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
*   This program is free software; you can redistribute it and/or modify
*   it under the terms of the GNU General Public License as published by
*   the Free Software Foundation; either version 2 of the License, or
*   (at your option) any later version.
*
*
*Fichier mypdo.php
*
*Ce fichier contient la classe d'accès aux données pour MYSQL
*
* @author Rooty <rooty@rooty.me>
* @since  2021/12/13
* @version 0.1
* @link www.qware.fr
* @package system_data_source
* @subpackage database
*
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################
/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
*<p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* classe pdo
*
* classe de gestion de MySQL 4.xx
*
* @package system_data_source
* @subpackage database
*/
class mypdo extends Database
{

/**#@+
* @access public
*/

/**
* @var entier
* @desc identifiant de la connection a la base
*/
	var $db_connect;
/**
* @var query_result
* @desc pointeur de résultat sur requete SELECT
*/
	var $query_result;
/**
* @var tableau
* @desc Contient une ligne de résultat
*/
	var $row = array();
/**
* @var tableau
* @desc Contient tout le jeu de résultats
*/
	var $rowset = array();

/**
* @var entier
* @desc Nombre total de requetes effectuées
*/
	var $num_queries = 0;

/**#@-*/

	//
	// Constructor
	//

/**
*Constructeur de la classe MySQL5
*
*<p>Initialise la connection a la base de données MySQL 5</p>
*
* @param chaine Nom de l'hote MySQL
* @param chaine Port de l'hote MySQL
* @param chaine Nom d'utilisateur
* @param chaine Mot de passe de connection
* @param chaine Nom de la base a utiliser
* @param booléen Connection persistante
*/
	function mypdo($dbtype, $host, $port, $user, $password, $database, $charset, $persistency = true)
	{
		$this->__construct($dbtype, $server, $port, $user, $password, $database, $charset, $persistency);
	}

	function __construct($dbtype, $server, $port, $user, $password, $database, $charset, $persistency = true)
	{        
        $this->persistency =    $persistency;
        $this->dbtype =         $dbtype;
        $this->user =           $user;
        $this->password =       $password;
        $this->server =         $server;
		$this->dbport =         $port;
        $this->dbname =         $database;
        $this->dbcharset =      $charset;
 
        try {
            $this->db_connect = new PDO("$this->dbtype:host=$this->server;port=$this->dbport;dbname=$this->dbname;charset=$this->dbcharset", "$this->user", "$this->password"); // PDO Connection
        } catch  (PDOException $e) {
			// var_dump($e);
			// echo $e->getCode();
			// echo $e->getMessage();
			switch($e->getCode()) {
				case 2002:
					echo
					"<tr>
						<th align='left' bgcolor='#f57900' colspan='5'><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span>&nbsp;Connexion à la base de données impossible !</th></tr>";
					die();
					// break;
				case 1045:
				case 1044:
					echo
					"<tr>
						<th align='left' bgcolor='#f57900' colspan='5'><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span>&nbsp;".$e->getMessage()."</th>	</tr>";
					die();
					// break;
			}
            return false;
        }
    }
    
    function prepare($sql)
    {
        return $this->db_connect->prepare($sql);
    }
    
    function sql_quote($sql)
    {
        return $this->db_connect->quote($sql);
    }

/**
* Fermeture de connection
*
* Fonction qui ferme la connection a la base mysql
*
* @return booléen
*/
	function sql_close()
	{
		if($this->db_connect)
		{
            $result = $this->db_connect=null;
			return $result;
		}
		else
		{
			return false;
		}
   }

//
// Base query method
//

/**
* Fonction de requete SQL
*
* Permet de faire une requete sur la connection mySQL ouverte
*
* @param chaine Requete SQL
* @param booléen inutilisé dans ce cas
* @return result renvoie un pointeur de resultat ou faux si erreur de requete
*/

	function sql_query($query = "", $data=false, $transaction = FALSE)
	{
		$query=Database::rewriteQuery($query);
		$GLOBALS["SYSTEM_NB_QUERY"]=(isset($GLOBALS["SYSTEM_NB_QUERY"]))?$GLOBALS["SYSTEM_NB_QUERY"]+1:1;
		if($query != "")
		{
			$this->num_queries++;

			$this->query_result = $this->db_connect->prepare($query);

			if( !$data )
				$this->query_result->execute();
			else
				$this->query_result->execute($data);
		} else {
			$this->sql_error();
		}
		if(isset($this->query_result))
		{
			return $this->query_result;
		}
		else
		{
			return ( $transaction == END_TRANSACTION ) ? true : false;
		}
	}

/**
* Nombre de resultats retournés
*
* Permet de récuperer le nombre de lignes retournées lors de la dernière requête effectuée.
*
* @param entier (facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return entier nombre de résultats
*/
	function sql_numrows($query_id = 0)
	{
        if(!$query_id)
        {
            $query_id = $this->query_result;
        }
        if($query_id)
        {
            return $query_id->rowCount();
        }
        else
        {
            return false;
        }
	}

/**
* Nombre d'enregistrements modifiés
*
* Retourne le nombre d'enregistrements affectés par la derniere requete.
*
* @return entier nombre d'enregistrements modifiés
*/
	function sql_affectedrows()
	{
		if($this->query_result)
		{
			$result = $this->query_result->rowCount();
			return $result;
		}
		else
		{
			return false;
		}
	}

/**
* Nombre de champs
*
* Retourne le nombre de champs de la derniere requete effectuée
*
* @param entier (facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return entier nombre de champs
*/
	function sql_numfields($query_id = 0)
	{
		if(!$query_id)
		{
			$query_id = $this->query_result;
		}
		if($query_id)
		{
			$result = @mysql_num_fields($query_id);
			return $result;
		}
		else
		{
			return false;
		}
	}

/**
* Nom d'un champ
*
* Retourne le nom du champ placé a offset
*
* @param entier emplacement du champ
* @param entier (facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return chaine nom du champ
*/	
	function sql_fieldname($offset, $query_id = 0)
	{
		if(!$query_id)
		{
			$query_id = $this->query_result;
		}
		if($query_id)
		{
			$result = @mysql_field_name($query_id, $offset);
			return $result;
		}
		else
		{
			return false;
		}
	}
	
/**
* Type d'un champ
*
* Retourne le type du champ placé a offset
*
* @param entier emplacement du champ
* @param entier (facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return chaine type de champ
*/	
	function sql_fieldtype($offset, $query_id = 0)
	{
		if(!$query_id)
		{
			$query_id = $this->query_result;
		}
		if($query_id)
		{
			$result = @mysql_field_type($query_id, $offset);
			return $result;
		}
		else
		{
			return false;
		}
	}

/**
* Obtenir un résultat
*
* Retourne l'enregistrement courant sous forme de tableau
*
* @param entier facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return tableau tableau contenant les différents champs
*/

	function sql_fetchrow($query_id = 0)
    {
        if(!$query_id)
        {
            $query_id = $this->query_result;
        }
        
        if($query_id)
        {
            $query_id->setFetchMode(PDO::FETCH_BOTH);// Mode par défaut (tableau)
            $this->row = $query_id->fetch();
            return $this->row;
        }else{
            return false;
        }
   }

/**
* Obtenir tous les résultats
*
* Retourne tous les enregistrements courants (derniere requete effectuée) sous forme de tableau
*
* @param entier  (facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return tableau_2D tableau à deux dimensions contant tous les enregistrement
*/
	function sql_fetchrowset($query_id = 0)
	{
        if(!$query_id)
        {
            $query_id = $this->query_result;
        }
        if($query_id)
        {
            $query_id->setFetchMode(PDO::FETCH_BOTH);// Mode par défaut (tableau)
            while($this->rowset = $query_id->fetch())
            {
                $result[] = $this->rowset;
            }
            return $result;
        }else{
            return false;
        }
	}

/**
* Obtenir un champ particulier d'un resultat
*
* Retourne un champ déterminé d'un enregistrement déterminé .
*
* @param entier (ou chaine) champ a renvoyer
* @param entier (facultatif) identifiant de l'enregistrement (dernier par defaut)
* @param entier (facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return chaine valeur du champ
*/
	function sql_fetchfield($field, $rownum = -1, $query_id = 0)
	{
		if(!$query_id)
		{
			$query_id = $this->query_result;
		}
		if($query_id)
		{
			if($rownum > -1)
			{
				$result = @mysql_result($query_id, $rownum, $field);
			}
			else
			{
				if(empty($this->row[$query_id]) && empty($this->rowset[$query_id]))
				{
					if($this->sql_fetchrow())
					{
						$result = $this->row[$query_id][$field];
					}
				}
				else
				{
					if($this->rowset[$query_id])
					{
						$result = $this->rowset[$query_id][$field];
					}
					else if($this->row[$query_id])
					{
						$result = $this->row[$query_id][$field];
					}
				}
			}
			return $result;
		}
		else
		{
			return false;
		}
	}

/**
* Déplacement de pointeur de résultat
*
* Permet de déplacer le pointeur de résultat.
*
* @param entier ligne
* @param entier (facultatif) identifiant de requete , utilise la dernière requete par defaut
* @return result nouveau pointeur de resultat
*/
	function sql_rowseek($rownum, $query_id = 0){
		if(!$query_id)
		{
			$query_id = $this->query_result;
		}
		if($query_id)
		{
			$result = @mysql_data_seek($query_id, $rownum);
			return $result;
		}
		else
		{
			return false;
		}
	}

/**
* Identifiant d'insertion
*
* Permet d'obtenir l'identifiant d'insertion (Requete INSERT)
*
* @return entier identifiant
*
*/
	function sql_nextid(){
		if($this->db_connect)
		{
            $result = $this->db_connect->lastInsertId(); 
			return $result;
		}
		else
		{
			return false;
		}
	}

/**
* Fonction d'erreur
*
* Retourne un tableau contenant le numero et le message d'erreur
*
* @return tableau contenant les index ['message'] et ['code']
*/
	function sql_error($query_id = 0)
	{
		// $result["message"] = @mysql_error($this->db_connect);
		// $result["code"] = @mysql_errno($this->db_connect);
		$result = $this->db_connect->errorInfo();
		return $result;
	}
}
?>
