diff --git a/htdocs/lib/databases/mssql.lib.php b/htdocs/lib/databases/mssql.lib.php index 4191d8ea1fae4789824cd44ad8c802f3293545ec..4b52dd49c57c6737ed47b311f6c0cf868f7d5e91 100644 --- a/htdocs/lib/databases/mssql.lib.php +++ b/htdocs/lib/databases/mssql.lib.php @@ -20,239 +20,218 @@ */ /** - \file htdocs/lib/databases/mssql.lib.php - \brief Fichier de la classe permettant de g�rer une base mssql - \version $Id$ -*/ -// Pour compatibilit� lors de l'upgrade + \file htdocs/lib/databases/mssql.lib.php + \brief Fichier de la classe permettant de g�rer une base mssql + \version $Id$ + */ +// Pour compatibilite lors de l'upgrade if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php"); /** - \class DoliDb - \brief Classe de gestion de la database de dolibarr - \remarks Works with PHP5 Only -*/ + \class DoliDb + \brief Classe de gestion de la database de dolibarr + \remarks Works with PHP5 Only + */ class DoliDb { - //! Handler de base - var $db; - //! Nom du gestionnaire - var $type='mssql'; - //! Charset - var $forcecharset='latin1'; - //! Collate - var $forcecollate='latin1_swedish_ci'; - //! Version min database - var $versionmin=array(2000); - //! Resultset de la derni�re requete - var $results; - //! 1 si connect�, 0 sinon - var $connected; - //! 1 si base s�lectionn�, 0 sinon - var $database_selected; - //! Nom base s�lectionn�e - var $database_name; - //! Nom user base - var $database_user; - //! 1 si une transaction est en cours, 0 sinon - var $transaction_opened; - //! Derniere requete ex�cut�e - var $lastquery; - //! Derniere requete ex�cut�e avec echec - var $lastqueryerror; - //! Message erreur mysql - var $lasterror; - //! Message erreur mysql - var $lasterrno; - - var $ok; - var $error; - - - // Constantes pour conversion code erreur MSSql en code erreur g�n�rique - var $errorcode_map = array( - 1004 => 'DB_ERROR_CANNOT_CREATE', - 1005 => 'DB_ERROR_CANNOT_CREATE', - 1006 => 'DB_ERROR_CANNOT_CREATE', - 1007 => 'DB_ERROR_ALREADY_EXISTS', - 1008 => 'DB_ERROR_CANNOT_DROP', - 1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP', - 1046 => 'DB_ERROR_NODBSELECTED', - 1048 => 'DB_ERROR_CONSTRAINT', - 2714 => 'DB_ERROR_TABLE_ALREADY_EXISTS', - 1051 => 'DB_ERROR_NOSUCHTABLE', - 1054 => 'DB_ERROR_NOSUCHFIELD', - 1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS', - 1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS', - 2627 => 'DB_ERROR_RECORD_ALREADY_EXISTS', - 102 => 'DB_ERROR_SYNTAX', - 8120 => 'DB_ERROR_GROUP_BY_SYNTAX', - 1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', - 1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY', - 1091 => 'DB_ERROR_NOSUCHFIELD', - 1100 => 'DB_ERROR_NOT_LOCKED', - 1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW', - 1146 => 'DB_ERROR_NOSUCHTABLE', - 1216 => 'DB_ERROR_NO_PARENT', - 1217 => 'DB_ERROR_CHILD_EXISTS', - 1451 => 'DB_ERROR_CHILD_EXISTS' - ); - - - /** - \brief Ouverture d'une connexion 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 - \param port Port of database server - \return int 1 en cas de succ�s, 0 sinon - */ - function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0) - { - global $conf,$langs; - - $this->database_user=$user; - $this->transaction_opened=0; - - if (! function_exists("mssql_connect")) - { - $this->connected = 0; - $this->ok = 0; - $this->error="Mssql PHP functions for using MSSql driver are not available in this version of PHP"; - dolibarr_syslog("DoliDB::DoliDB : MSsql PHP functions for using MSsql driver are not available in this version of PHP",LOG_ERR); - return $this->ok; - } - - if (! $host) - { - $this->connected = 0; - $this->ok = 0; - $this->error=$langs->trans("ErrorWrongHostParameter"); - dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR); - return $this->ok; - } - - // Essai connexion serveur - $this->db = $this->connect($host, $user, $pass, $name, $port); - if ($this->db) - { - // Si client connect� avec charset different de celui de la base Dolibarr - // (La base Dolibarr a �t� forc�e en this->forcecharset � l'install) - $this->connected = 1; - $this->ok = 1; - } - else - { - // host, login ou password incorrect - $this->connected = 0; - $this->ok = 0; - $this->error=mssql_get_last_message(); - dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mssql_get_last_message=".$this->error,LOG_ERR); - } - - // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base - if ($this->connected && $name) - { - if ($this->select_db($name)) - { - $this->database_selected = 1; - $this->database_name = $name; - $this->ok = 1; - } - else - { - $this->database_selected = 0; - $this->database_name = ''; - $this->ok = 0; - $this->error=$this->error(); - dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR); - } - } - 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 boolean true si ok, false si ko + //! Handler de base + var $db; + //! Nom du gestionnaire + var $type='mssql'; + //! Charset + var $forcecharset='latin1'; + //! Collate + var $forcecollate='latin1_swedish_ci'; + //! Version min database + var $versionmin=array(2000); + //! Resultset de la derni�re requete + var $results; + //! 1 si connect�, 0 sinon + var $connected; + //! 1 si base s�lectionn�, 0 sinon + var $database_selected; + //! Nom base s�lectionn�e + var $database_name; + //! Nom user base + var $database_user; + //! 1 si une transaction est en cours, 0 sinon + var $transaction_opened; + //! Derniere requete ex�cut�e + var $lastquery; + //! Derniere requete ex�cut�e avec echec + var $lastqueryerror; + //! Message erreur mysql + var $lasterror; + //! Message erreur mysql + var $lasterrno; + + var $ok; + var $error; + + + /** + \brief Ouverture d'une connexion 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 + \param port Port of database server + \return int 1 en cas de succ�s, 0 sinon */ - function select_db($database) - { - return mssql_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 - \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) + function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0) + { + global $conf,$langs; + + $this->database_user=$user; + $this->transaction_opened=0; + + if (! function_exists("mssql_connect")) + { + $this->connected = 0; + $this->ok = 0; + $this->error="Mssql PHP functions for using MSSql driver are not available in this version of PHP"; + dolibarr_syslog("DoliDB::DoliDB : MSsql PHP functions for using MSsql driver are not available in this version of PHP",LOG_ERR); + return $this->ok; + } + + if (! $host) + { + $this->connected = 0; + $this->ok = 0; + $this->error=$langs->trans("ErrorWrongHostParameter"); + dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR); + return $this->ok; + } + + // Essai connexion serveur + $this->db = $this->connect($host, $user, $pass, $name, $port); + if ($this->db) + { + // Si client connect� avec charset different de celui de la base Dolibarr + // (La base Dolibarr a �t� forc�e en this->forcecharset � l'install) + $this->connected = 1; + $this->ok = 1; + } + else + { + // host, login ou password incorrect + $this->connected = 0; + $this->ok = 0; + $this->error=mssql_get_last_message(); + dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mssql_get_last_message=".$this->error,LOG_ERR); + } + + // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base + if ($this->connected && $name) + { + if ($this->select_db($name)) + { + $this->database_selected = 1; + $this->database_name = $name; + $this->ok = 1; + } + else + { + $this->database_selected = 0; + $this->database_name = ''; + $this->ok = 0; + $this->error=$this->error(); + dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR); + } + } + else + { + // Pas de selection de base demandee, ok ou ko + $this->database_selected = 0; + } + + return $this->ok; + } + + /** + * \brief Convert a SQL request in mysql syntax to database syntax + * \param request SQL request to convert + * \return string SQL request converted + */ + function convertSQLFromMysql($request) + { + return $request; + } + + /** + * \brief Selectionne une database. + * \param database Nom de la database + * \return boolean true si ok, false si ko + */ + function select_db($database) + { + return mssql_select_db($database, $this->db); + } + + /** + \brief Connection vers le serveur + \param host addresse de la base de donnees + \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 - \seealso close + \return resource handler d'acc�s � la bas + \seealso close */ - function connect($host, $login, $passwd, $name, $port=0) - { - dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name"); - $newhost=$host; - if ($port) $newhost.=':'.$port; - $this->db = @mssql_connect($newhost, $login, $passwd); - //force les enregistrement en latin1 si la base est en utf8 par d�faut - // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec - // les nouvelles version de Dolibarr car forc� par l'install Dolibarr. - //$this->query('SET NAMES '.$this->forcecharset); - //print "Resultat fonction connect: ".$this->db; - return $this->db; - } - - /** - \brief Renvoie la version du serveur - \return string Chaine version + function connect($host, $login, $passwd, $name, $port=0) + { + dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name"); + $newhost=$host; + if ($port) $newhost.=':'.$port; + $this->db = @mssql_connect($newhost, $login, $passwd); + //force les enregistrement en latin1 si la base est en utf8 par d�faut + // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec + // les nouvelles version de Dolibarr car forc� par l'install Dolibarr. + //$this->query('SET NAMES '.$this->forcecharset); + //print "Resultat fonction connect: ".$this->db; + return $this->db; + } + + /** + \brief Renvoie la version du serveur + \return string Chaine version */ - function getVersion() - { - $resql=$this->query("SELECT @@VERSION"); - $version=$this->fetch_array($resql); - return $version['computed']; - } - - - /** - \brief Renvoie la version du serveur dans un tableau - \return array Tableau de chaque niveau de version + function getVersion() + { + $resql=$this->query("SELECT @@VERSION"); + $version=$this->fetch_array($resql); + return $version['computed']; + } + + + /** + \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 - \seealso connect + function getVersionArray() + { + return split('\.',$this->getVersion()); + } + + + /** + \brief Fermeture d'une connexion vers une database. + \return resource + \seealso connect */ - function close() - { - return mssql_close($this->db); - } - + function close() + { + return mssql_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) @@ -275,13 +254,13 @@ class DoliDb /** \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 TRANSACTION"); - if ($ret) + if ($ret) { $this->transaction_opened=0; dolibarr_syslog("COMMIT Transaction",LOG_DEBUG); @@ -294,220 +273,220 @@ class DoliDb 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 + + /** + \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) - { - $ret=$this->query("ROLLBACK TRANSACTION"); - $this->transaction_opened=0; - dolibarr_syslog("ROLLBACK Transaction",LOG_DEBUG); - return $ret; - } - else - { - $this->transaction_opened--; - 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 rollback() + { + if ($this->transaction_opened<=1) + { + $ret=$this->query("ROLLBACK TRANSACTION"); + $this->transaction_opened=0; + dolibarr_syslog("ROLLBACK Transaction",LOG_DEBUG); + return $ret; + } + else + { + $this->transaction_opened--; + 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); - - // Conversion syntaxe MySql vers MSDE. - $query = str_ireplace("now()", "getdate()", $query); - // Erreur SQL: cannot update timestamp field - $query = str_ireplace(", tms = tms", "", $query); - // Voir si l'on peut directement utiliser $query = str_ireplace("file", "[file]", $query); - // au lieu des 3 lignes ci-dessous - $query = str_ireplace(".file", ".[file]", $query); - $query = str_ireplace(" file ", " [file] ", $query); - $query = str_ireplace(" file,", " [file],", $query); - // Idem file - $query = str_ireplace(".percent", ".[percent]", $query); - $query = str_ireplace(" percent ", " [percent] ", $query); - $query = str_ireplace("percent,", "[percent],", $query); - $query = str_ireplace("percent=", "[percent]=", $query); - $query = str_ireplace("\'", "''", $query); - - - $itemfound = stripos($query, " limit "); - if ($itemfound !== false) { - // Extraire le nombre limite - $number = stristr($query, " limit "); - $number = substr($number, 7); - // Ins�rer l'instruction TOP et le nombre limite - $query = str_ireplace("select ", "select top ".$number." ", $query); - // Supprimer l'instruction MySql - $query = str_ireplace(" limit ".$number, "", $query); - } - - $itemfound = stripos($query, " week("); - if ($itemfound !== false) { - // Recr�er une requ�te sans instruction Mysql - $positionMySql = stripos($query, " week("); - $newquery = substr($query, 0, $positionMySql); - - // R�cup�rer la date pass�e en param�tre - $extractvalue = stristr($query, " week("); - $extractvalue = substr($extractvalue, 6); - $positionMySql = stripos($extractvalue, ")"); - // Conserver la fin de la requ�te - $endofquery = substr($extractvalue, $positionMySql); - $extractvalue = substr($extractvalue, 0, $positionMySql); - - // Remplacer l'instruction MySql en Sql Server - // Ins�rer la date en param�tre et le reste de la requ�te - $query = $newquery." DATEPART(week, ".$extractvalue.$endofquery; - } - - //print "<!--".$query."-->"; - - if (! $this->database_name) - { - // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE) - $ret = mssql_query($query, $this->db); - } - else - { - $ret = mssql_query($query, $this->db); - } - - if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) - { - // Si requete utilisateur, on la sauvegarde ainsi que son resultset - if (! $ret) - { - $this->lastqueryerror = $query; - - $result = mssql_query("SELECT @@ERROR as code", $this->db); - $row = mssql_fetch_array($result); - - $this->lasterror = $this->error(); - $this->lasterrno = $row["code"]; - } - $this->lastquery=$query; - $this->results = $ret; - } - - return $ret; - } - - /** - \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 mssql_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 mssql_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 @mssql_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 - */ - 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 mssql_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; } - // mssql necessite un link de base pour cette fonction contrairement - // a pqsql qui prend un resultset - $rsRows = mssql_query("select @@rowcount as rows", $this->db); - return mssql_result($rsRows, 0, "rows"); - //return mssql_affected_rows($this->db); - } - - - /** - \brief Lib�re le dernier resultset utilis� 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 - if (! is_resource($resultset)) { $resultset=$this->results; } - // Si resultset en est un, on libere la m�moire - if (is_resource($resultset)) mssql_free_result($resultset); - } - - - /** - \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 - */ - function plimit($limit=0,$offset=0) - { - global $conf; - if (! $limit) $limit=$conf->liste_limit; - if ($offset > 0) return " LIMIT $offset,$limit "; - else return " LIMIT $limit "; - } - - - /** - \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 + function query($query) + { + $query = trim($query); + + // Conversion syntaxe MySql vers MSDE. + $query = str_ireplace("now()", "getdate()", $query); + // Erreur SQL: cannot update timestamp field + $query = str_ireplace(", tms = tms", "", $query); + // Voir si l'on peut directement utiliser $query = str_ireplace("file", "[file]", $query); + // au lieu des 3 lignes ci-dessous + $query = str_ireplace(".file", ".[file]", $query); + $query = str_ireplace(" file ", " [file] ", $query); + $query = str_ireplace(" file,", " [file],", $query); + // Idem file + $query = str_ireplace(".percent", ".[percent]", $query); + $query = str_ireplace(" percent ", " [percent] ", $query); + $query = str_ireplace("percent,", "[percent],", $query); + $query = str_ireplace("percent=", "[percent]=", $query); + $query = str_ireplace("\'", "''", $query); + + + $itemfound = stripos($query, " limit "); + if ($itemfound !== false) { + // Extraire le nombre limite + $number = stristr($query, " limit "); + $number = substr($number, 7); + // Ins�rer l'instruction TOP et le nombre limite + $query = str_ireplace("select ", "select top ".$number." ", $query); + // Supprimer l'instruction MySql + $query = str_ireplace(" limit ".$number, "", $query); + } + + $itemfound = stripos($query, " week("); + if ($itemfound !== false) { + // Recr�er une requ�te sans instruction Mysql + $positionMySql = stripos($query, " week("); + $newquery = substr($query, 0, $positionMySql); + + // R�cup�rer la date pass�e en param�tre + $extractvalue = stristr($query, " week("); + $extractvalue = substr($extractvalue, 6); + $positionMySql = stripos($extractvalue, ")"); + // Conserver la fin de la requ�te + $endofquery = substr($extractvalue, $positionMySql); + $extractvalue = substr($extractvalue, 0, $positionMySql); + + // Remplacer l'instruction MySql en Sql Server + // Ins�rer la date en param�tre et le reste de la requ�te + $query = $newquery." DATEPART(week, ".$extractvalue.$endofquery; + } + + //print "<!--".$query."-->"; + + if (! $this->database_name) + { + // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE) + $ret = mssql_query($query, $this->db); + } + else + { + $ret = mssql_query($query, $this->db); + } + + if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) + { + // Si requete utilisateur, on la sauvegarde ainsi que son resultset + if (! $ret) + { + $this->lastqueryerror = $query; + + $result = mssql_query("SELECT @@ERROR as code", $this->db); + $row = mssql_fetch_array($result); + + $this->lasterror = $this->error(); + $this->lasterrno = $row["code"]; + } + $this->lastquery=$query; + $this->results = $ret; + } + + return $ret; + } + + /** + \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 mssql_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 mssql_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 @mssql_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 + */ + 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 mssql_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; } + // mssql necessite un link de base pour cette fonction contrairement + // a pqsql qui prend un resultset + $rsRows = mssql_query("select @@rowcount as rows", $this->db); + return mssql_result($rsRows, 0, "rows"); + //return mssql_affected_rows($this->db); + } + + + /** + \brief Lib�re le dernier resultset utilis� 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 + if (! is_resource($resultset)) { $resultset=$this->results; } + // Si resultset en est un, on libere la m�moire + if (is_resource($resultset)) mssql_free_result($resultset); + } + + + /** + \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 ligne + \return string chaine exprimant la syntax sql de la limite + */ + function plimit($limit=0,$offset=0) + { + global $conf; + if (! $limit) $limit=$conf->liste_limit; + if ($offset > 0) return " LIMIT $offset,$limit "; + else return " LIMIT $limit "; + } + + + /** + \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 - */ - function order($sortfield=0,$sortorder=0) - { + */ + function order($sortfield=0,$sortorder=0) + { if ($sortfield) { $return=''; @@ -516,7 +495,7 @@ class DoliDb { if (! $return) $return.=' ORDER BY '; else $return.=','; - + $return.=$val; if ($sortorder) $return.=' '.$sortorder; } @@ -526,146 +505,176 @@ class DoliDb { return ''; } - } + } /** - \brief Escape a string to insert data. - \param stringtoencode String to escape - \return string String escaped - */ - function escape($stringtoencode) + \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 Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS' - * \return date Date au format TMS. - * \TODO Remove unix_timestamp functions - */ - function pdate($param) - { - return "dbo.unix_timestamp(".$param.")"; - } - - /** - \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. - Fonction � utiliser pour g�n�rer les INSERT. - \param param Date TMS � convertir - \return date Date au format texte YYYYMMDDHHMMSS. - */ - function idate($param) - { - //return "dbo.from_unixtime(".$param.")"; - return adodb_strftime("%d/%m/%Y %H:%M:%S",$param); - } - - - /** - \brief Formatage d'un if SQL - \param test chaine test - \param resok resultat si test egal - \param resko resultat si test non egal - \return string chaine format� SQL - */ - function ifsql($test,$resok,$resko) - { - return 'IF('.$test.','.$resok.','.$resko.')'; - } - - - /** - \brief Renvoie la derniere requete soumise par la methode query() - \return lastquery - */ - function lastquery() - { - return $this->lastquery; - } - - /** - \brief Renvoie la derniere requete en erreur - \return string lastqueryerror - */ + /** + * \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 Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS' + * \return date Date au format TMS. + * \TODO Remove unix_timestamp functions + */ + function pdate($param) + { + return "dbo.unix_timestamp(".$param.")"; + } + + /** + \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. + Fonction � utiliser pour g�n�rer les INSERT. + \param param Date TMS � convertir + \return date Date au format texte YYYYMMDDHHMMSS. + */ + function idate($param) + { + //return "dbo.from_unixtime(".$param.")"; + return adodb_strftime("%d/%m/%Y %H:%M:%S",$param); + } + + + /** + \brief Formatage d'un if SQL + \param test chaine test + \param resok resultat si test egal + \param resko resultat si test non egal + \return string chaine format� SQL + */ + function ifsql($test,$resok,$resko) + { + return 'IF('.$test.','.$resok.','.$resko.')'; + } + + + /** + \brief Renvoie la derniere requete soumise par la methode query() + \return lastquery + */ + function lastquery() + { + return $this->lastquery; + } + + /** + \brief Renvoie la derniere requete en erreur + \return string lastqueryerror + */ function lastqueryerror() { return $this->lastqueryerror; } - /** - \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...) - */ - function errno() - { - if (! $this->connected) { - // Si il y a eu echec de connexion, $this->db n'est pas valide. - return 'DB_ERROR_FAILED_TO_CONNECT'; - } - else { - if (isset($this->errorcode_map[$this->lasterrno])) { - return $this->errorcode_map[$this->lasterrno]; - } - $errno=$this->lasterrno; - return ($errno?'DB_ERROR_'.$errno:'0'); - } - } - - /** - \brief Renvoie le texte de l'erreur mssql de l'operation precedente. - \return error_text - */ - function error() - { - if (! $this->connected) { - // Si il y a eu echec de connexion, $this->db n'est pas valide pour mssql_get_last_message. - return 'Not connected. Check setup parameters in conf/conf.php file and your mssql client and server versions'; - } - else { - return mssql_get_last_message($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 mssql mais requis pour compatibilit� avec Postgresql - \return int id - */ - function last_insert_id($tab) - { - $res = $this->query("SELECT @@IDENTITY as id"); - if ($data = $this->fetch_array($res)) - { - return $data["id"]; - } - else - { - return -1; - } - } + /** + \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 (! $this->connected) { + // Si il y a eu echec de connexion, $this->db n'est pas valide. + return 'DB_ERROR_FAILED_TO_CONNECT'; + } + else { + // Constants to convert a MSSql error code to a generic Dolibarr error code + $errorcode_map = array( + 1004 => 'DB_ERROR_CANNOT_CREATE', + 1005 => 'DB_ERROR_CANNOT_CREATE', + 1006 => 'DB_ERROR_CANNOT_CREATE', + 1007 => 'DB_ERROR_ALREADY_EXISTS', + 1008 => 'DB_ERROR_CANNOT_DROP', + 1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP', + 1046 => 'DB_ERROR_NODBSELECTED', + 1048 => 'DB_ERROR_CONSTRAINT', + 2714 => 'DB_ERROR_TABLE_ALREADY_EXISTS', + 1051 => 'DB_ERROR_NOSUCHTABLE', + 1054 => 'DB_ERROR_NOSUCHFIELD', + 1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS', + 1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS', + 2627 => 'DB_ERROR_RECORD_ALREADY_EXISTS', + 102 => 'DB_ERROR_SYNTAX', + 8120 => 'DB_ERROR_GROUP_BY_SYNTAX', + 1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', + 1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY', + 1091 => 'DB_ERROR_NOSUCHFIELD', + 1100 => 'DB_ERROR_NOT_LOCKED', + 1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW', + 1146 => 'DB_ERROR_NOSUCHTABLE', + 1216 => 'DB_ERROR_NO_PARENT', + 1217 => 'DB_ERROR_CHILD_EXISTS', + 1451 => 'DB_ERROR_CHILD_EXISTS' + ); + + if (isset($this->errorcode_map[$this->lasterrno])) + { + return $this->errorcode_map[$this->lasterrno]; + } + $errno=$this->lasterrno; + return ($errno?'DB_ERROR_'.$errno:'0'); + } + } + + /** + \brief Renvoie le texte de l'erreur mssql de l'operation precedente. + \return error_text + */ + function error() + { + if (! $this->connected) { + // Si il y a eu echec de connexion, $this->db n'est pas valide pour mssql_get_last_message. + return 'Not connected. Check setup parameters in conf/conf.php file and your mssql client and server versions'; + } + else { + return mssql_get_last_message($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 mssql mais requis pour compatibilit� avec Postgresql + \return int id + */ + function last_insert_id($tab) + { + $res = $this->query("SELECT @@IDENTITY as id"); + if ($data = $this->fetch_array($res)) + { + return $data["id"]; + } + else + { + return -1; + } + } // Next function are not required. Only minor features use them. @@ -676,7 +685,7 @@ class DoliDb /** \brief Renvoie l'id de la connexion \return string Id connexion - */ + */ function DDLGetConnectId() { $resql=$this->query('SELECT CONNECTION_ID()'); @@ -685,33 +694,33 @@ class DoliDb } /** - \brief Cr�ation d'une nouvelle base de donn�e - \param database nom de la database � cr�er - \return resource resource d�finie si ok, null si ko + \brief Cr�ation d'une nouvelle base de donn�e + \param database nom de la database � cr�er + \return resource resource d�finie si ok, null si k \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mssql, ...) car elles sont deprecated - On force creation de la base avec le charset forcecharset - */ + On force creation de la base avec le charset forcecharset + */ function DDLCreateDb($database) { - // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci - $sql = 'CREATE DATABASE '.$database; - $sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate; - $ret=$this->query($sql); - if (! $ret) - { - // On r�essaie pour compatibilit� avec mssql < 5.0 + // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci $sql = 'CREATE DATABASE '.$database; + $sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate; $ret=$this->query($sql); - } - + if (! $ret) + { + // On r�essaie pour compatibilit� avec mssql < 5.0 + $sql = 'CREATE DATABASE '.$database; + $ret=$this->query($sql); + } + return $ret; } - + /** \brief Liste des tables dans une database. \param database Nom de la database \return resource - */ + */ function DDLListTables($database) { $this->results = mssql_list_tables($database, $this->db); @@ -719,19 +728,19 @@ class DoliDb } /** - \brief Cr�e une table + \brief Cr�e une table \param table Nom de la table \param fields Tableau associatif [nom champ][tableau des descriptions] \param primary_key Nom du champ qui sera la clef primaire \param unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur - \param fulltext Tableau des Nom de champs qui seront index�s en fulltext - \param key Tableau des champs cl�s noms => valeur + \param fulltext Tableau des Nom de champs qui seront index�s en fulltext + \param key Tableau des champs cl�s noms => valeur \param type Type de la table \return int <0 si KO, >=0 si OK - */ + */ function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="") { - // cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra + // cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment'); $sql = "create table ".$table."("; $i=0; @@ -752,14 +761,14 @@ class DoliDb } else if( eregi("^[^ ]",$field_desc['null'])) $sqlfields[$i] .= " ".$field_desc['null']; - + else if( eregi("^[^ ]",$field_desc['extra'])) $sqlfields[$i] .= " ".$field_desc['extra']; $i++; } if($primary_key != "") $pk = "primary key(".$primary_key.")"; - + if($unique_keys != "") { $i = 0; @@ -786,130 +795,130 @@ class DoliDb if($keys != "") $sql .= ",".implode(',',$sqlk); $sql .=") type=".$type; - + dolibarr_syslog($sql); if(! $this -> query($sql)) - return -1; + return -1; else - return 1; + return 1; } /** - \brief d�crit une table dans une database. + \brief d�crit une table dans une database. \param table Nom de la table \param field Optionnel : Nom du champ si l'on veut la desc d'un champ - \return resource - */ + \return resource + */ function DDLDescTable($table,$field="") - { + { $sql="DESC ".$table." ".$field; dolibarr_syslog($sql); $this->results = $this->query($sql); return $this->results; - } + } /** - \brief Ins�re un nouveau champ dans une table + \brief Ins�re un nouveau champ dans une table \param table Nom de la table - \param field_name Nom du champ � ins�rer - \param field_desc Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre] + \param field_name Nom du champ � ins�rer + \param field_desc Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre] \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 + // cl�s recherch�es 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']; if( eregi("^[^ ]",$field_desc['value'])) - $sql .= "(".$field_desc['value'].")"; + $sql .= "(".$field_desc['value'].")"; if( eregi("^[^ ]",$field_desc['attribute'])) - $sql .= " ".$field_desc['attribute']; + $sql .= " ".$field_desc['attribute']; if( eregi("^[^ ]",$field_desc['null'])) - $sql .= " ".$field_desc['null']; + $sql .= " ".$field_desc['null']; if( eregi("^[^ ]",$field_desc['default'])) - if(eregi("null",$field_desc['default'])) - $sql .= " default ".$field_desc['default']; - else - $sql .= " default '".$field_desc['default']."'"; + if(eregi("null",$field_desc['default'])) + $sql .= " default ".$field_desc['default']; + else + $sql .= " default '".$field_desc['default']."'"; if( eregi("^[^ ]",$field_desc['extra'])) - $sql .= " ".$field_desc['extra']; + $sql .= " ".$field_desc['extra']; $sql .= " ".$field_position; if(! $this -> query($sql)) - return -1; + return -1; else - return 1; + return 1; } - + function getDefaultCharacterSetDatabase(){ - /* + /* $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\''); - if (!$resql) - { - return $this->forcecharset; - } - $liste=$this->fetch_array($resql); - return $liste['Value']; - */ - return ''; - } - + if (!$resql) + { + return $this->forcecharset; + } + $liste=$this->fetch_array($resql); + return $liste['Value']; + */ + return ''; + } + function getListOfCharacterSet(){ /* - $resql=$this->query('SHOW CHARSET'); - $liste = array(); - if ($resql) - { + $resql=$this->query('SHOW CHARSET'); + $liste = array(); + if ($resql) + { $i = 0; while ($obj = $this->fetch_object($resql) ) { - $liste[$i]['charset'] = $obj->Charset; - $liste[$i]['description'] = $obj->Description; - $i++; - } - $this->free($resql); + $liste[$i]['charset'] = $obj->Charset; + $liste[$i]['description'] = $obj->Description; + $i++; + } + $this->free($resql); } else { - return null; - } - return $liste; - */ - return ''; // attente d�buggage + return null; + } + return $liste; + */ + return ''; // attente d�buggage } - + function getDefaultCollationDatabase(){ $resql=$this->query("SELECT SERVERPROPERTY('collation')"); - if (!$resql) - { + if (!$resql) + { return $this->forcecollate; - } - $liste=$this->fetch_array($resql); - return $liste['computed']; + } + $liste=$this->fetch_array($resql); + return $liste['computed']; } - + function getListOfCollation(){ /* - $resql=$this->query('SHOW COLLATION'); - $liste = array(); - if ($resql) + $resql=$this->query('SHOW COLLATION'); + $liste = array(); + if ($resql) { $i = 0; while ($obj = $this->fetch_object($resql) ) { - $liste[$i]['collation'] = $obj->Collation; - $i++; - } - $this->free($resql); - } else { - return null; - } - return $liste; - */ - return ''; // attente d�bugage - } - + $liste[$i]['collation'] = $obj->Collation; + $i++; + } + $this->free($resql); + } else { + return null; + } + return $liste; + */ + return ''; // attente d�bugage + } + } ?> diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php index 29f3e7a95372e542f585f5f705c29157cef16370..1eae22088ec59858f885a20a476425e08096f214 100644 --- a/htdocs/lib/databases/mysql.lib.php +++ b/htdocs/lib/databases/mysql.lib.php @@ -21,112 +21,70 @@ */ /** - \file htdocs/lib/databases/mysql.lib.php - \brief Fichier de la classe permettant de g�rer une base mysql - \version $Id$ -*/ -// Pour compatibilit� lors de l'upgrade + \file htdocs/lib/databases/mysql.lib.php + \brief Fichier de la classe permettant de g�rer une base mysql + \version $Id$ + */ +// For compatibility during upgrade if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php"); /** - \class DoliDb - \brief Classe de gestion de la database de dolibarr -*/ + \class DoliDb + \brief Classe de gestion de la database de dolibarr + */ class DoliDb { - //! Handler de base - var $db; - //! Nom du gestionnaire - var $type='mysql'; - //! Charset - var $forcecharset='latin1'; - //! Collate - var $forcecollate='latin1_swedish_ci'; - //! Version min database - var $versionmin=array(3,1,0); - //! Resultset de la derni�re requete - var $results; - //! 1 si connect�, 0 sinon - var $connected; - //! 1 si base s�lectionn�, 0 sinon - var $database_selected; - //! Nom base s�lectionn�e - var $database_name; - //! Nom user base - var $database_user; - //! 1 si une transaction est en cours, 0 sinon - var $transaction_opened; - //! Derniere requete ex�cut�e - var $lastquery; - //! Derniere requete ex�cut�e avec echec - var $lastqueryerror; - //! Message erreur mysql - var $lasterror; - //! Message erreur mysql - var $lasterrno; - - var $ok; - var $error; - - - // Constantes pour conversion code erreur MySql en code erreur g�n�rique - var $errorcode_map = array( - 1004 => 'DB_ERROR_CANNOT_CREATE', - 1005 => 'DB_ERROR_CANNOT_CREATE', - 1006 => 'DB_ERROR_CANNOT_CREATE', - 1007 => 'DB_ERROR_ALREADY_EXISTS', - 1008 => 'DB_ERROR_CANNOT_DROP', - 1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP', - 1044 => 'DB_ERROR_ACCESSDENIED', - 1046 => 'DB_ERROR_NODBSELECTED', - 1048 => 'DB_ERROR_CONSTRAINT', - 1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS', - 1051 => 'DB_ERROR_NOSUCHTABLE', - 1054 => 'DB_ERROR_NOSUCHFIELD', - 1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS', - 1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS', - 1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS', - 1064 => 'DB_ERROR_SYNTAX', - 1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', - 1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY', - 1091 => 'DB_ERROR_NOSUCHFIELD', - 1100 => 'DB_ERROR_NOT_LOCKED', - 1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW', - 1146 => 'DB_ERROR_NOSUCHTABLE', - 1216 => 'DB_ERROR_NO_PARENT', - 1217 => 'DB_ERROR_CHILD_EXISTS', - 1451 => 'DB_ERROR_CHILD_EXISTS' - ); - - - /** - \brief Ouverture d'une connexion 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 - \param port Port of database server - \return int 1 en cas de succ�s, 0 sinon - */ + //! Handler de base + var $db; + //! Nom du gestionnaire + var $type='mysql'; + //! Charset + var $forcecharset='latin1'; + //! Collate + var $forcecollate='latin1_swedish_ci'; + //! Version min database + var $versionmin=array(3,1,0); + //! Resultset of last request + var $results; + //! 1 si connect�, 0 sinon + var $connected; + //! 1 si base s�lectionn�, 0 sinon + var $database_selected; + //! Nom base s�lectionn�e + var $database_name; + //! Nom user base + var $database_user; + //! 1 si une transaction est en cours, 0 sinon + var $transaction_opened; + //! Derniere requete ex�cut�e + var $lastquery; + //! Derniere requete ex�cut�e avec echec + var $lastqueryerror; + //! Message erreur mysql + var $lasterror; + //! Message erreur mysql + var $lasterrno; + + var $ok; + var $error; + + + /** + \brief Ouverture d'une connexion 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 + \param port Port of database server + \return int 1 en cas de succ�s, 0 sinon + */ function DoliDb($type='mysql', $host, $user, $pass, $name='', $port=0) { global $conf,$langs; - /* Ce test est inutile. En effet, si DOL_DOCUMENT_ROOT est d�fini, cela signifie */ - /* obligatoirement que le fichier conf a deja �t� charg�e puisque cette constante est */ - /* definie a partir du contenu du fichier conf.php */ - /* Et toutes les infos sont charg�s dans l'objet conf */ - /* - if (file_exists($conffile)) { - include($conffile); - $this->forcecharset=$character_set_database; - $this->forcecollate=$dolibarr_main_db_collation; - $this->db_user=$dolibarr_main_db_user; - } - */ if (isset($conf->db->character_set) && $conf->db->character_set) { $this->forcecharset=$conf->db->character_set; } @@ -136,7 +94,7 @@ class DoliDb $this->database_user=$user; $this->transaction_opened=0; - + if (! function_exists("mysql_connect")) { $this->connected = 0; @@ -145,7 +103,7 @@ class DoliDb dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions for using Mysql driver are not available in this version of PHP",LOG_ERR); return $this->ok; } - + if (! $host) { $this->connected = 0; @@ -171,7 +129,7 @@ class DoliDb dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysql_error=".$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 demand�e, on essaie connexion base if ($this->connected && $name) { if ($this->select_db($name)) @@ -180,12 +138,12 @@ class DoliDb $this->database_name = $name; $this->ok = 1; - // Si client connect� avec charset different de celui de la base Dolibarr - // (La base Dolibarr a �t� forc�e en this->forcecharset � l'install) + // Si client connect� avec charset different de celui de la base Dolibarr + // (La base Dolibarr a �t� forc�e en this->forcecharset � l'install) /*if (mysql_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase()) { - $this->query("SET NAMES '".$this->forcecharset."'", $this->db); - $this->query("SET CHARACTER SET ". $this->forcecharset); + $this->query("SET NAMES '".$this->forcecharset."'", $this->db); + $this->query("SET CHARACTER SET ". $this->forcecharset); }*/ } else @@ -199,19 +157,29 @@ class DoliDb } else { - // Pas de selection de base demand�e, ok ou ko + // Pas de selection de base demandee, ok ou ko $this->database_selected = 0; } - + return $this->ok; } - + + + /** + * \brief Convert a SQL request in mysql syntax to database syntax + * \param request SQL request to convert + * \return string SQL request converted + */ + function convertSQLFromMysql($request) + { + return $request; + } /** \brief Selectionne une database. \param database Nom de la database \return boolean true si ok, false si ko - */ + */ function select_db($database) { return mysql_select_db($database, $this->db); @@ -219,27 +187,27 @@ class DoliDb /** \brief Connection vers le serveur - \param host addresse de la base de donn�es - \param login nom de l'utilisateur autoris� + \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 + \return resource Handler d'acc�s � la bas \seealso close - */ + */ function connect($host, $login, $passwd, $name, $port=0) { dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name",LOG_DEBUG); $newhost=$host; - + // With mysql, port must be in hostname if ($port) $newhost.=':'.$port; $this->db = @mysql_connect($newhost, $login, $passwd); - //force les enregistrement en latin1 si la base est en utf8 par d�faut - // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec - // les nouvelles version de Dolibarr car forc� par l'install Dolibarr. + //force les enregistrement en latin1 si la base est en utf8 par d�faut + // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec + // les nouvelles version de Dolibarr car forc� par l'install Dolibarr. if ($this->db) { $this->query("SET NAMES '".$this->forcecharset."'", $this->db); @@ -248,65 +216,65 @@ class DoliDb //print "Resultat fonction connect: ".$this->db; return $this->db; } - + /** \brief Renvoie la version du serveur \return string Chaine version - */ + */ function getVersion() { return mysql_get_server_info($this->db); } - /** - \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 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 */ - function getVersionArray() - { - return split('\.',$this->getVersion()); - } - - - /** - \brief Fermeture d'une connexion vers une database. - \return resource - \seealso connect + function getVersionArray() + { + return split('\.',$this->getVersion()); + } + + + /** + \brief Fermeture d'une connexion vers une database. + \return resource + \seealso connect */ - 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 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) + if ($ret) { $this->transaction_opened++; dolibarr_syslog("BEGIN Transaction",LOG_DEBUG); @@ -323,13 +291,13 @@ class DoliDb /** \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) + if ($ret) { $this->transaction_opened=0; dolibarr_syslog("COMMIT Transaction",LOG_DEBUG); @@ -342,13 +310,13 @@ class DoliDb 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<=1) { $ret=$this->query("ROLLBACK"); @@ -362,26 +330,26 @@ class DoliDb return 1; } } - + /** - \brief Effectue une requete et renvoi le resultset de r�ponse de la base + \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); - + if (! $this->database_name) { - // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE) + // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE) $ret = mysql_query($query, $this->db); } else { $ret = mysql_db_query($this->database_name, $query, $this->db); } - + if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) { // Si requete utilisateur, on la sauvegarde ainsi que son resultset @@ -394,113 +362,113 @@ class DoliDb $this->lastquery=$query; $this->results = $ret; } - + return $ret; } - /** - \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 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 Lib�re le dernier resultset utilis� 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 - if (! is_resource($resultset)) { $resultset=$this->results; } - // Si resultset en est un, on libere la m�moire - if (is_resource($resultset)) mysql_free_result($resultset); - } - - - /** - \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 - */ - function plimit($limit=0,$offset=0) - { - global $conf; - if (! $limit) $limit=$conf->liste_limit; - if ($offset > 0) return " LIMIT $offset,$limit "; - else return " LIMIT $limit "; - } - - - /** - \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 + /** + \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 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 Lib�re le dernier resultset utilis� 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 + if (! is_resource($resultset)) { $resultset=$this->results; } + // Si resultset en est un, on libere la m�moire + if (is_resource($resultset)) mysql_free_result($resultset); + } + + + /** + \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 ligne + \return string chaine exprimant la syntax sql de la limite + */ + function plimit($limit=0,$offset=0) + { + global $conf; + if (! $limit) $limit=$conf->liste_limit; + if ($offset > 0) return " LIMIT $offset,$limit "; + else return " LIMIT $limit "; + } + + + /** + \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 - */ - function order($sortfield=0,$sortorder=0) - { + */ + function order($sortfield=0,$sortorder=0) + { if ($sortfield) { $return=''; @@ -509,7 +477,7 @@ class DoliDb { if (! $return) $return.=' ORDER BY '; else $return.=','; - + $return.=$val; if ($sortorder) $return.=' '.$sortorder; } @@ -519,138 +487,168 @@ class DoliDb { return ''; } - } - - + } + + /** - \brief Escape a string to insert data. - \param stringtoencode String to escape - \return string String escaped - */ - function escape($stringtoencode) + \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 Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS' - * \return date Date au format TMS. - * \TODO Remove unix_timestamp functions - */ - function pdate($param) - { - return "unix_timestamp(".$param.")"; - } - - /** - * \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. - * Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE. - * \param param Date TMS � convertir - * \return date Date au format texte YYYYMMDDHHMMSS. - */ - function idate($param) - { - return adodb_strftime("%Y%m%d%H%M%S",$param); - } - - - /** - \brief Formatage d'un if SQL - \param test chaine test - \param resok resultat si test egal - \param resko resultat si test non egal - \return string chaine format� SQL - */ - function ifsql($test,$resok,$resko) - { - return 'IF('.$test.','.$resok.','.$resko.')'; - } - - - /** - \brief Renvoie la derniere requete soumise par la methode query() - \return lastquery - */ - function lastquery() - { - return $this->lastquery; - } - - /** - \brief Renvoie la derniere requete en erreur - \return string lastqueryerror - */ + + /** + * \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 Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS' + * \return date Date au format TMS. + * \TODO Remove unix_timestamp functions + */ + function pdate($param) + { + return "unix_timestamp(".$param.")"; + } + + /** + * \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. + * Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE + * \param param Date TMS � convertir + * \return date Date au format texte YYYYMMDDHHMMSS. + */ + function idate($param) + { + return adodb_strftime("%Y%m%d%H%M%S",$param); + } + + + /** + \brief Formatage d'un if SQL + \param test chaine test + \param resok resultat si test egal + \param resko resultat si test non egal + \return string chaine format� SQL + */ + function ifsql($test,$resok,$resko) + { + return 'IF('.$test.','.$resok.','.$resko.')'; + } + + + /** + \brief Renvoie la derniere requete soumise par la methode query() + \return lastquery + */ + function lastquery() + { + return $this->lastquery; + } + + /** + \brief Renvoie la derniere requete en erreur + \return string lastqueryerror + */ function lastqueryerror() { return $this->lastqueryerror; } - /** - \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...) - */ - function errno() - { - if (! $this->connected) { - // Si il y a eu echec de connexion, $this->db n'est pas valide. - return 'DB_ERROR_FAILED_TO_CONNECT'; - } - else { - if (isset($this->errorcode_map[mysql_errno($this->db)])) { - return $this->errorcode_map[mysql_errno($this->db)]; - } - $errno=mysql_errno($this->db); - return ($errno?'DB_ERROR_'.$errno:'0'); - } - } - - /** - \brief Renvoie le texte de l'erreur mysql de l'operation precedente. - \return error_text - */ - function error() - { - if (! $this->connected) { - // Si il y a eu echec de connexion, $this->db n'est pas valide pour mysql_error. - return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions'; - } - else { - return mysql_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 - */ - function last_insert_id($tab) - { - return mysql_insert_id($this->db); - } - + /** + \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 (! $this->connected) { + // Si il y a eu echec de connexion, $this->db n'est pas valide. + return 'DB_ERROR_FAILED_TO_CONNECT'; + } + else { + // Constants to convert a MySql error code to a generic Dolibarr error code + $errorcode_map = array( + 1004 => 'DB_ERROR_CANNOT_CREATE', + 1005 => 'DB_ERROR_CANNOT_CREATE', + 1006 => 'DB_ERROR_CANNOT_CREATE', + 1007 => 'DB_ERROR_ALREADY_EXISTS', + 1008 => 'DB_ERROR_CANNOT_DROP', + 1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP', + 1044 => 'DB_ERROR_ACCESSDENIED', + 1046 => 'DB_ERROR_NODBSELECTED', + 1048 => 'DB_ERROR_CONSTRAINT', + 1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS', + 1051 => 'DB_ERROR_NOSUCHTABLE', + 1054 => 'DB_ERROR_NOSUCHFIELD', + 1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS', + 1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS', + 1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS', + 1064 => 'DB_ERROR_SYNTAX', + 1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', + 1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY', + 1091 => 'DB_ERROR_NOSUCHFIELD', + 1100 => 'DB_ERROR_NOT_LOCKED', + 1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW', + 1146 => 'DB_ERROR_NOSUCHTABLE', + 1216 => 'DB_ERROR_NO_PARENT', + 1217 => 'DB_ERROR_CHILD_EXISTS', + 1451 => 'DB_ERROR_CHILD_EXISTS' + ); + + if (isset($this->errorcode_map[mysql_errno($this->db)])) + { + return $this->errorcode_map[mysql_errno($this->db)]; + } + $errno=mysql_errno($this->db); + return ($errno?'DB_ERROR_'.$errno:'0'); + } + } + + /** + \brief Renvoie le texte de l'erreur mysql de l'operation precedente. + \return error_text + */ + function error() + { + if (! $this->connected) { + // Si il y a eu echec de connexion, $this->db n'est pas valide pour mysql_error. + return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions'; + } + else { + return mysql_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 + */ + function last_insert_id($tab) + { + return mysql_insert_id($this->db); + } + // Next function are not required. Only minor features use them. @@ -661,7 +659,7 @@ class DoliDb /** \brief Renvoie l'id de la connexion \return string Id connexion - */ + */ function DDLGetConnectId() { $resql=$this->query('SELECT CONNECTION_ID()'); @@ -671,12 +669,12 @@ class DoliDb /** - \brief Cr�ation d'une nouvelle base de donn�e - \param database nom de la database � cr�er - \return resource resource d�finie si ok, null si ko + \brief Cr�ation d'une nouvelle base de donn�e + \param database nom de la database � cr�er + \return resource resource d�finie si ok, null si k \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated On force creation de la base avec le charset forcecharset - */ + */ function DDLCreateDb($database) { // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci @@ -685,23 +683,23 @@ class DoliDb $ret=$this->query($sql); if (! $ret) { - // On r�essaie pour compatibilit� avec Mysql < 4.1.1 + // On r�essaie pour compatibilit� avec Mysql < 4.1.1 $sql = 'CREATE DATABASE '.$database; $ret=$this->query($sql); } return $ret; } - + /** \brief Liste des tables dans une database. \param database Nom de la database - \param table Filtre sur tables � rechercher + \param table Filtre sur tables � rechercher \return array Tableau des tables de la base - */ - function DDLListTables($database, $table='') - { + */ + function DDLListTables($database, $table='') + { $listtables=array(); - + $like = ''; if ($table) $like = "LIKE '".$table."'"; $sql="SHOW TABLES FROM ".$database." ".$like.";"; @@ -712,22 +710,22 @@ class DoliDb $listtables[] = $row[0]; } return $listtables; - } - - /** - \brief Cr�e une table - \param table Nom de la table - \param fields Tableau associatif [nom champ][tableau des descriptions] - \param primary_key Nom du champ qui sera la clef primaire - \param unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur - \param fulltext Tableau des Nom de champs qui seront index�s en fulltext - \param key Tableau des champs cl�s noms => valeur - \param type Type de la table - \return int <0 si KO, >=0 si OK - */ + } + + /** + \brief Cr�e une table + \param table Nom de la table + \param fields Tableau associatif [nom champ][tableau des descriptions] + \param primary_key Nom du champ qui sera la clef primaire + \param unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur + \param fulltext Tableau des Nom de champs qui seront index�s en fulltext + \param key Tableau des champs cl�s noms => valeur + \param type Type de la table + \return int <0 si KO, >=0 si OK + */ function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="") { - // cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra + // cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment'); $sql = "create table ".$table."("; $i=0; @@ -748,14 +746,14 @@ class DoliDb } else if( eregi("^[^ ]",$field_desc['null'])) $sqlfields[$i] .= " ".$field_desc['null']; - + else if( eregi("^[^ ]",$field_desc['extra'])) $sqlfields[$i] .= " ".$field_desc['extra']; $i++; } if($primary_key != "") $pk = "primary key(".$primary_key.")"; - + if($unique_keys != "") { $i = 0; @@ -782,92 +780,92 @@ class DoliDb if($keys != "") $sql .= ",".implode(',',$sqlk); $sql .=") type=".$type; - + dolibarr_syslog($sql,LOG_DEBUG); if(! $this -> query($sql)) - return -1; + return -1; else - return 1; + return 1; } /** - \brief d�crit une table dans une database. + \brief d�crit une table dans une database. \param table Nom de la table \param field Optionnel : Nom du champ si l'on veut la desc d'un champ - \return resource - */ + \return resource + */ function DDLDescTable($table,$field="") - { + { $sql="DESC ".$table." ".$field; dolibarr_syslog($sql,LOG_DEBUG); $this->results = $this->query($sql); return $this->results; - } + } /** - \brief Ins�re un nouveau champ dans une table + \brief Ins�re un nouveau champ dans une table \param table Nom de la table - \param field_name Nom du champ � ins�rer - \param field_desc Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre] + \param field_name Nom du champ � ins�rer + \param field_desc Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre] \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 + // cl�s recherch�es 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']; if( eregi("^[^ ]",$field_desc['value'])) - $sql .= "(".$field_desc['value'].")"; + $sql .= "(".$field_desc['value'].")"; if( eregi("^[^ ]",$field_desc['attribute'])) - $sql .= " ".$field_desc['attribute']; + $sql .= " ".$field_desc['attribute']; if( eregi("^[^ ]",$field_desc['null'])) - $sql .= " ".$field_desc['null']; + $sql .= " ".$field_desc['null']; if( eregi("^[^ ]",$field_desc['default'])) - if(eregi("null",$field_desc['default'])) - $sql .= " default ".$field_desc['default']; - else - $sql .= " default '".$field_desc['default']."'"; + if(eregi("null",$field_desc['default'])) + $sql .= " default ".$field_desc['default']; + else + $sql .= " default '".$field_desc['default']."'"; if( eregi("^[^ ]",$field_desc['extra'])) - $sql .= " ".$field_desc['extra']; + $sql .= " ".$field_desc['extra']; $sql .= " ".$field_position; dolibarr_syslog($sql,LOG_DEBUG); if(! $this -> query($sql)) - return -1; + return -1; else - return 1; + return 1; } - + /** - \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 � 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 + */ function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name) { $sql = "INSERT INTO user "; $sql.= "(Host,User,password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)"; $sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_user',password('$dolibarr_main_db_pass')"; $sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');"; - + dolibarr_syslog("mysql.lib::DDLCreateUser sql=".$sql); $resql=$this->query($sql); if (! $resql) { return -1; } - + $sql = "INSERT INTO db "; $sql.= "(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)"; $sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_name','$dolibarr_main_db_user'"; $sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');"; - + dolibarr_syslog("mysql.lib::DDLCreateUser sql=".$sql,LOG_DEBUG); $resql=$this->query($sql); if (! $resql) @@ -879,80 +877,80 @@ class DoliDb dolibarr_syslog("mysql.lib::DDLCreateUser sql=".$sql,LOG_DEBUG); $resql=$this->query($sql); - + return 1; } - + /** - * \brief Return charset used to store data in database - * \return string Charset - */ + * \brief Return charset used to store data in database + * \return string Charset + */ function getDefaultCharacterSetDatabase() { - $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\''); - if (!$resql) - { + $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\''); + if (!$resql) + { // version Mysql < 4.1.1 return $this->forcecharset; - } - $liste=$this->fetch_array($resql); - return $liste['Value']; + } + $liste=$this->fetch_array($resql); + return $liste['Value']; } - + function getListOfCharacterSet() { $resql=$this->query('SHOW CHARSET'); $liste = array(); - if ($resql) - { + if ($resql) + { $i = 0; while ($obj = $this->fetch_object($resql) ) { $liste[$i]['charset'] = $obj->Charset; $liste[$i]['description'] = $obj->Description; - $i++; - } - $this->free($resql); - } else { - // version Mysql < 4.1.1 - return null; - } - return $liste; - } - - /** - * \brief Return collation used in database - * \return string Collation value - */ + $i++; + } + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; + } + + /** + * \brief Return collation used in database + * \return string Collation value + */ function getDefaultCollationDatabase() { $resql=$this->query('SHOW VARIABLES LIKE \'collation_database\''); - if (!$resql) - { + if (!$resql) + { // version Mysql < 4.1.1 return $this->forcecollate; - } - $liste=$this->fetch_array($resql); - return $liste['Value']; + } + $liste=$this->fetch_array($resql); + return $liste['Value']; } - + function getListOfCollation(){ - $resql=$this->query('SHOW COLLATION'); + $resql=$this->query('SHOW COLLATION'); $liste = array(); - if ($resql) - { + if ($resql) + { $i = 0; while ($obj = $this->fetch_object($resql) ) { $liste[$i]['collation'] = $obj->Collation; - $i++; - } - $this->free($resql); - } else { - // version Mysql < 4.1.1 - return null; - } - return $liste; + $i++; + } + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; } } diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php index e341d4b90308a4f81bbcf951cb951611c4693f8c..93cc13568c2ba604e3d2982a81e186850132dcc9 100644 --- a/htdocs/lib/databases/mysqli.lib.php +++ b/htdocs/lib/databases/mysqli.lib.php @@ -21,502 +21,471 @@ */ /** - \file htdocs/lib/databases/mysqli.lib.php - \brief Fichier de la classe permettant de g�rer une base mysql - \version $Id$ -*/ -// Pour compatibilit� lors de l'upgrade + \file htdocs/lib/databases/mysqli.lib.php + \brief Fichier de la classe permettant de g�rer une base mysql + \version $Id$ + */ +// Pour compatibilit� lors de l'upgrade if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php"); /** - \class DoliDb - \brief Classe permettant de g�r�r la database de dolibarr -*/ + \class DoliDb + \brief Classe permettant de g�r�r la database de dolibarr + */ class DoliDb { //! Handler de base - var $db; - //! Nom du gestionnaire - var $type='mysqli'; - //! Charset - var $forcecharset='latin1'; - //! Collate - var $forcecollate='latin1_swedish_ci'; - //! Version min database - var $versionmin=array(4,1,0); - //! Resultset de la derni�re requete - var $results; - //! 1 si connect�, 0 sinon - var $connected; - //! 1 si base s�lectionn�, 0 sinon - var $database_selected; - //! Nom base s�lectionn�e - var $database_name; - //! Nom user base - var $database_user; - //! 1 si une transaction est en cours, 0 sinon - var $transaction_opened; - //! Derniere requete ex�cut�e - var $lastquery; - //! Derniere requete ex�cut�e avec echec - var $lastqueryerror; - //! Message erreur mysql - var $lasterror; - //! Message erreur mysql - var $lasterrno; - - var $ok; - var $error; - - // Constantes pour conversion code erreur MySql en code erreur g�n�rique - var $errorcode_map = array( - 1004 => 'DB_ERROR_CANNOT_CREATE', - 1005 => 'DB_ERROR_CANNOT_CREATE', - 1006 => 'DB_ERROR_CANNOT_CREATE', - 1007 => 'DB_ERROR_ALREADY_EXISTS', - 1008 => 'DB_ERROR_CANNOT_DROP', - 1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP', - 1044 => 'DB_ERROR_ACCESSDENIED', - 1046 => 'DB_ERROR_NODBSELECTED', - 1048 => 'DB_ERROR_CONSTRAINT', - 1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS', - 1051 => 'DB_ERROR_NOSUCHTABLE', - 1054 => 'DB_ERROR_NOSUCHFIELD', - 1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS', - 1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS', - 1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS', - 1064 => 'DB_ERROR_SYNTAX', - 1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', - 1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY', - 1091 => 'DB_ERROR_NOSUCHFIELD', - 1100 => 'DB_ERROR_NOT_LOCKED', - 1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW', - 1146 => 'DB_ERROR_NOSUCHTABLE', - 1216 => 'DB_ERROR_NO_PARENT', - 1217 => 'DB_ERROR_CHILD_EXISTS', - 1451 => 'DB_ERROR_CHILD_EXISTS' - ); - - - /** - \brief Ouverture d'une connexion 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 - \param port Port of database server - \return int 1 en cas de succ�s, 0 sinon - */ - function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0) - { - global $conf,$langs; - - /* Ce test est inutile. En effet, si DOL_DOCUMENT_ROOT est d�fini, cela signifie */ - /* obligatoirement que le fichier conf a deja �t� charg�e puisque cette constante est */ - /* definie a partir du contenu du fichier conf.php */ - /* Et toutes les infos sont charg�s dans l'objet conf */ - /* - if (file_exists($conffile)) { - include($conffile); - $this->forcecharset=$character_set_database; - $this->forcecollate=$dolibarr_main_db_collation; - $this->db_user=$dolibarr_main_db_user; - } - */ + var $db; + //! Nom du gestionnaire + var $type='mysqli'; + //! Charset + var $forcecharset='latin1'; + //! Collate + var $forcecollate='latin1_swedish_ci'; + //! Version min database + var $versionmin=array(4,1,0); + //! Resultset de la derni�re requete + var $results; + //! 1 si connect�, 0 sinon + var $connected; + //! 1 si base s�lectionn�, 0 sinon + var $database_selected; + //! Nom base s�lectionn�e + var $database_name; + //! Nom user base + var $database_user; + //! 1 si une transaction est en cours, 0 sinon + var $transaction_opened; + //! Derniere requete ex�cut�e + var $lastquery; + //! Derniere requete ex�cut�e avec echec + var $lastqueryerror; + //! Message erreur mysql + var $lasterror; + //! Message erreur mysql + var $lasterrno; + + var $ok; + var $error; + + + /** + \brief Ouverture d'une connexion 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 + \param port Port of database server + \return int 1 en cas de succ�s, 0 sinon + */ + function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0) + { + global $conf,$langs; + if (isset($conf->db->character_set) && $conf->db->character_set) { $this->forcecharset=$conf->db->character_set; - } - if (isset($conf->db->dolibarr_main_db_collation) && $conf->db->dolibarr_main_db_collation) { - $this->forcecollate=$conf->db->dolibarr_main_db_collation; - } - $this->database_user=$user; - - $this->transaction_opened=0; - - //print "Name DB: $host,$user,$pass,$name<br>"; - - if (! function_exists("mysqli_connect")) - { - $this->connected = 0; - $this->ok = 0; - $this->error="Mysqli PHP functions are not available in this version of PHP. Try to use another driver."; - dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions are not available in this version of PHP. Try to use another driver.",LOG_ERR); - return $this->ok; - } - - if (! $host) - { - $this->connected = 0; - $this->ok = 0; - $this->error=$langs->trans("ErrorWrongHostParameter"); - dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR); - return $this->ok; - } - - // Essai connexion serveur - $this->db = $this->connect($host, $user, $pass, '', $port); - - if ($this->db) - { - $this->connected = 1; - $this->ok = 1; - } - else - { - // host, login ou password incorrect - $this->connected = 0; - $this->ok = 0; + } + if (isset($conf->db->dolibarr_main_db_collation) && $conf->db->dolibarr_main_db_collation) { + $this->forcecollate=$conf->db->dolibarr_main_db_collation; + } + $this->database_user=$user; + + $this->transaction_opened=0; + + //print "Name DB: $host,$user,$pass,$name<br>"; + + if (! function_exists("mysqli_connect")) + { + $this->connected = 0; + $this->ok = 0; + $this->error="Mysqli PHP functions are not available in this version of PHP. Try to use another driver."; + dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions are not available in this version of PHP. Try to use another driver.",LOG_ERR); + return $this->ok; + } + + if (! $host) + { + $this->connected = 0; + $this->ok = 0; + $this->error=$langs->trans("ErrorWrongHostParameter"); + dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR); + return $this->ok; + } + + // Essai connexion serveur + $this->db = $this->connect($host, $user, $pass, '', $port); + + if ($this->db) + { + $this->connected = 1; + $this->ok = 1; + } + else + { + // host, login ou password incorrect + $this->connected = 0; + $this->ok = 0; $this->error=mysqli_connect_error(); dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysqli_connect_error=".$this->error,LOG_ERR); - } - - // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base - if ($this->connected && $name) - { - if ($this->select_db($name)) - { - $this->database_selected = 1; - $this->database_name = $name; - $this->ok = 1; - - // Si client connect� avec charset different de celui de Dolibarr + } + + // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base + if ($this->connected && $name) + { + if ($this->select_db($name)) + { + $this->database_selected = 1; + $this->database_name = $name; + $this->ok = 1; + + // Si client connect� avec charset different de celui de Dolibarr /*if (mysqli_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase()) { - $this->query("SET NAMES '".$this->forcecharset."'", $this->db); - $this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db); - }*/ - } - else - { - $this->database_selected = 0; - $this->database_name = ''; - $this->ok = 0; - $this->error=$this->error(); - 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 boolean true si ok, false si ko - */ - function select_db($database) - { - return mysqli_select_db($this->db,$database); - } - - - /** - \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 - \seealso close - */ - function connect($host, $login, $passwd, $name, $port=0) - { + $this->query("SET NAMES '".$this->forcecharset."'", $this->db); + $this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db); + }*/ + } + else + { + $this->database_selected = 0; + $this->database_name = ''; + $this->ok = 0; + $this->error=$this->error(); + dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db"); + } + } + else + { + // Pas de selection de base demandee, ok ou ko + $this->database_selected = 0; + } + + return $this->ok; + } + + + /** + * \brief Convert a SQL request in mysql syntax to database syntax + * \param request SQL request to convert + * \return string SQL request converted + */ + function convertSQLFromMysql($request) + { + return $request; + } + + /** + \brief Selectionne une database. + \param database Nom de la database + \return boolean true si ok, false si ko + */ + function select_db($database) + { + return mysqli_select_db($this->db,$database); + } + + + /** + \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 bas + \seealso close + */ + function connect($host, $login, $passwd, $name, $port=0) + { dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name"); $newhost=$host; $newport=$port; - + // With mysqli, port must be in connect parameters if (! $newport) $newport=3306; - $this->db = @mysqli_connect($newhost, $login, $passwd, $name, $newport); - //force les enregistrement en latin1 si la base est en utf8 par d�faut - // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec - // les nouvelles version de Dolibarr car forc� par l'install Dolibarr. + $this->db = @mysqli_connect($newhost, $login, $passwd, $name, $newport); + //force les enregistrement en latin1 si la base est en utf8 par d�faut + // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec + // les nouvelles version de Dolibarr car forc� par l'install Dolibarr. //$this->query('SET NAMES '.$this->forcecharset); - //print "Resultat fonction connect: ".$this->db; + //print "Resultat fonction connect: ".$this->db; if ($this->db) { $this->query("SET NAMES '".$this->forcecharset."'", $this->db); $this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db); } return $this->db; - } - - /** - \brief Renvoie la version du serveur - \return string Chaine version - */ - function getVersion() - { -// $resql=$this->query('SELECT VERSION()'); -// $row=$this->fetch_row($resql); -// return $row[0]; + } + + /** + \brief Renvoie la version du serveur + \return string Chaine version + */ + function getVersion() + { + // $resql=$this->query('SELECT VERSION()'); + // $row=$this->fetch_row($resql); + // return $row[0]; return mysqli_get_server_info($this->db); - } - - /** - \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 - */ - function getVersionArray() - { - return split('\.',$this->getVersion()); - } - - - /** - \brief Fermeture d'une connexion vers une database. - \return resource - \seealso connect - */ - function close() - { - return mysqli_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) + } + + /** + \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 + */ + function getVersionArray() + { + return split('\.',$this->getVersion()); + } + + + /** + \brief Fermeture d'une connexion vers une database. + \return resource + \seealso connect + */ + function close() + { + return mysqli_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++; dolibarr_syslog("BEGIN Transaction",LOG_DEBUG); } - 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) + 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; dolibarr_syslog("COMMIT Transaction",LOG_DEBUG); } - 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<=1) - { - $ret=$this->query("ROLLBACK"); - $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<=1) + { + $ret=$this->query("ROLLBACK"); + $this->transaction_opened=0; dolibarr_syslog("ROLLBACK Transaction",LOG_DEBUG); - return $ret; - } - else - { - $this->transaction_opened--; - 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); - if (! $this->database_name) - { - // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE - $ret = mysqli_query($this->db,$query); - } - else - { - $ret = mysqli_query($this->db,$query); - } - - if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) - { - // Si requete utilisateur, on la sauvegarde ainsi que son resultset + return $ret; + } + else + { + $this->transaction_opened--; + 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); + if (! $this->database_name) + { + // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE + $ret = mysqli_query($this->db,$query); + } + else + { + $ret = mysqli_query($this->db,$query); + } + + if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) + { + // Si requete utilisateur, on la sauvegarde ainsi que son resultset if (! $ret) { $this->lastqueryerror = $query; - $this->lasterror = $this->error(); - $this->lasterrno = $this->errno(); - } - $this->lastquery=$query; - $this->results = $ret; - } - - return $ret; - } - - /** - \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_object($resultset)) { $resultset=$this->results; } - return mysqli_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_object($resultset)) { $resultset=$this->results; } - return mysqli_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_bool($resultset)) - { - if (! is_object($resultset)) { $resultset=$this->results; } - return mysqli_fetch_row($resultset); - } - else - { - // si le curseur est un bool�en on retourne la valeur 0 - return 0; - } - } - - /** - \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_object($resultset)) { $resultset=$this->results; } - return mysqli_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_object($resultset)) { $resultset=$this->results; } - // mysql necessite un link de base pour cette fonction contrairement - // a pqsql qui prend un resultset - return mysqli_affected_rows($this->db); - } - - - /** - \brief Lib�re le dernier resultset utilis� 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 - if (! is_object($resultset)) { $resultset=$this->results; } - // Si resultset en est un, on libere la m�moire - if (is_object($resultset)) mysqli_free_result($resultset); - } - - - /** - \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 - */ - function plimit($limit=0,$offset=0) - { - global $conf; - if (! $limit) $limit=$conf->liste_limit; - if ($offset > 0) return " LIMIT $offset,$limit "; - else return " LIMIT $limit "; - } - - - /** - \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 + $this->lasterror = $this->error(); + $this->lasterrno = $this->errno(); + } + $this->lastquery=$query; + $this->results = $ret; + } + + return $ret; + } + + /** + \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_object($resultset)) { $resultset=$this->results; } + return mysqli_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_object($resultset)) { $resultset=$this->results; } + return mysqli_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_bool($resultset)) + { + if (! is_object($resultset)) { $resultset=$this->results; } + return mysqli_fetch_row($resultset); + } + else + { + // si le curseur est un bool�en on retourne la valeur 0 + return 0; + } + } + + /** + \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_object($resultset)) { $resultset=$this->results; } + return mysqli_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_object($resultset)) { $resultset=$this->results; } + // mysql necessite un link de base pour cette fonction contrairement + // a pqsql qui prend un resultset + return mysqli_affected_rows($this->db); + } + + + /** + \brief Lib�re le dernier resultset utilis� 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 + if (! is_object($resultset)) { $resultset=$this->results; } + // Si resultset en est un, on libere la m�moire + if (is_object($resultset)) mysqli_free_result($resultset); + } + + + /** + \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 ligne + \return string chaine exprimant la syntax sql de la limite + */ + function plimit($limit=0,$offset=0) + { + global $conf; + if (! $limit) $limit=$conf->liste_limit; + if ($offset > 0) return " LIMIT $offset,$limit "; + else return " LIMIT $limit "; + } + + + /** + \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 - */ - function order($sortfield=0,$sortorder=0) - { + */ + function order($sortfield=0,$sortorder=0) + { if ($sortfield) { $return=''; @@ -525,7 +494,7 @@ class DoliDb { if (! $return) $return.=' ORDER BY '; else $return.=','; - + $return.=$val; if ($sortorder) $return.=' '.$sortorder; } @@ -535,137 +504,167 @@ class DoliDb { return ''; } - } - - + } + + /** - \brief Escape a string to insert data. - \param stringtoencode String to escape - \return string String escaped - */ - function escape($stringtoencode) + \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 - * \return date Date au format tms. - * \TODO Remove unix_timestamp functions - */ - function pdate($param) - { - return "unix_timestamp(".$param.")"; - } - - /** - * \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. - * Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE. - * \param param Date tms � convertir - * \return date Date au format text YYYYMMDDHHMMSS. - */ - function idate($param) - { - return adodb_strftime("%Y%m%d%H%M%S",$param); - } - - - /** - \brief Formatage d'un if SQL - \param test chaine test - \param resok resultat si test egal - \param resko resultat si test non egal - \return string chaine format� SQL - */ - function ifsql($test,$resok,$resko) - { - return 'IF('.$test.','.$resok.','.$resko.')'; - } - - - /** - \brief Renvoie la derniere requete soumise par la methode query() - \return lastquery - */ - function lastquery() - { - return $this->lastquery; - } - - /** - \brief Renvoie la derniere requete en erreur - \return string lastqueryerror - */ + /** + * \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 + * \return date Date au format tms. + * \TODO Remove unix_timestamp functions + */ + function pdate($param) + { + return "unix_timestamp(".$param.")"; + } + + /** + * \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. + * Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE + * \param param Date tms � convertir + * \return date Date au format text YYYYMMDDHHMMSS. + */ + function idate($param) + { + return adodb_strftime("%Y%m%d%H%M%S",$param); + } + + + /** + \brief Formatage d'un if SQL + \param test chaine test + \param resok resultat si test egal + \param resko resultat si test non egal + \return string chaine format� SQL + */ + function ifsql($test,$resok,$resko) + { + return 'IF('.$test.','.$resok.','.$resko.')'; + } + + + /** + \brief Renvoie la derniere requete soumise par la methode query() + \return lastquery + */ + function lastquery() + { + return $this->lastquery; + } + + /** + \brief Renvoie la derniere requete en erreur + \return string lastqueryerror + */ function lastqueryerror() { return $this->lastqueryerror; } - /** - \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...) - */ - function errno() - { - if (! $this->connected) { - // Si il y a eu echec de connexion, $this->db n'est pas valide. - return 'DB_ERROR_FAILED_TO_CONNECT'; - } - else { - if (isset($this->errorcode_map[mysqli_errno($this->db)])) { - return $this->errorcode_map[mysqli_errno($this->db)]; - } - $errno=mysqli_errno($this->db); - return ($errno?'DB_ERROR_'.$errno:'0'); - } - } - - /** - \brief Renvoie le texte de l'erreur mysql de l'operation precedente. - \return error_text - */ - function error() - { - if (! $this->connected) { - // Si il y a eu echec de connexion, $this->db n'est pas valide pour mysqli_error. - return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions'; - } - else { - return mysqli_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 - */ - function last_insert_id($tab) - { - return mysqli_insert_id($this->db); - } + /** + \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 (! $this->connected) { + // Si il y a eu echec de connexion, $this->db n'est pas valide. + return 'DB_ERROR_FAILED_TO_CONNECT'; + } + else { + // Constants to convert a MySql error code to a generic Dolibarr error code + $errorcode_map = array( + 1004 => 'DB_ERROR_CANNOT_CREATE', + 1005 => 'DB_ERROR_CANNOT_CREATE', + 1006 => 'DB_ERROR_CANNOT_CREATE', + 1007 => 'DB_ERROR_ALREADY_EXISTS', + 1008 => 'DB_ERROR_CANNOT_DROP', + 1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP', + 1044 => 'DB_ERROR_ACCESSDENIED', + 1046 => 'DB_ERROR_NODBSELECTED', + 1048 => 'DB_ERROR_CONSTRAINT', + 1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS', + 1051 => 'DB_ERROR_NOSUCHTABLE', + 1054 => 'DB_ERROR_NOSUCHFIELD', + 1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS', + 1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS', + 1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS', + 1064 => 'DB_ERROR_SYNTAX', + 1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', + 1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY', + 1091 => 'DB_ERROR_NOSUCHFIELD', + 1100 => 'DB_ERROR_NOT_LOCKED', + 1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW', + 1146 => 'DB_ERROR_NOSUCHTABLE', + 1216 => 'DB_ERROR_NO_PARENT', + 1217 => 'DB_ERROR_CHILD_EXISTS', + 1451 => 'DB_ERROR_CHILD_EXISTS' + ); + + if (isset($this->errorcode_map[mysqli_errno($this->db)])) + { + return $this->errorcode_map[mysqli_errno($this->db)]; + } + $errno=mysqli_errno($this->db); + return ($errno?'DB_ERROR_'.$errno:'0'); + } + } + + /** + \brief Renvoie le texte de l'erreur mysql de l'operation precedente. + \return error_text + */ + function error() + { + if (! $this->connected) { + // Si il y a eu echec de connexion, $this->db n'est pas valide pour mysqli_error. + return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions'; + } + else { + return mysqli_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 + */ + function last_insert_id($tab) + { + return mysqli_insert_id($this->db); + } @@ -674,49 +673,49 @@ class DoliDb - /** - \brief Renvoie l'id de la connexion - \return string Id connexion - */ - function DDLGetConnectId() - { - $resql=$this->query('SELECT CONNECTION_ID()'); - $row=$this->fetch_row($resql); - return $row[0]; - } + /** + \brief Renvoie l'id de la connexion + \return string Id connexion + */ + function DDLGetConnectId() + { + $resql=$this->query('SELECT CONNECTION_ID()'); + $row=$this->fetch_row($resql); + return $row[0]; + } - /** - \brief Cr�ation d'une nouvelle base de donn�e - \param database nom de la database � cr�er - \return resource resource d�finie si ok, null si ko - \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated - */ + /** + \brief Cr�ation d'une nouvelle base de donn�e + \param database nom de la database � cr�er + \return resource resource d�finie si ok, null si k + \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated + */ function DDLCreateDb($database) { - // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci - $sql = 'CREATE DATABASE '.$database; - $sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate; - $ret=$this->query($sql); + // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci + $sql = 'CREATE DATABASE '.$database; + $sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate; + $ret=$this->query($sql); if (! $ret) - { - // On r�essaie pour compatibilit� avec Mysql < 4.1.1 + { + // On r�essaie pour compatibilit� avec Mysql < 4.1.1 $sql = 'CREATE DATABASE '.$database; $ret=$this->query($sql); - } - return $ret; + } + return $ret; } /** \brief Liste des tables dans une database. \param database Nom de la database - \param table Filtre sur tables � rechercher + \param table Filtre sur tables � rechercher \return array Tableau des tables de la base - */ - function DDLListTables($database, $table='') - { + */ + function DDLListTables($database, $table='') + { $listtables=array(); - + $like = ''; if ($table) $like = "LIKE '".$table."'"; $sql="SHOW TABLES FROM ".$database." ".$like.";"; @@ -727,22 +726,22 @@ class DoliDb $listtables[] = $row[0]; } return $listtables; - } + } /** - \brief Cr�e une table + \brief Cr�e une table \param table Nom de la table \param fields Tableau associatif [nom champ][tableau des descriptions] \param primary_key Nom du champ qui sera la clef primaire \param unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur - \param fulltext Tableau des Nom de champs qui seront index�s en fulltext - \param key Tableau des champs cl�s noms => valeur + \param fulltext Tableau des Nom de champs qui seront index�s en fulltext + \param key Tableau des champs cl�s noms => valeur \param type Type de la table \return int <0 si KO, >=0 si OK - */ + */ function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="") { - // cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra + // cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment'); $sql = "create table ".$table."("; $i=0; @@ -763,14 +762,14 @@ class DoliDb } else if( eregi("^[^ ]",$field_desc['null'])) $sqlfields[$i] .= " ".$field_desc['null']; - + else if( eregi("^[^ ]",$field_desc['extra'])) $sqlfields[$i] .= " ".$field_desc['extra']; $i++; } if($primary_key != "") $pk = "primary key(".$primary_key.")"; - + if($unique_keys != "") { $i = 0; @@ -800,88 +799,88 @@ class DoliDb dolibarr_syslog($sql); if(! $this -> query($sql)) - return -1; + return -1; else - return 1; + return 1; } /** - \brief d�crit une table dans une database. + \brief d�crit une table dans une database. \param table Nom de la table \param field Optionnel : Nom du champ si l'on veut la desc d'un champ \return resource - */ + */ function DDLDescTable($table,$field="") - { + { $sql="DESC ".$table." ".$field; dolibarr_syslog($sql); $this->results = $this->query($sql); return $this->results; - } + } /** - \brief Ins�re un nouveau champ dans une table + \brief Ins�re un nouveau champ dans une table \param table Nom de la table - \param field_name Nom du champ � ins�rer - \param field_desc Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre] + \param field_name Nom du champ � ins�rer + \param field_desc Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre] \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 + // cl�s recherch�es 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']; if( eregi("^[^ ]",$field_desc['value'])) - $sql .= "(".$field_desc['value'].")"; + $sql .= "(".$field_desc['value'].")"; if( eregi("^[^ ]",$field_desc['attribute'])) - $sql .= " ".$field_desc['attribute']; + $sql .= " ".$field_desc['attribute']; if( eregi("^[^ ]",$field_desc['null'])) - $sql .= " ".$field_desc['null']; + $sql .= " ".$field_desc['null']; if( eregi("^[^ ]",$field_desc['default'])) - if(eregi("null",$field_desc['default'])) - $sql .= " default ".$field_desc['default']; - else - $sql .= " default '".$field_desc['default']."'"; + if(eregi("null",$field_desc['default'])) + $sql .= " default ".$field_desc['default']; + else + $sql .= " default '".$field_desc['default']."'"; if( eregi("^[^ ]",$field_desc['extra'])) - $sql .= " ".$field_desc['extra']; + $sql .= " ".$field_desc['extra']; $sql .= " ".$field_position; if(! $this -> query($sql)) - return -1; + return -1; else - return 1; + return 1; } /** - \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 � 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 + */ function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name) { $sql = "INSERT INTO user "; $sql.= "(Host,User,password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)"; $sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_user',password('$dolibarr_main_db_pass')"; $sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');"; - + dolibarr_syslog("mysqli.lib::DDLCreateUser sql=".$sql); $resql=$this->query($sql); if (! $resql) { return -1; } - + $sql = "INSERT INTO db "; $sql.= "(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)"; $sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_name','$dolibarr_main_db_user'"; $sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');"; - + dolibarr_syslog("mysqli.lib::DDLCreateUser sql=".$sql); $resql=$this->query($sql); if (! $resql) @@ -893,77 +892,77 @@ class DoliDb dolibarr_syslog("mysqli.lib::DDLCreateUser sql=".$sql); $resql=$this->query($sql); - + return 1; } - + /** - * \brief Return charset used to store data in database - * \return string Charset - */ + * \brief Return charset used to store data in database + * \return string Charset + */ function getDefaultCharacterSetDatabase(){ - $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\''); - if (!$resql) - { + $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\''); + if (!$resql) + { // version Mysql < 4.1.1 return $this->forcecharset; - } - $liste=$this->fetch_array($resql); - return $liste['Value']; + } + $liste=$this->fetch_array($resql); + return $liste['Value']; } - + function getListOfCharacterSet(){ - $resql=$this->query('SHOW CHARSET'); + $resql=$this->query('SHOW CHARSET'); $liste = array(); - if ($resql) - { + if ($resql) + { $i = 0; while ($obj = $this->fetch_object($resql) ) { $liste[$i]['charset'] = $obj->Charset; $liste[$i]['description'] = $obj->Description; - $i++; - } - $this->free($resql); - } else { - // version Mysql < 4.1.1 - return null; - } - return $liste; - } - - /** - * \brief Return collation used in database - * \return string Collation value - */ + $i++; + } + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; + } + + /** + * \brief Return collation used in database + * \return string Collation value + */ function getDefaultCollationDatabase(){ $resql=$this->query('SHOW VARIABLES LIKE \'collation_database\''); - if (!$resql) - { + if (!$resql) + { // version Mysql < 4.1.1 return $this->forcecollate; - } - $liste=$this->fetch_array($resql); - return $liste['Value']; + } + $liste=$this->fetch_array($resql); + return $liste['Value']; } - + function getListOfCollation(){ - $resql=$this->query('SHOW COLLATION'); + $resql=$this->query('SHOW COLLATION'); $liste = array(); - if ($resql) - { + if ($resql) + { $i = 0; while ($obj = $this->fetch_object($resql) ) { $liste[$i]['collation'] = $obj->Collation; - $i++; - } - $this->free($resql); - } else { - // version Mysql < 4.1.1 - return null; - } - return $liste; + $i++; + } + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; } } diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php index 5e7809564d6868ced349d6b7f88ac83a55c09511..18f9f7324e0807560afb07ade6253a07ecb150e6 100644 --- a/htdocs/lib/databases/pgsql.lib.php +++ b/htdocs/lib/databases/pgsql.lib.php @@ -22,17 +22,17 @@ /** \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 g�r�r une base pgsql \version $Id$ */ -// Pour compatibilit� lors de l'upgrade +// For compatibility during upgrade if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php"); /** \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 { @@ -42,11 +42,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 derni�re 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 connect�, 0 sinon + var $database_selected; // 1 si base s�lectionn�, 0 sinon + var $database_name; // Nom base s�lectionn�e var $database_user; //! Nom user base var $transaction_opened; // 1 si une transaction est en cours, 0 sinon var $lastquery; @@ -60,30 +60,18 @@ 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 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 + \return int 1 en cas de succ�s, 0 sinon */ function DoliDb($type='pgsql', $host, $user, $pass, $name='', $port=0) { global $conf,$langs; - /* Ce test est inutile. En effet, si DOL_DOCUMENT_ROOT est d�fini, cela signifie */ - /* obligatoirement que le fichier conf a deja �t� charg�e puisque cette constante est */ - /* definie a partir du contenu du fichier conf.php */ - /* Et toutes les infos sont charg�s dans l'objet conf */ - /* - if (file_exists($conffile)) { - include($conffile); - $this->forcecharset=$character_set_database; - $this->forcecollate=$dolibarr_main_db_collation; - $this->db_user=$dolibarr_main_db_user; - } - */ $this->forcecharset=$conf->character_set_client; $this->forcecollate=$conf->db->dolibarr_main_db_collation; $this->database_user=$user; @@ -127,7 +115,7 @@ class DoliDb dolibarr_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 demand�e, on essaie connexion base if ($this->connected && $name) { if ($this->select_db($name)) @@ -147,19 +135,30 @@ class DoliDb } else { - // Pas de selection de base demand�e, ok ou ko + // Pas de selection de base demandee, ok ou ko $this->database_selected = 0; } return $this->ok; } + + /** + * \brief Convert a SQL request in mysql syntax to database syntax + * \param request SQL request to convert + * \return string SQL request converted + */ + function convertSQLFromMysql($request) + { + return $request; + } + /** \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 + \remarks On compare juste manuellement si la database choisie est bien celle activ�e par la connexion */ function select_db($database) { @@ -171,12 +170,12 @@ class DoliDb /** \brief Connection vers le serveur - \param host addresse de la base de donn�es + \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 + \return resource handler d'acc�s � la base */ function connect($host, $login, $passwd, $name, $port=0) { @@ -308,7 +307,7 @@ class DoliDb /** - \brief Effectue une requete et renvoi le resultset de r�ponse de la base + \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 */ @@ -343,31 +342,31 @@ class DoliDb */ 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 utilis� sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_object($resultset); } /** - \brief Renvoie les donn�es dans un tableau. + \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 + // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_array($resultset); } /** - \brief Renvoie les donn�es comme un tableau. + \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 + // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_row($resultset); } @@ -380,7 +379,7 @@ class DoliDb */ 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 utilis� sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_num_rows($resultset); } @@ -393,7 +392,7 @@ class DoliDb */ 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 utilis� 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 @@ -402,22 +401,22 @@ class DoliDb /** - \brief Lib�re le dernier resultset utilis� sur cette connexion. + \brief Lib�re le dernier resultset utilis� 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 utilis� sur cette connexion if (! is_resource($resultset)) { $resultset=$this->results; } - // Si resultset en est un, on libere la m�moire + // Si resultset en est un, on libere la m�moire if (is_resource($resultset)) pg_free_result($resultset); } /** - \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 + \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 */ function plimit($limit=0,$offset=0) @@ -430,7 +429,7 @@ class DoliDb /** - \brief D�fini le tri de la requ�te. + \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 @@ -471,10 +470,10 @@ class DoliDb /** - * \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 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 * \return date Date au format tms. */ function pdate($param) @@ -484,8 +483,8 @@ class DoliDb /** \brief Formatage (par PHP) de la date en texte qui s'insere dans champ date. - Fonction � utiliser pour g�n�rer les INSERT. - \param param Date tms � convertir + Fonction � utiliser pour g�n�rer les INSERT. + \param param Date tms � convertir \return date Date au format text YYYYMMDDHHMMSS. */ function idate($param) @@ -499,7 +498,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 format� SQL */ function ifsql($test,$resok,$resko) { @@ -549,8 +548,8 @@ class DoliDb */ function errno() { - static $error_regexps; - if (empty($error_regexps)) { + if (empty($error_regexps)) + { $error_regexps = array( '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => 'DB_ERROR_NOSUCHTABLE', '/table [\"\'].*[\"\'] does not exist/' => 'DB_ERROR_NOSUCHTABLE', @@ -581,8 +580,8 @@ class DoliDb } /** - \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 + \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 */ function last_insert_id($tab) @@ -609,9 +608,9 @@ class DoliDb /** - \brief Cr�ation d'une nouvelle base de donn�e - \param database nom de la database � cr�er - \return resource resource d�finie si ok, null si ko + \brief Cr�ation d'une nouvelle base de donn�e + \param database nom de la database � cr�er + \return resource resource d�finie si ok, null si ko \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated */ function DDLCreateDb($database) @@ -635,8 +634,8 @@ class DoliDb /** \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_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 */