diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php index 08da8e0186e819e57ea8fe169ce2288b6a09f6a9..3dd4fb2f8bc7a23e2520b18f9be9cacdb87ff9db 100644 --- a/htdocs/lib/databases/mysql.lib.php +++ b/htdocs/lib/databases/mysql.lib.php @@ -794,6 +794,26 @@ class DoliDb } return $listtables; } + + /** + * \brief Liste les informations des champs d'une table. + * \param table Nom de la table + * \return array Tableau des informations des champs de la table + */ + function DDLInfoTable($table) + { + $infotables=array(); + + $sql="SHOW FULL COLUMNS FROM ".$table.";"; + + dol_syslog($sql,LOG_DEBUG); + $result = $this->query($sql); + while($row = $this->fetch_row($result)) + { + $infotables[] = $row; + } + return $infotables; + } /** * \brief Cree une table diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php index 772f8cb6999c038245b224b283193d8d21e49452..0c3564cb45cec2258f45a9da78f9cfeceb8f185f 100644 --- a/htdocs/lib/databases/mysqli.lib.php +++ b/htdocs/lib/databases/mysqli.lib.php @@ -806,6 +806,26 @@ class DoliDb } return $listtables; } + + /** + * \brief Liste les informations des champs d'une table. + * \param table Nom de la table + * \return array Tableau des informations des champs de la table + */ + function DDLInfoTable($table) + { + $infotables=array(); + + $sql="SHOW FULL COLUMNS FROM ".$table.";"; + + dol_syslog($sql,LOG_DEBUG); + $result = $this->query($sql); + while($row = $this->fetch_row($result)) + { + $infotables[] = $row; + } + return $infotables; + } /** * \brief Cree une table diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php index b5e81b12d4f0eba6bd688f50d7fa1a899b1714a1..27efe9a44f24adb78fb03a60c2567b4ee80f531a 100644 --- a/htdocs/lib/databases/pgsql.lib.php +++ b/htdocs/lib/databases/pgsql.lib.php @@ -3,7 +3,8 @@ * Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org> * Copyright (C) 2004-2008 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org> - * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be> + * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be> + * Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr> * * 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 @@ -22,7 +23,7 @@ /** \file htdocs/lib/databases/pgsql.lib.php - \brief Fichier de la classe permettant de g�r�r une base pgsql + \brief Fichier de la classe permettant de gerer une base pgsql \version $Id$ */ // For compatibility during upgrade @@ -32,7 +33,7 @@ if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/a /** \class DoliDb - \brief Classe permettant de g�r�r la database de dolibarr + \brief Classe permettant de gerer la database de dolibarr */ class DoliDb { @@ -42,11 +43,11 @@ class DoliDb var $forcecharset='latin1'; var $versionmin=array(8,1,0); // Version min database - var $results; // Resultset de la derni�re requete + var $results; // Resultset de la derniere requete - var $connected; // 1 si connect�, 0 sinon - var $database_selected; // 1 si base s�lectionn�, 0 sinon - var $database_name; // Nom base s�lectionn�e + var $connected; // 1 si connecte, 0 sinon + var $database_selected; // 1 si base selectionne, 0 sinon + var $database_name; // Nom base selectionnee var $database_user; //! Nom user base var $transaction_opened; // 1 si une transaction est en cours, 0 sinon var $lastquery; @@ -59,15 +60,15 @@ class DoliDb /** - \brief Ouverture d'une connexion vers le serveur et 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 - \param port Port of database server - \return int 1 en cas de succ�s, 0 sinon - */ + * \brief Ouverture d'une connexion vers le serveur et une database. + * \param type type de base de donnees (mysql ou pgsql) + * \param host addresse de la base de donnees + * \param user nom de l'utilisateur autorise + * \param pass mot de passe + * \param name nom de la database + * \param port Port of database server + * \return int 1 en cas de succes, 0 sinon + */ function DoliDb($type='pgsql', $host, $user, $pass, $name='', $port=0) { global $conf,$langs; @@ -115,7 +116,7 @@ class DoliDb dol_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR); } - // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base + // Si connexion serveur ok et si connexion base demandee, on essaie connexion base if ($this->connected && $name) { if ($this->select_db($name)) @@ -331,12 +332,12 @@ class DoliDb } /** - \brief Selectionne une database. - \param database nom de la database - \return boolean true si ok, false si ko - \remarks Ici postgresql n'a aucune fonction equivalente de mysql_select_db - \remarks On compare juste manuellement si la database choisie est bien celle activ�e par la connexion - */ + * \brief Selectionne une database. + * \param database nom de la database + * \return boolean true si ok, false si ko + * \remarks Ici postgresql n'a aucune fonction equivalente de mysql_select_db + * \remarks On compare juste manuellement si la database choisie est bien celle activee par la connexion + */ function select_db($database) { if ($database == $this->database_name) @@ -346,14 +347,14 @@ class DoliDb } /** - \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 - \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) - \param port Port of database server - \return resource handler d'acc�s � la base - */ + * \brief Connection vers le serveur + * \param host addresse de la base de donnees + * \param login nom de l'utilisateur autorise + * \param passwd mot de passe + * \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) + * \param port Port of database server + * \return resource handler d'acces a la base + */ function connect($host, $login, $passwd, $name, $port=0) { if (!$name){ @@ -368,11 +369,10 @@ class DoliDb return $this->db; } - /** - \brief Renvoie la version du serveur - \return string Chaine version - */ + * \brief Renvoie la version du serveur + * \return string Chaine version + */ function getVersion() { $resql=$this->query('SHOW server_version'); @@ -381,46 +381,45 @@ class DoliDb } /** - \brief Renvoie la version du serveur sous forme de nombre - \return string Chaine version - */ - function getIntVersion() - { - $version= $this->getVersion(); - $vlist=split('[.-]',$version); - if (strlen($vlist[1])==1){ - $vlist[1]="0".$vlist[1]; - } - if (strlen($vlist[2])==1){ - $vlist[2]="0".$vlist[2]; - } - return $vlist[0].$vlist[1].$vlist[2]; - } + * \brief Renvoie la version du serveur sous forme de nombre + * \return string Chaine version + */ + function getIntVersion() + { + $version = $this->getVersion(); + $vlist = split('[.-]',$version); + if (strlen($vlist[1])==1){ + $vlist[1]="0".$vlist[1]; + } + if (strlen($vlist[2])==1){ + $vlist[2]="0".$vlist[2]; + } + return $vlist[0].$vlist[1].$vlist[2]; + } /** - \brief Renvoie la version du serveur dans un tableau - \return array Tableau de chaque niveau de version - */ + * \brief Renvoie la version du serveur dans un tableau + * \return array Tableau de chaque niveau de version + */ function getVersionArray() { return split('\.',$this->getVersion()); } /** - \brief Fermeture d'une connexion vers une database. - \return resource - */ + * \brief Fermeture d'une connexion vers une database. + * \return resource + */ function close() { dol_syslog("DoliDB::disconnect",LOG_DEBUG); return pg_close($this->db); } - /** - \brief Debut d'une transaction. - \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur - */ + * \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) @@ -441,9 +440,9 @@ class DoliDb } /** - \brief Validation d'une transaction - \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur - */ + * \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) @@ -464,9 +463,9 @@ class DoliDb } /** - \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 - */ + * \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<=1) @@ -485,10 +484,10 @@ class DoliDb /** - \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 - */ + * \brief Effectue une requete et renvoi le resultset de reponse de la base + * \param query Contenu de la query + * \return resource Resultset de la reponse + */ function query($query) { $query = trim($query); @@ -514,63 +513,63 @@ class DoliDb } /** - \brief Renvoie la ligne courante (comme un objet) pour le curseur resultset. - \param resultset Curseur de la requete voulue - \return resource - */ + * \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 + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_object($resultset); } /** - \brief Renvoie les donn�es dans un tableau. - \param resultset Curseur de la requete voulue - \return array - */ + * \brief Renvoie les donnees 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 + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_array($resultset); } /** - \brief Renvoie les donn�es comme un tableau. - \param resultset Curseur de la requete voulue - \return array - */ + * \brief Renvoie les donnees 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 + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_row($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 - */ + * \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 + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_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 - */ + * \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 + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } // pgsql necessite un resultset pour cette fonction contrairement // a mysql qui prend un link de base @@ -579,12 +578,12 @@ class DoliDb /** - \brief Lib�re le dernier resultset utilis� sur cette connexion. - \param resultset Curseur de la requete voulue - */ + * \brief Libere le dernier resultset utilise sur cette connexion. + * \param resultset Curseur de la requete voulue + */ function free($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } // Si resultset en est un, on libere la m�moire if (is_resource($resultset)) pg_free_result($resultset); @@ -592,11 +591,11 @@ class DoliDb /** - \brief D�fini les limites de la requ�te. - \param limit nombre maximum de lignes retourn�es - \param offset num�ro de la ligne � partir de laquelle recup�rer les lignes - \return string chaine exprimant la syntax sql de la limite - */ + * \brief Defini les limites de la requete. + * \param limit nombre maximum de lignes retournees + * \param offset numero de la ligne a partir de laquelle recuperer les lignes + * \return string chaine exprimant la syntax sql de la limite + */ function plimit($limit=0,$offset=0) { global $conf; @@ -607,12 +606,12 @@ class DoliDb /** - \brief D�fini le tri de la requ�te. - \param sortfield liste des champ de tri - \param sortorder ordre du tri - \return string chaine exprimant la syntax sql de l'ordre de tri - \TODO A mutualiser dans classe mere - */ + * \brief Defini le tri de la requete. + * \param sortfield liste des champ de tri + * \param sortorder ordre du tri + * \return string chaine exprimant la syntax sql de l'ordre de tri + * \TODO A mutualiser dans classe mere + */ function order($sortfield=0,$sortorder=0) { if ($sortfield) @@ -637,21 +636,21 @@ class DoliDb /** - \brief Escape a string to insert data. - \param stringtoencode String to escape - \return string String escaped - */ + * \brief Escape a string to insert data. + * \param stringtoencode String to escape + * \return string String escaped + */ function escape($stringtoencode) { return addslashes($stringtoencode); } - /** - * \brief Formatage (par la base de donn�es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS) - * afin de retourner une donn�e toujours au format universel date tms unix. - * Fonction � utiliser pour g�n�rer les SELECT. - * \param param Date au format text � convertir + /** + * \brief Formatage (par la base de donnees) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS) + * afin de retourner une donnee toujours au format universel date tms unix. + * Fonction a utiliser pour generer les SELECT. + * \param param Date au format text a convertir * \return date Date au format tms. */ function pdate($param) @@ -689,7 +688,7 @@ class DoliDb * \param test chaine test * \param resok resultat si test egal * \param resko resultat si test non egal - * \return string chaine format� SQL + * \return string chaine formate SQL */ function ifsql($test,$resok,$resko) { @@ -716,27 +715,27 @@ class DoliDb } /** - \brief Renvoie le libelle derniere erreur - \return string lasterror - */ + * \brief Renvoie le libelle derniere erreur + * \return string lasterror + */ function lasterror() { return $this->lasterror; } /** - \brief Renvoie le code derniere erreur - \return string lasterrno - */ + * \brief Renvoie le code derniere erreur + * \return string lasterrno + */ function lasterrno() { return $this->lasterrno; } /** - \brief Renvoie le code erreur generique de l'operation precedente. - \return error_num (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...) - */ + * \brief Renvoie le code erreur generique de l'operation precedente. + * \return error_num (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...) + */ function errno() { if (empty($error_regexps)) @@ -762,19 +761,19 @@ class DoliDb } /** - \brief Renvoie le texte de l'erreur pgsql de l'operation precedente. - \return error_text - */ + * \brief Renvoie le texte de l'erreur pgsql de l'operation precedente. + * \return error_text + */ function error() { return pg_last_error($this->db); } /** - \brief R�cup�re l'id gen�r� par le dernier INSERT. - \param tab Nom de la table concern�e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit� avec Postgresql - \return int id - */ + * \brief Recupere l'id genere par le dernier INSERT. + * \param tab Nom de la table concernee par l'insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql + * \return int id + */ function last_insert_id($tab) { $result = pg_query($this->db,"SELECT MAX(rowid) FROM ".$tab." ;"); @@ -786,12 +785,68 @@ class DoliDb // Next function are not required. Only minor features use them. //-------------------------------------------------------------- + /** + * \brief Encrypt sensitive data in database + * \param field Field name to encrypt + * \param cryptType Type of encryption (2: AES (recommended), 1: DES , 0: no encryption) + * \param cryptKey Encryption key + * \return return Field to encrypt if used + * TODO modifier pour postgresql + */ + function encrypt($field, $cryptType=0, $cryptKey='') + { + /* + $return = $field; + + if ($cryptType && !empty($cryptKey)) + { + if ($cryptType == 2) + { + $return = 'AES_ENCRYPT('.$field.',\''.$cryptKey.'\')'; + } + else if ($cryptType == 1) + { + $return = 'DES_ENCRYPT('.$field.',\''.$cryptKey.'\')'; + } + } + + return $return; + */ + } + + /** + * \brief Decrypt sensitive data in database + * \param field Field name to decrypt + * \param cryptType Type of encryption (2: AES (recommended), 1: DES , 0: no encryption) + * \param cryptKey Encryption key + * \return return Field to decrypt if used + * TODO modifier pour postgresql + */ + function decrypt($field, $cryptType=0, $cryptKey='') + { + /* + $return = $field; + + if ($cryptType && !empty($cryptKey)) + { + if ($cryptType == 2) + { + $return = 'AES_DECRYPT('.$field.',\''.$cryptKey.'\')'; + } + else if ($cryptType == 1) + { + $return = 'DES_DECRYPT('.$field.',\''.$cryptKey.'\')'; + } + } + return $return; + */ + } /** - \brief Renvoie l'id de la connexion - \return string Id connexion - */ + * \brief Renvoie l'id de la connexion + * \return string Id connexion + */ function DDLGetConnectId() { return '?'; @@ -817,25 +872,48 @@ class DoliDb } /** - \brief Liste des tables dans une database. - \param database Nom de la database - \return resource - */ + * \brief Liste des tables dans une database. + * \param database Nom de la database + * \return resource + */ function DDLListTables($database) { $this->results = pg_query($this->db, "SHOW TABLES;"); return $this->results; } + + /** + * \brief Liste les informations des champs d'une table. + * \param table Nom de la table + * \return array Tableau des informations des champs de la table + * TODO modifier pour postgresql + */ + function DDLInfoTable($table) + { + /* + $infotables=array(); + + $sql="SHOW FULL COLUMNS FROM ".$table.";"; + + dol_syslog($sql,LOG_DEBUG); + $result = $this->pg_query($this->db,$sql); + while($row = $this->fetch_row($result)) + { + $infotables[] = $row; + } + return $infotables; + */ + } /** - \brief Create a user - \param dolibarr_main_db_host Ip serveur - \param dolibarr_main_db_user Nom user � cr�er - \param dolibarr_main_db_pass Mot de passe user � cr�er - \param dolibarr_main_db_name Database name where user must be granted - \return int <0 si KO, >=0 si OK - */ + * \brief Create a user + * \param dolibarr_main_db_host Ip serveur + * \param dolibarr_main_db_user Nom user a creer + * \param dolibarr_main_db_pass Mot de passe user a creer + * \param dolibarr_main_db_name Database name where user must be granted + * \return int <0 si KO, >=0 si OK + */ function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name) { $sql = "create user \"".$dolibarr_main_db_user."\" with password '".$dolibarr_main_db_pass."'"; @@ -854,13 +932,13 @@ class DoliDb * \brief Insert a new field in table * \param table Nom de la table * \param field_name Nom du champ a inserer - * \param field_desc Tableau associatif de description du champ a inserer[nom du parametre][valeur du param�tre] + * \param field_desc Tableau associatif de description du champ a inserer[nom du parametre][valeur du parametre] * \param field_position Optionnel ex.: "after champtruc" * \return int <0 si KO, >0 si OK */ function DDLAddField($table,$field_name,$field_desc,$field_position="") { - // cl�s recherch�es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra + // cles recherchees dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra // ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment'); $sql= "ALTER TABLE ".$table." ADD ".$field_name." "; $sql .= $field_desc['type']; @@ -904,13 +982,20 @@ class DoliDb else return 1; } - + /** + * \brief Return charset used to store data in database + * \return string Charset + */ function getDefaultCharacterSetDatabase(){ $resql=$this->query('SHOW SERVER_ENCODING'); $liste=$this->fetch_array($resql); return $liste['server_encoding']; } + /** + * \brief Return list of available charset that can be used to store data in database + * \return array List of Charset + */ function getListOfCharacterSet(){ $resql=$this->query('SHOW CHARSET'); $liste = array(); @@ -931,6 +1016,10 @@ class DoliDb return $liste; } + /** + * \brief Return collation used in database + * \return string Collation value + */ function getDefaultCollationDatabase(){ $resql=$this->query('SHOW VARIABLES LIKE \'collation_database\''); if (!$resql) @@ -942,6 +1031,10 @@ class DoliDb return $liste['Value']; } + /** + * \brief Return list of available collation that can be used for database + * \return array Liste of Collation + */ function getListOfCollation(){ $resql=$this->query('SHOW COLLATION'); $liste = array();