diff --git a/htdocs/lib/mysql.lib.php b/htdocs/lib/mysql.lib.php index edcbd21333c..16b09dd2905 100644 --- a/htdocs/lib/mysql.lib.php +++ b/htdocs/lib/mysql.lib.php @@ -1,6 +1,6 @@ - * Copyright (C) 2002-2004 Rodolphe Quiedeville + * Copyright (C) 2002-2005 Rodolphe Quiedeville * Copyright (C) 2004-2005 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify @@ -22,485 +22,488 @@ * */ -/** \file htdocs/lib/mysql.lib.php - \brief Fichier de la classe permettant de gérér la database de dolibarr. - \author Fabien Seisen - \author Rodolphe Quiedeville. - \author Laurent Destailleur. - \version $Revision$ +/** + \file htdocs/lib/mysql.lib.php + \brief Fichier de la classe permettant de gérer une base mysql + \author Fabien Seisen + \author Rodolphe Quiedeville. + \author Laurent Destailleur. + \version $Revision$ */ /** \class DoliDb - \brief Classe permettant de gérér la database de dolibarr + \brief Classe permettant de gérér la database de dolibarr */ -class DoliDb +class DoliDb { - var $db; // Handler de base - var $results; // Resultset de la dernière requete + var $db; // Handler de base + var $results; // Resultset de la dernière requete + + var $connected; // 1 si connecté, 0 sinon + var $database_selected; // 1 si base sélectionné, 0 sinon + var $transaction_opened; // 1 si une transaction est en cours, 0 sinon + + var $ok; + + // Constantes pour code erreurs + var $ERROR_DUPLICATE=1062; + var $ERROR_TABLEEXISTS=1050; + + + /** + \brief Ouverture d'une connection vers le serveur et éventuellement une database. + \param type type de base de données (mysql ou pgsql) + \param host addresse de la base de données + \param user nom de l'utilisateur autorisé + \param pass mot de passe + \param name nom de la database + \return int 1 en cas de succès, 0 sinon + */ + function DoliDb($type = 'mysql', $host = '', $user = '', $pass = '', $name = '') + { + global $conf; + $this->transaction_opened=0; - var $connected; // 1 si connecté, 0 sinon - var $database_selected; // 1 si base sélectionné, 0 sinon - var $transaction_opened; // 1 si une transaction est en cours, 0 sinon + if ($host == '') $host = $conf->db->host; + if ($user == '') $user = $conf->db->user; + if ($pass == '') $pass = $conf->db->pass; + if ($name == '') $name = $conf->db->name; - var $ok; + //print "Name DB: $host,$user,$pass,$name
"; - // Constantes pour code erreurs - var $ERROR_DUPLICATE=1062; - var $ERROR_TABLEEXISTS=1050; + // Essai connexion serveur + + $this->db = $this->connect($host, $user, $pass); + + if ($this->db) + { + $this->connected = 1; + $this->ok = 1; + } + else + { + $this->connected = 0; + $this->ok = 0; + dolibarr_syslog("DoliDB::DoliDB : Erreur Connect"); + } + + // Si connexion serveur ok et si connexion base demandée, on essaie connexion base + + if ($this->connected && $name) + { + if ($this->select_db($name) == 1) + { + $this->database_selected = 1; + $this->ok = 1; + } + else + { + $this->database_selected = 0; + $this->ok = 0; + dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db"); + } + } + else + { + // Pas de selection de base demandée, ok ou ko + $this->database_selected = 0; + } + + return $this->ok; + } + + /** + \brief Selectionne une database. + \param database nom de la database + \return resource + */ + + function select_db($database) + { + return mysql_select_db($database, $this->db); + } + + /** + \brief Connection vers le serveur + \param host addresse de la base de données + \param login nom de l'utilisateur autoris + \param passwd mot de passe + \return resource handler d'accès à la base + */ + + function connect($host, $login, $passwd) + { + $this->db = @mysql_connect($host, $login, $passwd); + //print "Resultat fonction connect: ".$this->db; + return $this->db; + } + + /** + \brief Connexion sur une base de donnée + \param database nom de la database + \return result resultat 1 pour ok, 0 pour non ok + */ + + function create_db($database) + { + if (mysql_create_db ($database, $this->db)) + { + return 1; + } + else + { + return 0; + } + } + + /** + \brief Copie d'un handler de database. + \return resource + */ + + function clone() + { + $db2 = new DoliDb("", "", "", "", ""); + $db2->db = $this->db; + return $db2; + } + + /** + \brief Ouverture d'une connection vers une database. + \param host Adresse de la base de données + \param login Nom de l'utilisateur autorisé + \param passwd Mot de passe + \return resource handler d'accès à la base + */ + + function pconnect($host, $login, $passwd) + { + $this->db = mysql_pconnect($host, $login, $passwd); + return $this->db; + } + + /** + \brief Fermeture d'une connection vers une database. + \return resource + */ + + function close() + { + return mysql_close($this->db); + } + + + /** + \brief Debut d'une transaction. + \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur + */ + + function begin() + { + if (! $this->transaction_opened) + { + $ret=$this->query("BEGIN"); + if ($ret) $this->transaction_opened++; + return $ret; + } + else + { + $this->transaction_opened++; + return 1; + } + } + + /** + \brief Validation d'une transaction + \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur + */ + + function commit() + { + if ($this->transaction_opened==1) + { + $ret=$this->query("COMMIT"); + if ($ret) $this->transaction_opened=0; + return $ret; + } + else + { + $this->transaction_opened--; + return 1; + } + } + + /** + \brief Annulation d'une transaction et retour aux anciennes valeurs + \return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur + */ + + function rollback() + { + if ($this->transaction_opened) + { + $ret=$this->query("ROLLBACK"); + $this->transaction_opened=0; + return $ret; + } + else + { + return 1; + } + } + + /** + \brief Effectue une requete et renvoi le resultset de réponse de la base + \param query Contenu de la query + \return resource Resultset de la reponse + */ + + function query($query) + { + $query = trim($query); + $ret = mysql_query($query, $this->db); + + if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) { + // Si requete utilisateur, on la sauvegarde ainsi que son resultset + $this->lastquery=$query; + $this->results = $ret; + } + + return $ret; + } + + /** + \brief Renvoie les données de la requete. + \param nb Contenu de la query + \param fieldname Nom du champ + \return resource + */ + + function result($nb, $fieldname) + { + return mysql_result($this->results, $nb, $fieldname); + } + + /** + \brief Renvoie la ligne courante (comme un objet) pour le curseur resultset. + \param resultset Curseur de la requete voulue + \return resource + */ + + function fetch_object($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return mysql_fetch_object($resultset); + } + + /** + \brief Renvoie les données dans un tableau. + \param resultset Curseur de la requete voulue + \return array + */ + + function fetch_array($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return mysql_fetch_array($resultset); + } + + /** + \brief Renvoie les données comme un tableau. + \param resultset Curseur de la requete voulue + \return array + */ + + function fetch_row($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return mysql_fetch_row($resultset); + } + + /** + \brief Obtient les données d'un colonne et renvoie les données sous forme d'objet. + \param resultset Curseur de la requete voulue + \return array + */ + + function fetch_field($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return mysql_fetch_field($resultset); + } + + /** + \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT + \see affected_rows + \param resultset Curseur de la requete voulue + \return int Nombre de lignes + */ + + function num_rows($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return mysql_num_rows($resultset); + } + + /** + \brief Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE + \see num_rows + \param resultset Curseur de la requete voulue + \return int Nombre de lignes + */ + + function affected_rows($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + // mysql necessite un link de base pour cette fonction contrairement + // a pqsql qui prend un resultset + return mysql_affected_rows($this->db); + } + + + /** + \brief Renvoie le nombre de champs dans le resultat de la requete. + \param resultset Curseur de la requete voulue + \return int + */ + + function num_fields($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return mysql_num_fields($resultset); + } + + /** + \brief Libère le dernier resultset utilisé sur cette connexion. + \param resultset Curseur de la requete voulue + \return resource + */ + + function free($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return mysql_free_result($resultset); + } - - /** - \brief Ouverture d'une connection vers le serveur et éventuellement une database. - \param type type de base de données (mysql ou pgsql) - \param host addresse de la base de données - \param user nom de l'utilisateur autorisé - \param pass mot de passe - \param name nom de la database - \return int 1 en cas de succès, 0 sinon - */ - function DoliDb($type = 'mysql', $host = '', $user = '', $pass = '', $name = '') - { - global $conf; - $this->transaction_opened=0; - - if ($host == '') $host = $conf->db->host; - if ($user == '') $user = $conf->db->user; - if ($pass == '') $pass = $conf->db->pass; - if ($name == '') $name = $conf->db->name; + /** + \brief Défini les limites de la requète. + \param limit + \param offset + \return int Limite + */ - //print "Name DB: $host,$user,$pass,$name
"; - - // Essai connexion serveur - - $this->db = $this->connect($host, $user, $pass); - - if ($this->db) - { - $this->connected = 1; - $this->ok = 1; - } - else - { - $this->connected = 0; - $this->ok = 0; - } - - // Si connexion serveur ok et si connexion base demandée, on essaie connexion base - - if ($this->connected && $name) - { - if ($this->select_db($name) == 1) - { - $this->database_selected = 1; - $this->ok = 1; - } - else - { - $this->database_selected = 0; - $this->ok = 0; - } - } - else - { - // Pas de selection de base demandée, ok ou ko - $this->database_selected = 0; - } - - return $this->ok; - } - - /** - \brief Selectionne une database. - \param database nom de la database - \return resource - */ - - function select_db($database) - { - return mysql_select_db($database, $this->db); - } - - /** - \brief Connection vers le serveur - \param host addresse de la base de données - \param login nom de l'utilisateur autoris - \param passwd mot de passe - \return resource handler d'accès à la base - */ - - function connect($host, $login, $passwd) - { - $this->db = @mysql_connect($host, $login, $passwd); - //print "Resultat fonction connect: ".$this->db; - return $this->db; - } - - /** - \brief Connexion sur une base de donnée - \param database nom de la database - \return result resultat 1 pour ok, 0 pour non ok - */ - - function create_db($database) - { - if (mysql_create_db ($database, $this->db)) - { - return 1; - } - else - { - return 0; - } - } - - /** - \brief Copie d'un handler de database. - \return resource - */ - - function clone() - { - $db2 = new DoliDb("", "", "", "", ""); - $db2->db = $this->db; - return $db2; - } - - /** - \brief Ouverture d'une connection vers une database. - \param host Adresse de la base de données - \param login Nom de l'utilisateur autorisé - \param passwd Mot de passe - \return resource handler d'accès à la base - */ - - function pconnect($host, $login, $passwd) - { - $this->db = mysql_pconnect($host, $login, $passwd); - return $this->db; - } - - /** - \brief Fermeture d'une connection vers une database. - \return resource - */ - - function close() - { - return mysql_close($this->db); - } - - - /** - \brief Debut d'une transaction. - \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur - */ - - function begin() - { - if (! $this->transaction_opened) - { - $ret=$this->query("BEGIN"); - if ($ret) $this->transaction_opened++; - return $ret; - } - else - { - $this->transaction_opened++; - return 1; - } - } - - /** - \brief Validation d'une transaction - \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur - */ - - function commit() - { - if ($this->transaction_opened==1) - { - $ret=$this->query("COMMIT"); - if ($ret) $this->transaction_opened=0; - return $ret; - } - else - { - $this->transaction_opened--; - return 1; - } - } - - /** - \brief Annulation d'une transaction et retour aux anciennes valeurs - \return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur - */ - - function rollback() - { - if ($this->transaction_opened) - { - $ret=$this->query("ROLLBACK"); - $this->transaction_opened=0; - return $ret; - } - else - { - return 1; - } - } - - /** - \brief Effectue une requete et renvoi le resultset de réponse de la base - \param query Contenu de la query - \return resource Resultset de la reponse - */ - - function query($query) - { - $query = trim($query); - $ret = mysql_query($query, $this->db); - - if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) { - // Si requete utilisateur, on la sauvegarde ainsi que son resultset - $this->lastquery=$query; - $this->results = $ret; - } - - return $ret; - } - - /** - \brief Renvoie les données de la requete. - \param nb Contenu de la query - \param fieldname Nom du champ - \return resource - */ - - function result($nb, $fieldname) - { - return mysql_result($this->results, $nb, $fieldname); - } - - /** - \brief Renvoie la ligne courante (comme un objet) pour le curseur resultset. - \param resultset Curseur de la requete voulue - \return resource - */ - - function fetch_object($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return mysql_fetch_object($resultset); - } - - /** - \brief Renvoie les données dans un tableau. - \param resultset Curseur de la requete voulue - \return array - */ - - function fetch_array($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return mysql_fetch_array($resultset); - } - - /** - \brief Renvoie les données comme un tableau. - \param resultset Curseur de la requete voulue - \return array - */ - - function fetch_row($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return mysql_fetch_row($resultset); - } - - /** - \brief Obtient les données d'un colonne et renvoie les données sous forme d'objet. - \param resultset Curseur de la requete voulue - \return array - */ - - function fetch_field($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return mysql_fetch_field($resultset); - } - - /** - \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT - \see affected_rows - \param resultset Curseur de la requete voulue - \return int Nombre de lignes - */ - - function num_rows($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return mysql_num_rows($resultset); - } - - /** - \brief Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE - \see num_rows - \param resultset Curseur de la requete voulue - \return int Nombre de lignes - */ - - function affected_rows($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - // mysql necessite un link de base pour cette fonction contrairement - // a pqsql qui prend un resultset - return mysql_affected_rows($this->db); - } + function plimit($limit=0,$offset=0) + { + if ($offset > 0) + { + return " LIMIT $offset,$limit "; + } + else + { + return " LIMIT $limit "; + } + } - /** - \brief Renvoie le nombre de champs dans le resultat de la requete. - \param resultset Curseur de la requete voulue - \return int - */ + /** + \brief Formatage par la base de données d'un champ de la base au format Timestamp ou Date (YYYY-MM-DD HH:MM:SS) + afin de retourner une donnée toujours au format universel date tms unix. + \param fname + \return date + */ + function pdate($fname) + { + return "unix_timestamp($fname)"; + } - function num_fields($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return mysql_num_fields($resultset); - } + /** + \brief Formatage de la date en fonction des locales. + \param fname + \return date + */ + function idate($fname) + { + return strftime("%Y%m%d%H%M%S",$fname); + } - /** - \brief Libère le dernier resultset utilisé sur cette connexion. - \param resultset Curseur de la requete voulue - \return resource - */ + /** + \brief Renvoie la derniere requete soumise par la methode query() + \return lastquery + */ - function free($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return mysql_free_result($resultset); - } - - /** - \brief Défini les limites de la requète. - \param limit - \param offset - \return int Limite - */ + function lastquery() + { + return $this->lastquery; + } - function plimit($limit=0,$offset=0) - { - if ($offset > 0) - { - return " LIMIT $offset,$limit "; - } - else - { - return " LIMIT $limit "; - } - } + /** + \brief Renvoie le texte de l'erreur mysql de l'operation precedente. + \return error_text + */ + function error() + { + return mysql_error($this->db); + } - /** - \brief Formatage par la base de données d'un champ de la base au format Timestamp ou Date (YYYY-MM-DD HH:MM:SS) - afin de retourner une donnée toujours au format universel date tms unix. - \param fname - \return date - */ - function pdate($fname) - { - return "unix_timestamp($fname)"; - } + /** + \brief Renvoie la valeur numerique de l'erreur de l'operation precedente. + pour etre exploiter par l'appelant et détecter les erreurs du genre: + echec car doublons, table deja existante... + \return error_num + */ - /** - \brief Formatage de la date en fonction des locales. - \param fname - \return date - */ - function idate($fname) - { - return strftime("%Y%m%d%H%M%S",$fname); - } + function errno() + { + // $ERROR_DUPLICATE=1062; + // $ERROR_TABLEEXISTS=1050; + return mysql_errno($this->db); + } - /** - \brief Renvoie la derniere requete soumise par la methode query() - \return lastquery - */ + /** + \brief Obtient l'id genéré par le dernier INSERT. + \return id + */ - function lastquery() - { - return $this->lastquery; - } + function last_insert_id() + { + return mysql_insert_id($this->db); + } - /** - \brief Renvoie le texte de l'erreur mysql de l'operation precedente. - \return error_text - */ + /** + \brief Retourne le dsn pear + \return dsn + */ - function error() - { - return mysql_error($this->db); - } + function getdsn($db_type,$db_user,$db_pass,$db_host,$dbname) + { + $pear = $db_type.'://'.$db_user.':'.$db_pass.'@'. + $db_host.'/'.$db_name; - /** - \brief Renvoie la valeur numerique de l'erreur de l'operation precedente. - pour etre exploiter par l'appelant et détecter les erreurs du genre: - echec car doublons, table deja existante... - \return error_num - */ + return $pear; + } - function errno() - { - // $ERROR_DUPLICATE=1062; - // $ERROR_TABLEEXISTS=1050; - return mysql_errno($this->db); - } + /** + \brief Liste des tables dans une database. + \param database Nom de la database + \return resource + */ - /** - \brief Obtient l'id genéré par le dernier INSERT. - \return id - */ - - function last_insert_id() - { - return mysql_insert_id($this->db); - } - - /** - \brief Retourne le dsn pear - \return dsn - */ - - function getdsn($db_type,$db_user,$db_pass,$db_host,$dbname) - { - $pear = $db_type.'://'.$db_user.':'.$db_pass.'@'. - $db_host.'/'.$db_name; - - return $pear; - } - - /** - \brief Liste des tables dans une database. - \param database Nom de la database - \return resource - */ - - function list_tables($database) - { - $this->results = mysql_list_tables($database, $this->db); - return $this->results; - } + function list_tables($database) + { + $this->results = mysql_list_tables($database, $this->db); + return $this->results; + } }