diff --git a/htdocs/lib/databases/mssql.lib.php b/htdocs/lib/databases/mssql.lib.php index 4191d8ea1fa..4b52dd49c57 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; - + //! 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; - // 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 + 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='mssql', $host, $user, $pass, $name='', $port=0) - { - global $conf,$langs; + 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; - } - + $this->database_user=$user; + $this->transaction_opened=0; - /** - \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); - } + 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; + } - /** - \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) + 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); + function query($query) + { + $query = trim($query); - // 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 ""; - - 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); - } + // 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); - /** - \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); - } + $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); + } - /** - \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); - } + $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); - /** - \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); - } + // 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 ""; - /** - \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 "; - } + 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 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 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 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 (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 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 soumise par la methode query() + \return lastquery + */ + function lastquery() + { + return $this->lastquery; + } - /** - \brief Renvoie la derniere requete en erreur - \return string lastqueryerror - */ + /** + \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 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 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 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 29f3e7a9537..1eae22088ec 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; + //! 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; - // 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 - */ + /** + \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 - */ - 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 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 Debut d'une transaction. - \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur + + /** + \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 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 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 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 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 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 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 (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 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 soumise par la methode query() + \return lastquery + */ + function lastquery() + { + return $this->lastquery; + } - /** - \brief Renvoie la derniere requete en erreur - \return string lastqueryerror - */ + /** + \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 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 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 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; + $i++; + } + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; } - + /** - * \brief Return collation used in database - * \return string Collation value - */ + * \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 e341d4b9030..93cc13568c2 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; + 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; - // 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' - ); + 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; - - /* 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; - } - */ + /** + \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; + } + 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; + $this->transaction_opened=0; - //print "Name DB: $host,$user,$pass,$name
"; + //print "Name DB: $host,$user,$pass,$name
"; - 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 (! 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; - } + 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); + // 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 ($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 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 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; - } + $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; - } + 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 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 base - \seealso close - */ - function connect($host, $login, $passwd, $name, $port=0) - { + /** + \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 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 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 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 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; - } - } + 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) + /** + \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; - } - } + 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; + /** + \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; - } - } + 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); - } + /** + \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 (! 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; - } + $this->lasterror = $this->error(); + $this->lasterrno = $this->errno(); + } + $this->lastquery=$query; + $this->results = $ret; + } - return $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 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 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 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 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 (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 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 soumise par la methode query() + \return lastquery + */ + function lastquery() + { + return $this->lastquery; + } - /** - \brief Renvoie la derniere requete en erreur - \return string lastqueryerror - */ + /** + \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 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 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 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; + $i++; + } + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; } - + /** - * \brief Return collation used in database - * \return string Collation value - */ + * \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 5e7809564d6..18f9f7324e0 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 */