2
0
forked from Wavyzz/dolibarr

Optimized memory used by database handlers

This commit is contained in:
Laurent Destailleur
2008-09-05 23:08:07 +00:00
parent 945b9649ef
commit 73eb0de564
4 changed files with 1792 additions and 1787 deletions

View File

@@ -21,10 +21,10 @@
/** /**
\file htdocs/lib/databases/mssql.lib.php \file htdocs/lib/databases/mssql.lib.php
\brief Fichier de la classe permettant de g<>rer une base mssql \brief Fichier de la classe permettant de g<>rer une base mssql
\version $Id$ \version $Id$
*/ */
// Pour compatibilit<EFBFBD> lors de l'upgrade // Pour compatibilite lors de l'upgrade
if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); 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"); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
@@ -33,7 +33,7 @@ if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/a
\class DoliDb \class DoliDb
\brief Classe de gestion de la database de dolibarr \brief Classe de gestion de la database de dolibarr
\remarks Works with PHP5 Only \remarks Works with PHP5 Only
*/ */
class DoliDb class DoliDb
{ {
//! Handler de base //! Handler de base
@@ -46,21 +46,21 @@ class DoliDb
var $forcecollate='latin1_swedish_ci'; var $forcecollate='latin1_swedish_ci';
//! Version min database //! Version min database
var $versionmin=array(2000); var $versionmin=array(2000);
//! Resultset de la derni<6E>re requete //! Resultset de la derni<6E>re requete
var $results; var $results;
//! 1 si connect<63>, 0 sinon //! 1 si connect<63>, 0 sinon
var $connected; var $connected;
//! 1 si base s<>lectionn<6E>, 0 sinon //! 1 si base s<>lectionn<6E>, 0 sinon
var $database_selected; var $database_selected;
//! Nom base s<>lectionn<6E>e //! Nom base s<>lectionn<6E>e
var $database_name; var $database_name;
//! Nom user base //! Nom user base
var $database_user; var $database_user;
//! 1 si une transaction est en cours, 0 sinon //! 1 si une transaction est en cours, 0 sinon
var $transaction_opened; var $transaction_opened;
//! Derniere requete ex<65>cut<75>e //! Derniere requete ex<65>cut<75>e
var $lastquery; var $lastquery;
//! Derniere requete ex<65>cut<75>e avec echec //! Derniere requete ex<65>cut<75>e avec echec
var $lastqueryerror; var $lastqueryerror;
//! Message erreur mysql //! Message erreur mysql
var $lasterror; var $lasterror;
@@ -71,45 +71,15 @@ class DoliDb
var $error; var $error;
// Constantes pour conversion code erreur MSSql en code erreur g<>n<EFBFBD>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 <20>ventuellement une database. \brief Ouverture d'une connexion vers le serveur et <20>ventuellement une database.
\param type Type de base de donn<6E>es (mysql ou pgsql) \param type Type de base de donn<6E>es (mysql ou pgsql)
\param host Addresse de la base de donn<6E>es \param host Addresse de la base de donn<6E>es
\param user Nom de l'utilisateur autoris<69> \param user Nom de l'utilisateur autoris<69>
\param pass Mot de passe \param pass Mot de passe
\param name Nom de la database \param name Nom de la database
\param port Port of database server \param port Port of database server
\return int 1 en cas de succ<63>s, 0 sinon \return int 1 en cas de succ<63>s, 0 sinon
*/ */
function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0) function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0)
{ {
@@ -140,8 +110,8 @@ class DoliDb
$this->db = $this->connect($host, $user, $pass, $name, $port); $this->db = $this->connect($host, $user, $pass, $name, $port);
if ($this->db) if ($this->db)
{ {
// Si client connect<63> avec charset different de celui de la base Dolibarr // Si client connect<63> avec charset different de celui de la base Dolibarr
// (La base Dolibarr a <20>t<EFBFBD> forc<72>e en this->forcecharset <20> l'install) // (La base Dolibarr a <20>t<EFBFBD> forc<72>e en this->forcecharset <20> l'install)
$this->connected = 1; $this->connected = 1;
$this->ok = 1; $this->ok = 1;
} }
@@ -154,7 +124,7 @@ class DoliDb
dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mssql_get_last_message=".$this->error,LOG_ERR); dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mssql_get_last_message=".$this->error,LOG_ERR);
} }
// Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base // Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base
if ($this->connected && $name) if ($this->connected && $name)
{ {
if ($this->select_db($name)) if ($this->select_db($name))
@@ -174,18 +144,27 @@ class DoliDb
} }
else else
{ {
// Pas de selection de base demand<EFBFBD>e, ok ou ko // Pas de selection de base demandee, ok ou ko
$this->database_selected = 0; $this->database_selected = 0;
} }
return $this->ok; 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. * \brief Selectionne une database.
\param database Nom de la database * \param database Nom de la database
\return boolean true si ok, false si ko * \return boolean true si ok, false si ko
*/ */
function select_db($database) function select_db($database)
{ {
@@ -194,12 +173,12 @@ class DoliDb
/** /**
\brief Connection vers le serveur \brief Connection vers le serveur
\param host addresse de la base de donn<EFBFBD>es \param host addresse de la base de donnees
\param login nom de l'utilisateur autoris \param login nom de l'utilisateur autoris
\param passwd mot de passe \param passwd mot de passe
\param name nom de la database (ne sert pas sous mysql, sert sous pgsql) \param name nom de la database (ne sert pas sous mysql, sert sous pgsql)
\param port Port of database server \param port Port of database server
\return resource handler d'acc<63>s <20> la base \return resource handler d'acc<63>s <20> la bas
\seealso close \seealso close
*/ */
function connect($host, $login, $passwd, $name, $port=0) function connect($host, $login, $passwd, $name, $port=0)
@@ -208,9 +187,9 @@ class DoliDb
$newhost=$host; $newhost=$host;
if ($port) $newhost.=':'.$port; if ($port) $newhost.=':'.$port;
$this->db = @mssql_connect($newhost, $login, $passwd); $this->db = @mssql_connect($newhost, $login, $passwd);
//force les enregistrement en latin1 si la base est en utf8 par d<>faut //force les enregistrement en latin1 si la base est en utf8 par d<>faut
// Supprim<69> car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec // Supprim<69> car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
// les nouvelles version de Dolibarr car forc<72> par l'install Dolibarr. // les nouvelles version de Dolibarr car forc<72> par l'install Dolibarr.
//$this->query('SET NAMES '.$this->forcecharset); //$this->query('SET NAMES '.$this->forcecharset);
//print "Resultat fonction connect: ".$this->db; //print "Resultat fonction connect: ".$this->db;
return $this->db; return $this->db;
@@ -316,7 +295,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 \param query Contenu de la query
\return resource Resultset de la reponse \return resource Resultset de la reponse
*/ */
@@ -346,7 +325,7 @@ class DoliDb
// Extraire le nombre limite // Extraire le nombre limite
$number = stristr($query, " limit "); $number = stristr($query, " limit ");
$number = substr($number, 7); $number = substr($number, 7);
// Ins<6E>rer l'instruction TOP et le nombre limite // Ins<6E>rer l'instruction TOP et le nombre limite
$query = str_ireplace("select ", "select top ".$number." ", $query); $query = str_ireplace("select ", "select top ".$number." ", $query);
// Supprimer l'instruction MySql // Supprimer l'instruction MySql
$query = str_ireplace(" limit ".$number, "", $query); $query = str_ireplace(" limit ".$number, "", $query);
@@ -354,20 +333,20 @@ class DoliDb
$itemfound = stripos($query, " week("); $itemfound = stripos($query, " week(");
if ($itemfound !== false) { if ($itemfound !== false) {
// Recr<63>er une requ<71>te sans instruction Mysql // Recr<63>er une requ<71>te sans instruction Mysql
$positionMySql = stripos($query, " week("); $positionMySql = stripos($query, " week(");
$newquery = substr($query, 0, $positionMySql); $newquery = substr($query, 0, $positionMySql);
// R<>cup<75>rer la date pass<73>e en param<61>tre // R<>cup<75>rer la date pass<73>e en param<61>tre
$extractvalue = stristr($query, " week("); $extractvalue = stristr($query, " week(");
$extractvalue = substr($extractvalue, 6); $extractvalue = substr($extractvalue, 6);
$positionMySql = stripos($extractvalue, ")"); $positionMySql = stripos($extractvalue, ")");
// Conserver la fin de la requ<71>te // Conserver la fin de la requ<71>te
$endofquery = substr($extractvalue, $positionMySql); $endofquery = substr($extractvalue, $positionMySql);
$extractvalue = substr($extractvalue, 0, $positionMySql); $extractvalue = substr($extractvalue, 0, $positionMySql);
// Remplacer l'instruction MySql en Sql Server // Remplacer l'instruction MySql en Sql Server
// Ins<6E>rer la date en param<61>tre et le reste de la requ<71>te // Ins<6E>rer la date en param<61>tre et le reste de la requ<71>te
$query = $newquery." DATEPART(week, ".$extractvalue.$endofquery; $query = $newquery." DATEPART(week, ".$extractvalue.$endofquery;
} }
@@ -375,7 +354,7 @@ class DoliDb
if (! $this->database_name) if (! $this->database_name)
{ {
// Ordre SQL ne n<>cessitant pas de connexion <20> une base (exemple: CREATE DATABASE) // Ordre SQL ne n<>cessitant pas de connexion <20> une base (exemple: CREATE DATABASE)
$ret = mssql_query($query, $this->db); $ret = mssql_query($query, $this->db);
} }
else else
@@ -410,32 +389,32 @@ class DoliDb
*/ */
function fetch_object($resultset=0) function fetch_object($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mssql_fetch_object($resultset); return mssql_fetch_object($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es dans un tableau. \brief Renvoie les donn<6E>es dans un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_array($resultset=0) function fetch_array($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mssql_fetch_array($resultset); return mssql_fetch_array($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es comme un tableau. \brief Renvoie les donn<6E>es comme un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_row($resultset=0) function fetch_row($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return @mssql_fetch_row($resultset); return @mssql_fetch_row($resultset);
} }
@@ -448,7 +427,7 @@ class DoliDb
*/ */
function num_rows($resultset=0) function num_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mssql_num_rows($resultset); return mssql_num_rows($resultset);
} }
@@ -461,7 +440,7 @@ class DoliDb
*/ */
function affected_rows($resultset=0) function affected_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
// mssql necessite un link de base pour cette fonction contrairement // mssql necessite un link de base pour cette fonction contrairement
// a pqsql qui prend un resultset // a pqsql qui prend un resultset
@@ -472,22 +451,22 @@ class DoliDb
/** /**
\brief Lib<69>re le dernier resultset utilis<69> sur cette connexion. \brief Lib<69>re le dernier resultset utilis<69> sur cette connexion.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
*/ */
function free($resultset=0) function free($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } 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)) mssql_free_result($resultset); if (is_resource($resultset)) mssql_free_result($resultset);
} }
/** /**
\brief D<>fini les limites de la requ<71>te. \brief D<>fini les limites de la requ<71>te.
\param limit nombre maximum de lignes retourn<72>es \param limit nombre maximum de lignes retourn<72>es
\param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les lignes \param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les ligne
\return string chaine exprimant la syntax sql de la limite \return string chaine exprimant la syntax sql de la limite
*/ */
function plimit($limit=0,$offset=0) function plimit($limit=0,$offset=0)
@@ -500,7 +479,7 @@ class DoliDb
/** /**
\brief D<>fini le tri de la requ<71>te. \brief D<>fini le tri de la requ<71>te.
\param sortfield liste des champ de tri \param sortfield liste des champ de tri
\param sortorder ordre du tri \param sortorder ordre du tri
\return string chaine exprimant la syntax sql de l'ordre de tri \return string chaine exprimant la syntax sql de l'ordre de tri
@@ -541,9 +520,9 @@ class DoliDb
/** /**
* \brief Formatage (par la base de donn<6E>es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS) * \brief Formatage (par la base de donn<6E>es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS)
* afin de retourner une donn<6E>e toujours au format universel date TMS unix. * afin de retourner une donn<6E>e toujours au format universel date TMS unix.
* Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT. * Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT.
* \param param Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS' * \param param Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS'
* \return date Date au format TMS. * \return date Date au format TMS.
* \TODO Remove unix_timestamp functions * \TODO Remove unix_timestamp functions
@@ -555,8 +534,8 @@ class DoliDb
/** /**
\brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT. Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT.
\param param Date TMS <20> convertir \param param Date TMS <20> convertir
\return date Date au format texte YYYYMMDDHHMMSS. \return date Date au format texte YYYYMMDDHHMMSS.
*/ */
function idate($param) function idate($param)
@@ -571,7 +550,7 @@ class DoliDb
\param test chaine test \param test chaine test
\param resok resultat si test egal \param resok resultat si test egal
\param resko resultat si test non egal \param resko resultat si test non egal
\return string chaine format<61> SQL \return string chaine format<61> SQL
*/ */
function ifsql($test,$resok,$resko) function ifsql($test,$resok,$resko)
{ {
@@ -626,7 +605,37 @@ class DoliDb
return 'DB_ERROR_FAILED_TO_CONNECT'; return 'DB_ERROR_FAILED_TO_CONNECT';
} }
else { else {
if (isset($this->errorcode_map[$this->lasterrno])) { // 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]; return $this->errorcode_map[$this->lasterrno];
} }
$errno=$this->lasterrno; $errno=$this->lasterrno;
@@ -650,8 +659,8 @@ class DoliDb
} }
/** /**
\brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT. \brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT.
\param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous mssql mais requis pour compatibilit<69> avec Postgresql \param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous mssql mais requis pour compatibilit<69> avec Postgresql
\return int id \return int id
*/ */
function last_insert_id($tab) function last_insert_id($tab)
@@ -685,9 +694,9 @@ class DoliDb
} }
/** /**
\brief Cr<43>ation d'une nouvelle base de donn<6E>e \brief Cr<43>ation d'une nouvelle base de donn<6E>e
\param database nom de la database <20> cr<63>er \param database nom de la database <20> cr<63>er
\return resource resource d<>finie si ok, null si ko \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 \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
*/ */
@@ -699,7 +708,7 @@ class DoliDb
$ret=$this->query($sql); $ret=$this->query($sql);
if (! $ret) if (! $ret)
{ {
// On r<>essaie pour compatibilit<69> avec mssql < 5.0 // On r<>essaie pour compatibilit<69> avec mssql < 5.0
$sql = 'CREATE DATABASE '.$database; $sql = 'CREATE DATABASE '.$database;
$ret=$this->query($sql); $ret=$this->query($sql);
} }
@@ -719,19 +728,19 @@ class DoliDb
} }
/** /**
\brief Cr<43>e une table \brief Cr<43>e une table
\param table Nom de la table \param table Nom de la table
\param fields Tableau associatif [nom champ][tableau des descriptions] \param fields Tableau associatif [nom champ][tableau des descriptions]
\param primary_key Nom du champ qui sera la clef primaire \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 unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur
\param fulltext Tableau des Nom de champs qui seront index<65>s en fulltext \param fulltext Tableau des Nom de champs qui seront index<65>s en fulltext
\param key Tableau des champs cl<63>s noms => valeur \param key Tableau des champs cl<63>s noms => valeur
\param type Type de la table \param type Type de la table
\return int <0 si KO, >=0 si OK \return int <0 si KO, >=0 si OK
*/ */
function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="") function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
{ {
// cl<63>s recherch<63>es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra // cl<63>s recherch<63>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'); // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql = "create table ".$table."("; $sql = "create table ".$table."(";
$i=0; $i=0;
@@ -795,7 +804,7 @@ class DoliDb
} }
/** /**
\brief d<>crit une table dans une database. \brief d<>crit une table dans une database.
\param table Nom de la table \param table Nom de la table
\param field Optionnel : Nom du champ si l'on veut la desc d'un champ \param field Optionnel : Nom du champ si l'on veut la desc d'un champ
\return resource \return resource
@@ -810,16 +819,16 @@ class DoliDb
} }
/** /**
\brief Ins<6E>re un nouveau champ dans une table \brief Ins<6E>re un nouveau champ dans une table
\param table Nom de la table \param table Nom de la table
\param field_name Nom du champ <20> ins<6E>rer \param field_name Nom du champ <20> ins<6E>rer
\param field_desc Tableau associatif de description duchamp <20> ins<6E>rer[nom du param<61>tre][valeur du param<61>tre] \param field_desc Tableau associatif de description duchamp <20> ins<6E>rer[nom du param<61>tre][valeur du param<61>tre]
\param field_position Optionnel ex.: "after champtruc" \param field_position Optionnel ex.: "after champtruc"
\return int <0 si KO, >0 si OK \return int <0 si KO, >0 si OK
*/ */
function DDLAddField($table,$field_name,$field_desc,$field_position="") function DDLAddField($table,$field_name,$field_desc,$field_position="")
{ {
// cl<63>s recherch<63>es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra // cl<63>s recherch<63>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'); // ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql= "ALTER TABLE ".$table." ADD ".$field_name." "; $sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
$sql .= $field_desc['type']; $sql .= $field_desc['type'];
@@ -876,7 +885,7 @@ class DoliDb
} }
return $liste; return $liste;
*/ */
return ''; // attente d<>buggage return ''; // attente d<>buggage
} }
function getDefaultCollationDatabase(){ function getDefaultCollationDatabase(){
@@ -907,7 +916,7 @@ class DoliDb
} }
return $liste; return $liste;
*/ */
return ''; // attente d<>bugage return ''; // attente d<>bugage
} }
} }

View File

@@ -22,10 +22,10 @@
/** /**
\file htdocs/lib/databases/mysql.lib.php \file htdocs/lib/databases/mysql.lib.php
\brief Fichier de la classe permettant de g<>rer une base mysql \brief Fichier de la classe permettant de g<>rer une base mysql
\version $Id$ \version $Id$
*/ */
// Pour compatibilit<EFBFBD> lors de l'upgrade // For compatibility during upgrade
if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); 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"); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
@@ -33,7 +33,7 @@ if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/a
/** /**
\class DoliDb \class DoliDb
\brief Classe de gestion de la database de dolibarr \brief Classe de gestion de la database de dolibarr
*/ */
class DoliDb class DoliDb
{ {
//! Handler de base //! Handler de base
@@ -46,21 +46,21 @@ class DoliDb
var $forcecollate='latin1_swedish_ci'; var $forcecollate='latin1_swedish_ci';
//! Version min database //! Version min database
var $versionmin=array(3,1,0); var $versionmin=array(3,1,0);
//! Resultset de la derni<6E>re requete //! Resultset of last request
var $results; var $results;
//! 1 si connect<63>, 0 sinon //! 1 si connect<63>, 0 sinon
var $connected; var $connected;
//! 1 si base s<>lectionn<6E>, 0 sinon //! 1 si base s<>lectionn<6E>, 0 sinon
var $database_selected; var $database_selected;
//! Nom base s<>lectionn<6E>e //! Nom base s<>lectionn<6E>e
var $database_name; var $database_name;
//! Nom user base //! Nom user base
var $database_user; var $database_user;
//! 1 si une transaction est en cours, 0 sinon //! 1 si une transaction est en cours, 0 sinon
var $transaction_opened; var $transaction_opened;
//! Derniere requete ex<65>cut<75>e //! Derniere requete ex<65>cut<75>e
var $lastquery; var $lastquery;
//! Derniere requete ex<65>cut<75>e avec echec //! Derniere requete ex<65>cut<75>e avec echec
var $lastqueryerror; var $lastqueryerror;
//! Message erreur mysql //! Message erreur mysql
var $lasterror; var $lasterror;
@@ -71,62 +71,20 @@ class DoliDb
var $error; var $error;
// Constantes pour conversion code erreur MySql en code erreur g<>n<EFBFBD>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 <20>ventuellement une database. \brief Ouverture d'une connexion vers le serveur et <20>ventuellement une database.
\param type Type de base de donn<6E>es (mysql ou pgsql) \param type Type de base de donn<6E>es (mysql ou pgsql)
\param host Addresse de la base de donn<6E>es \param host Addresse de la base de donn<6E>es
\param user Nom de l'utilisateur autoris<69> \param user Nom de l'utilisateur autoris<69>
\param pass Mot de passe \param pass Mot de passe
\param name Nom de la database \param name Nom de la database
\param port Port of database server \param port Port of database server
\return int 1 en cas de succ<63>s, 0 sinon \return int 1 en cas de succ<63>s, 0 sinon
*/ */
function DoliDb($type='mysql', $host, $user, $pass, $name='', $port=0) function DoliDb($type='mysql', $host, $user, $pass, $name='', $port=0)
{ {
global $conf,$langs; 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 <20>t<EFBFBD> charg<72>e puisque cette constante est */
/* definie a partir du contenu du fichier conf.php */
/* Et toutes les infos sont charg<72>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) { if (isset($conf->db->character_set) && $conf->db->character_set) {
$this->forcecharset=$conf->db->character_set; $this->forcecharset=$conf->db->character_set;
} }
@@ -171,7 +129,7 @@ class DoliDb
dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysql_error=".$this->error,LOG_ERR); dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysql_error=".$this->error,LOG_ERR);
} }
// Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base // Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base
if ($this->connected && $name) if ($this->connected && $name)
{ {
if ($this->select_db($name)) if ($this->select_db($name))
@@ -180,8 +138,8 @@ class DoliDb
$this->database_name = $name; $this->database_name = $name;
$this->ok = 1; $this->ok = 1;
// Si client connect<63> avec charset different de celui de la base Dolibarr // Si client connect<63> avec charset different de celui de la base Dolibarr
// (La base Dolibarr a <20>t<EFBFBD> forc<72>e en this->forcecharset <20> l'install) // (La base Dolibarr a <20>t<EFBFBD> forc<72>e en this->forcecharset <20> l'install)
/*if (mysql_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase()) /*if (mysql_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase())
{ {
$this->query("SET NAMES '".$this->forcecharset."'", $this->db); $this->query("SET NAMES '".$this->forcecharset."'", $this->db);
@@ -199,7 +157,7 @@ class DoliDb
} }
else else
{ {
// Pas de selection de base demand<EFBFBD>e, ok ou ko // Pas de selection de base demandee, ok ou ko
$this->database_selected = 0; $this->database_selected = 0;
} }
@@ -207,6 +165,16 @@ class DoliDb
} }
/**
* \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. \brief Selectionne une database.
\param database Nom de la database \param database Nom de la database
@@ -219,12 +187,12 @@ class DoliDb
/** /**
\brief Connection vers le serveur \brief Connection vers le serveur
\param host addresse de la base de donn<6E>es \param host addresse de la base de donn<6E>es
\param login nom de l'utilisateur autoris<69> \param login nom de l'utilisateur autoris<69>
\param passwd mot de passe \param passwd mot de passe
\param name nom de la database (ne sert pas sous mysql, sert sous pgsql) \param name nom de la database (ne sert pas sous mysql, sert sous pgsql)
\param port Port of database server \param port Port of database server
\return resource Handler d'acc<63>s <20> la base \return resource Handler d'acc<63>s <20> la bas
\seealso close \seealso close
*/ */
function connect($host, $login, $passwd, $name, $port=0) function connect($host, $login, $passwd, $name, $port=0)
@@ -237,9 +205,9 @@ class DoliDb
if ($port) $newhost.=':'.$port; if ($port) $newhost.=':'.$port;
$this->db = @mysql_connect($newhost, $login, $passwd); $this->db = @mysql_connect($newhost, $login, $passwd);
//force les enregistrement en latin1 si la base est en utf8 par d<>faut //force les enregistrement en latin1 si la base est en utf8 par d<>faut
// Supprim<69> car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec // Supprim<69> car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
// les nouvelles version de Dolibarr car forc<72> par l'install Dolibarr. // les nouvelles version de Dolibarr car forc<72> par l'install Dolibarr.
if ($this->db) if ($this->db)
{ {
$this->query("SET NAMES '".$this->forcecharset."'", $this->db); $this->query("SET NAMES '".$this->forcecharset."'", $this->db);
@@ -364,7 +332,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 \param query Contenu de la query
\return resource Resultset de la reponse \return resource Resultset de la reponse
*/ */
@@ -374,7 +342,7 @@ class DoliDb
if (! $this->database_name) if (! $this->database_name)
{ {
// Ordre SQL ne n<>cessitant pas de connexion <20> une base (exemple: CREATE DATABASE) // Ordre SQL ne n<>cessitant pas de connexion <20> une base (exemple: CREATE DATABASE)
$ret = mysql_query($query, $this->db); $ret = mysql_query($query, $this->db);
} }
else else
@@ -405,32 +373,32 @@ class DoliDb
*/ */
function fetch_object($resultset=0) function fetch_object($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mysql_fetch_object($resultset); return mysql_fetch_object($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es dans un tableau. \brief Renvoie les donn<6E>es dans un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_array($resultset=0) function fetch_array($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mysql_fetch_array($resultset); return mysql_fetch_array($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es comme un tableau. \brief Renvoie les donn<6E>es comme un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_row($resultset=0) function fetch_row($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return @mysql_fetch_row($resultset); return @mysql_fetch_row($resultset);
} }
@@ -443,7 +411,7 @@ class DoliDb
*/ */
function num_rows($resultset=0) function num_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mysql_num_rows($resultset); return mysql_num_rows($resultset);
} }
@@ -456,7 +424,7 @@ class DoliDb
*/ */
function affected_rows($resultset=0) function affected_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
// mysql necessite un link de base pour cette fonction contrairement // mysql necessite un link de base pour cette fonction contrairement
// a pqsql qui prend un resultset // a pqsql qui prend un resultset
@@ -465,22 +433,22 @@ class DoliDb
/** /**
\brief Lib<69>re le dernier resultset utilis<69> sur cette connexion. \brief Lib<69>re le dernier resultset utilis<69> sur cette connexion.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
*/ */
function free($resultset=0) function free($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } 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)) mysql_free_result($resultset); if (is_resource($resultset)) mysql_free_result($resultset);
} }
/** /**
\brief D<>fini les limites de la requ<71>te. \brief D<>fini les limites de la requ<71>te.
\param limit nombre maximum de lignes retourn<72>es \param limit nombre maximum de lignes retourn<72>es
\param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les lignes \param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les ligne
\return string chaine exprimant la syntax sql de la limite \return string chaine exprimant la syntax sql de la limite
*/ */
function plimit($limit=0,$offset=0) function plimit($limit=0,$offset=0)
@@ -493,7 +461,7 @@ class DoliDb
/** /**
\brief D<>fini le tri de la requ<71>te. \brief D<>fini le tri de la requ<71>te.
\param sortfield liste des champ de tri \param sortfield liste des champ de tri
\param sortorder ordre du tri \param sortorder ordre du tri
\return string chaine exprimant la syntax sql de l'ordre de tri \return string chaine exprimant la syntax sql de l'ordre de tri
@@ -534,9 +502,9 @@ class DoliDb
/** /**
* \brief Formatage (par la base de donn<6E>es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS) * \brief Formatage (par la base de donn<6E>es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS)
* afin de retourner une donn<6E>e toujours au format universel date TMS unix. * afin de retourner une donn<6E>e toujours au format universel date TMS unix.
* Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT. * Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT.
* \param param Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS' * \param param Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS'
* \return date Date au format TMS. * \return date Date au format TMS.
* \TODO Remove unix_timestamp functions * \TODO Remove unix_timestamp functions
@@ -548,8 +516,8 @@ class DoliDb
/** /**
* \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. * \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
* Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT, UPDATE ou les clauses WHERE. * Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT, UPDATE ou les clauses WHERE
* \param param Date TMS <20> convertir * \param param Date TMS <20> convertir
* \return date Date au format texte YYYYMMDDHHMMSS. * \return date Date au format texte YYYYMMDDHHMMSS.
*/ */
function idate($param) function idate($param)
@@ -563,7 +531,7 @@ class DoliDb
\param test chaine test \param test chaine test
\param resok resultat si test egal \param resok resultat si test egal
\param resko resultat si test non egal \param resko resultat si test non egal
\return string chaine format<61> SQL \return string chaine format<61> SQL
*/ */
function ifsql($test,$resok,$resko) function ifsql($test,$resok,$resko)
{ {
@@ -618,7 +586,37 @@ class DoliDb
return 'DB_ERROR_FAILED_TO_CONNECT'; return 'DB_ERROR_FAILED_TO_CONNECT';
} }
else { else {
if (isset($this->errorcode_map[mysql_errno($this->db)])) { // 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)]; return $this->errorcode_map[mysql_errno($this->db)];
} }
$errno=mysql_errno($this->db); $errno=mysql_errno($this->db);
@@ -642,8 +640,8 @@ class DoliDb
} }
/** /**
\brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT. \brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT.
\param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit<69> avec Postgresql \param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit<69> avec Postgresql
\return int id \return int id
*/ */
function last_insert_id($tab) function last_insert_id($tab)
@@ -671,9 +669,9 @@ class DoliDb
/** /**
\brief Cr<43>ation d'une nouvelle base de donn<6E>e \brief Cr<43>ation d'une nouvelle base de donn<6E>e
\param database nom de la database <20> cr<63>er \param database nom de la database <20> cr<63>er
\return resource resource d<>finie si ok, null si ko \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 \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 On force creation de la base avec le charset forcecharset
*/ */
@@ -685,7 +683,7 @@ class DoliDb
$ret=$this->query($sql); $ret=$this->query($sql);
if (! $ret) if (! $ret)
{ {
// On r<>essaie pour compatibilit<69> avec Mysql < 4.1.1 // On r<>essaie pour compatibilit<69> avec Mysql < 4.1.1
$sql = 'CREATE DATABASE '.$database; $sql = 'CREATE DATABASE '.$database;
$ret=$this->query($sql); $ret=$this->query($sql);
} }
@@ -695,7 +693,7 @@ class DoliDb
/** /**
\brief Liste des tables dans une database. \brief Liste des tables dans une database.
\param database Nom de la database \param database Nom de la database
\param table Filtre sur tables <20> rechercher \param table Filtre sur tables <20> rechercher
\return array Tableau des tables de la base \return array Tableau des tables de la base
*/ */
function DDLListTables($database, $table='') function DDLListTables($database, $table='')
@@ -715,19 +713,19 @@ class DoliDb
} }
/** /**
\brief Cr<43>e une table \brief Cr<43>e une table
\param table Nom de la table \param table Nom de la table
\param fields Tableau associatif [nom champ][tableau des descriptions] \param fields Tableau associatif [nom champ][tableau des descriptions]
\param primary_key Nom du champ qui sera la clef primaire \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 unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur
\param fulltext Tableau des Nom de champs qui seront index<65>s en fulltext \param fulltext Tableau des Nom de champs qui seront index<65>s en fulltext
\param key Tableau des champs cl<63>s noms => valeur \param key Tableau des champs cl<63>s noms => valeur
\param type Type de la table \param type Type de la table
\return int <0 si KO, >=0 si OK \return int <0 si KO, >=0 si OK
*/ */
function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="") function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
{ {
// cl<63>s recherch<63>es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra // cl<63>s recherch<63>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'); // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql = "create table ".$table."("; $sql = "create table ".$table."(";
$i=0; $i=0;
@@ -791,7 +789,7 @@ class DoliDb
} }
/** /**
\brief d<>crit une table dans une database. \brief d<>crit une table dans une database.
\param table Nom de la table \param table Nom de la table
\param field Optionnel : Nom du champ si l'on veut la desc d'un champ \param field Optionnel : Nom du champ si l'on veut la desc d'un champ
\return resource \return resource
@@ -806,16 +804,16 @@ class DoliDb
} }
/** /**
\brief Ins<6E>re un nouveau champ dans une table \brief Ins<6E>re un nouveau champ dans une table
\param table Nom de la table \param table Nom de la table
\param field_name Nom du champ <20> ins<6E>rer \param field_name Nom du champ <20> ins<6E>rer
\param field_desc Tableau associatif de description duchamp <20> ins<6E>rer[nom du param<61>tre][valeur du param<61>tre] \param field_desc Tableau associatif de description duchamp <20> ins<6E>rer[nom du param<61>tre][valeur du param<61>tre]
\param field_position Optionnel ex.: "after champtruc" \param field_position Optionnel ex.: "after champtruc"
\return int <0 si KO, >0 si OK \return int <0 si KO, >0 si OK
*/ */
function DDLAddField($table,$field_name,$field_desc,$field_position="") function DDLAddField($table,$field_name,$field_desc,$field_position="")
{ {
// cl<63>s recherch<63>es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra // cl<63>s recherch<63>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'); // ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql= "ALTER TABLE ".$table." ADD ".$field_name." "; $sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
$sql .= $field_desc['type']; $sql .= $field_desc['type'];
@@ -844,8 +842,8 @@ class DoliDb
/** /**
\brief Create a user \brief Create a user
\param dolibarr_main_db_host Ip serveur \param dolibarr_main_db_host Ip serveur
\param dolibarr_main_db_user Nom user <20> cr<63>er \param dolibarr_main_db_user Nom user <20> cr<63>er
\param dolibarr_main_db_pass Mot de passe user <20> cr<63>er \param dolibarr_main_db_pass Mot de passe user <20> cr<63>er
\param dolibarr_main_db_name Database name where user must be granted \param dolibarr_main_db_name Database name where user must be granted
\return int <0 si KO, >=0 si OK \return int <0 si KO, >=0 si OK
*/ */

View File

@@ -22,18 +22,18 @@
/** /**
\file htdocs/lib/databases/mysqli.lib.php \file htdocs/lib/databases/mysqli.lib.php
\brief Fichier de la classe permettant de g<>rer une base mysql \brief Fichier de la classe permettant de g<>rer une base mysql
\version $Id$ \version $Id$
*/ */
// Pour compatibilit<69> lors de l'upgrade // Pour compatibilit<69> lors de l'upgrade
if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); 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"); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
/** /**
\class DoliDb \class DoliDb
\brief Classe permettant de g<>r<EFBFBD>r la database de dolibarr \brief Classe permettant de g<>r<EFBFBD>r la database de dolibarr
*/ */
class DoliDb class DoliDb
{ {
//! Handler de base //! Handler de base
@@ -46,21 +46,21 @@ class DoliDb
var $forcecollate='latin1_swedish_ci'; var $forcecollate='latin1_swedish_ci';
//! Version min database //! Version min database
var $versionmin=array(4,1,0); var $versionmin=array(4,1,0);
//! Resultset de la derni<6E>re requete //! Resultset de la derni<6E>re requete
var $results; var $results;
//! 1 si connect<63>, 0 sinon //! 1 si connect<63>, 0 sinon
var $connected; var $connected;
//! 1 si base s<>lectionn<6E>, 0 sinon //! 1 si base s<>lectionn<6E>, 0 sinon
var $database_selected; var $database_selected;
//! Nom base s<>lectionn<6E>e //! Nom base s<>lectionn<6E>e
var $database_name; var $database_name;
//! Nom user base //! Nom user base
var $database_user; var $database_user;
//! 1 si une transaction est en cours, 0 sinon //! 1 si une transaction est en cours, 0 sinon
var $transaction_opened; var $transaction_opened;
//! Derniere requete ex<65>cut<75>e //! Derniere requete ex<65>cut<75>e
var $lastquery; var $lastquery;
//! Derniere requete ex<65>cut<75>e avec echec //! Derniere requete ex<65>cut<75>e avec echec
var $lastqueryerror; var $lastqueryerror;
//! Message erreur mysql //! Message erreur mysql
var $lasterror; var $lasterror;
@@ -70,62 +70,21 @@ class DoliDb
var $ok; var $ok;
var $error; var $error;
// Constantes pour conversion code erreur MySql en code erreur g<>n<EFBFBD>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 <20>ventuellement une database. \brief Ouverture d'une connexion vers le serveur et <20>ventuellement une database.
\param type Type de base de donn<6E>es (mysql ou pgsql) \param type Type de base de donn<6E>es (mysql ou pgsql)
\param host Addresse de la base de donn<6E>es \param host Addresse de la base de donn<6E>es
\param user Nom de l'utilisateur autoris<69> \param user Nom de l'utilisateur autoris<69>
\param pass Mot de passe \param pass Mot de passe
\param name Nom de la database \param name Nom de la database
\param port Port of database server \param port Port of database server
\return int 1 en cas de succ<63>s, 0 sinon \return int 1 en cas de succ<63>s, 0 sinon
*/ */
function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0) function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0)
{ {
global $conf,$langs; 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 <20>t<EFBFBD> charg<72>e puisque cette constante est */
/* definie a partir du contenu du fichier conf.php */
/* Et toutes les infos sont charg<72>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) { if (isset($conf->db->character_set) && $conf->db->character_set) {
$this->forcecharset=$conf->db->character_set; $this->forcecharset=$conf->db->character_set;
} }
@@ -173,7 +132,7 @@ class DoliDb
dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysqli_connect_error=".$this->error,LOG_ERR); dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysqli_connect_error=".$this->error,LOG_ERR);
} }
// Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base // Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base
if ($this->connected && $name) if ($this->connected && $name)
{ {
if ($this->select_db($name)) if ($this->select_db($name))
@@ -182,7 +141,7 @@ class DoliDb
$this->database_name = $name; $this->database_name = $name;
$this->ok = 1; $this->ok = 1;
// Si client connect<63> avec charset different de celui de Dolibarr // Si client connect<63> avec charset different de celui de Dolibarr
/*if (mysqli_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase()) /*if (mysqli_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase())
{ {
$this->query("SET NAMES '".$this->forcecharset."'", $this->db); $this->query("SET NAMES '".$this->forcecharset."'", $this->db);
@@ -200,7 +159,7 @@ class DoliDb
} }
else else
{ {
// Pas de selection de base demand<EFBFBD>e, ok ou ko // Pas de selection de base demandee, ok ou ko
$this->database_selected = 0; $this->database_selected = 0;
} }
@@ -208,6 +167,16 @@ class DoliDb
} }
/**
* \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. \brief Selectionne une database.
\param database Nom de la database \param database Nom de la database
@@ -221,12 +190,12 @@ class DoliDb
/** /**
\brief Connection vers le serveur \brief Connection vers le serveur
\param host addresse de la base de donn<6E>es \param host addresse de la base de donn<6E>es
\param login nom de l'utilisateur autoris<69> \param login nom de l'utilisateur autoris<69>
\param passwd mot de passe \param passwd mot de passe
\param name nom de la database (ne sert pas sous mysql, sert sous pgsql) \param name nom de la database (ne sert pas sous mysql, sert sous pgsql)
\param port Port of database server \param port Port of database server
\return resource handler d'acc<63>s <20> la base \return resource handler d'acc<63>s <20> la bas
\seealso close \seealso close
*/ */
function connect($host, $login, $passwd, $name, $port=0) function connect($host, $login, $passwd, $name, $port=0)
@@ -240,9 +209,9 @@ class DoliDb
if (! $newport) $newport=3306; if (! $newport) $newport=3306;
$this->db = @mysqli_connect($newhost, $login, $passwd, $name, $newport); $this->db = @mysqli_connect($newhost, $login, $passwd, $name, $newport);
//force les enregistrement en latin1 si la base est en utf8 par d<>faut //force les enregistrement en latin1 si la base est en utf8 par d<>faut
// Supprim<69> car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec // Supprim<69> car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
// les nouvelles version de Dolibarr car forc<72> par l'install Dolibarr. // les nouvelles version de Dolibarr car forc<72> par l'install Dolibarr.
//$this->query('SET NAMES '.$this->forcecharset); //$this->query('SET NAMES '.$this->forcecharset);
//print "Resultat fonction connect: ".$this->db; //print "Resultat fonction connect: ".$this->db;
if ($this->db) if ($this->db)
@@ -259,9 +228,9 @@ class DoliDb
*/ */
function getVersion() function getVersion()
{ {
// $resql=$this->query('SELECT VERSION()'); // $resql=$this->query('SELECT VERSION()');
// $row=$this->fetch_row($resql); // $row=$this->fetch_row($resql);
// return $row[0]; // return $row[0];
return mysqli_get_server_info($this->db); return mysqli_get_server_info($this->db);
} }
@@ -370,7 +339,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 \param query Contenu de la query
\return resource Resultset de la reponse \return resource Resultset de la reponse
*/ */
@@ -379,7 +348,7 @@ class DoliDb
$query = trim($query); $query = trim($query);
if (! $this->database_name) if (! $this->database_name)
{ {
// Ordre SQL ne n<>cessitant pas de connexion <20> une base (exemple: CREATE DATABASE // Ordre SQL ne n<>cessitant pas de connexion <20> une base (exemple: CREATE DATABASE
$ret = mysqli_query($this->db,$query); $ret = mysqli_query($this->db,$query);
} }
else else
@@ -410,34 +379,34 @@ class DoliDb
*/ */
function fetch_object($resultset=0) function fetch_object($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; } if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_fetch_object($resultset); return mysqli_fetch_object($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es dans un tableau. \brief Renvoie les donn<6E>es dans un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_array($resultset=0) function fetch_array($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; } if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_fetch_array($resultset); return mysqli_fetch_array($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es comme un tableau. \brief Renvoie les donn<6E>es comme un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_row($resultset=0) function fetch_row($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_bool($resultset)) if (! is_bool($resultset))
{ {
if (! is_object($resultset)) { $resultset=$this->results; } if (! is_object($resultset)) { $resultset=$this->results; }
@@ -445,7 +414,7 @@ class DoliDb
} }
else else
{ {
// si le curseur est un bool<6F>en on retourne la valeur 0 // si le curseur est un bool<6F>en on retourne la valeur 0
return 0; return 0;
} }
} }
@@ -458,7 +427,7 @@ class DoliDb
*/ */
function num_rows($resultset=0) function num_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; } if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_num_rows($resultset); return mysqli_num_rows($resultset);
} }
@@ -472,7 +441,7 @@ class DoliDb
function affected_rows($resultset=0) function affected_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; } if (! is_object($resultset)) { $resultset=$this->results; }
// mysql necessite un link de base pour cette fonction contrairement // mysql necessite un link de base pour cette fonction contrairement
// a pqsql qui prend un resultset // a pqsql qui prend un resultset
@@ -481,22 +450,22 @@ class DoliDb
/** /**
\brief Lib<69>re le dernier resultset utilis<69> sur cette connexion. \brief Lib<69>re le dernier resultset utilis<69> sur cette connexion.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
*/ */
function free($resultset=0) function free($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; } if (! is_object($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_object($resultset)) mysqli_free_result($resultset); if (is_object($resultset)) mysqli_free_result($resultset);
} }
/** /**
\brief D<>fini les limites de la requ<71>te. \brief D<>fini les limites de la requ<71>te.
\param limit nombre maximum de lignes retourn<72>es \param limit nombre maximum de lignes retourn<72>es
\param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les lignes \param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les ligne
\return string chaine exprimant la syntax sql de la limite \return string chaine exprimant la syntax sql de la limite
*/ */
function plimit($limit=0,$offset=0) function plimit($limit=0,$offset=0)
@@ -509,7 +478,7 @@ class DoliDb
/** /**
\brief D<>fini le tri de la requ<71>te. \brief D<>fini le tri de la requ<71>te.
\param sortfield liste des champ de tri \param sortfield liste des champ de tri
\param sortorder ordre du tri \param sortorder ordre du tri
\return string chaine exprimant la syntax sql de l'ordre de tri \return string chaine exprimant la syntax sql de l'ordre de tri
@@ -550,10 +519,10 @@ class DoliDb
/** /**
* \brief Formatage (par la base de donn<6E>es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS) * \brief Formatage (par la base de donn<6E>es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
* afin de retourner une donn<6E>e toujours au format universel date tms unix. * afin de retourner une donn<6E>e toujours au format universel date tms unix.
* Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT. * Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT.
* \param param Date au format text <20> convertir * \param param Date au format text <20> convertir
* \return date Date au format tms. * \return date Date au format tms.
* \TODO Remove unix_timestamp functions * \TODO Remove unix_timestamp functions
*/ */
@@ -564,8 +533,8 @@ class DoliDb
/** /**
* \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date. * \brief Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
* Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT, UPDATE ou les clauses WHERE. * Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT, UPDATE ou les clauses WHERE
* \param param Date tms <20> convertir * \param param Date tms <20> convertir
* \return date Date au format text YYYYMMDDHHMMSS. * \return date Date au format text YYYYMMDDHHMMSS.
*/ */
function idate($param) function idate($param)
@@ -579,7 +548,7 @@ class DoliDb
\param test chaine test \param test chaine test
\param resok resultat si test egal \param resok resultat si test egal
\param resko resultat si test non egal \param resko resultat si test non egal
\return string chaine format<61> SQL \return string chaine format<61> SQL
*/ */
function ifsql($test,$resok,$resko) function ifsql($test,$resok,$resko)
{ {
@@ -634,7 +603,37 @@ class DoliDb
return 'DB_ERROR_FAILED_TO_CONNECT'; return 'DB_ERROR_FAILED_TO_CONNECT';
} }
else { else {
if (isset($this->errorcode_map[mysqli_errno($this->db)])) { // 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)]; return $this->errorcode_map[mysqli_errno($this->db)];
} }
$errno=mysqli_errno($this->db); $errno=mysqli_errno($this->db);
@@ -658,8 +657,8 @@ class DoliDb
} }
/** /**
\brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT. \brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT.
\param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit<69> avec Postgresql \param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit<69> avec Postgresql
\return int id \return int id
*/ */
function last_insert_id($tab) function last_insert_id($tab)
@@ -687,9 +686,9 @@ class DoliDb
/** /**
\brief Cr<43>ation d'une nouvelle base de donn<6E>e \brief Cr<43>ation d'une nouvelle base de donn<6E>e
\param database nom de la database <20> cr<63>er \param database nom de la database <20> cr<63>er
\return resource resource d<>finie si ok, null si ko \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 \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
*/ */
function DDLCreateDb($database) function DDLCreateDb($database)
@@ -700,7 +699,7 @@ class DoliDb
$ret=$this->query($sql); $ret=$this->query($sql);
if (! $ret) if (! $ret)
{ {
// On r<>essaie pour compatibilit<69> avec Mysql < 4.1.1 // On r<>essaie pour compatibilit<69> avec Mysql < 4.1.1
$sql = 'CREATE DATABASE '.$database; $sql = 'CREATE DATABASE '.$database;
$ret=$this->query($sql); $ret=$this->query($sql);
} }
@@ -710,7 +709,7 @@ class DoliDb
/** /**
\brief Liste des tables dans une database. \brief Liste des tables dans une database.
\param database Nom de la database \param database Nom de la database
\param table Filtre sur tables <20> rechercher \param table Filtre sur tables <20> rechercher
\return array Tableau des tables de la base \return array Tableau des tables de la base
*/ */
function DDLListTables($database, $table='') function DDLListTables($database, $table='')
@@ -730,19 +729,19 @@ class DoliDb
} }
/** /**
\brief Cr<43>e une table \brief Cr<43>e une table
\param table Nom de la table \param table Nom de la table
\param fields Tableau associatif [nom champ][tableau des descriptions] \param fields Tableau associatif [nom champ][tableau des descriptions]
\param primary_key Nom du champ qui sera la clef primaire \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 unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur
\param fulltext Tableau des Nom de champs qui seront index<65>s en fulltext \param fulltext Tableau des Nom de champs qui seront index<65>s en fulltext
\param key Tableau des champs cl<63>s noms => valeur \param key Tableau des champs cl<63>s noms => valeur
\param type Type de la table \param type Type de la table
\return int <0 si KO, >=0 si OK \return int <0 si KO, >=0 si OK
*/ */
function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="") function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
{ {
// cl<63>s recherch<63>es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra // cl<63>s recherch<63>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'); // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql = "create table ".$table."("; $sql = "create table ".$table."(";
$i=0; $i=0;
@@ -806,7 +805,7 @@ class DoliDb
} }
/** /**
\brief d<>crit une table dans une database. \brief d<>crit une table dans une database.
\param table Nom de la table \param table Nom de la table
\param field Optionnel : Nom du champ si l'on veut la desc d'un champ \param field Optionnel : Nom du champ si l'on veut la desc d'un champ
\return resource \return resource
@@ -821,16 +820,16 @@ class DoliDb
} }
/** /**
\brief Ins<6E>re un nouveau champ dans une table \brief Ins<6E>re un nouveau champ dans une table
\param table Nom de la table \param table Nom de la table
\param field_name Nom du champ <20> ins<6E>rer \param field_name Nom du champ <20> ins<6E>rer
\param field_desc Tableau associatif de description duchamp <20> ins<6E>rer[nom du param<61>tre][valeur du param<61>tre] \param field_desc Tableau associatif de description duchamp <20> ins<6E>rer[nom du param<61>tre][valeur du param<61>tre]
\param field_position Optionnel ex.: "after champtruc" \param field_position Optionnel ex.: "after champtruc"
\return int <0 si KO, >0 si OK \return int <0 si KO, >0 si OK
*/ */
function DDLAddField($table,$field_name,$field_desc,$field_position="") function DDLAddField($table,$field_name,$field_desc,$field_position="")
{ {
// cl<63>s recherch<63>es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra // cl<63>s recherch<63>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'); // ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql= "ALTER TABLE ".$table." ADD ".$field_name." "; $sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
$sql .= $field_desc['type']; $sql .= $field_desc['type'];
@@ -858,8 +857,8 @@ class DoliDb
/** /**
\brief Create a user \brief Create a user
\param dolibarr_main_db_host Ip serveur \param dolibarr_main_db_host Ip serveur
\param dolibarr_main_db_user Nom user <20> cr<63>er \param dolibarr_main_db_user Nom user <20> cr<63>er
\param dolibarr_main_db_pass Mot de passe user <20> cr<63>er \param dolibarr_main_db_pass Mot de passe user <20> cr<63>er
\param dolibarr_main_db_name Database name where user must be granted \param dolibarr_main_db_name Database name where user must be granted
\return int <0 si KO, >=0 si OK \return int <0 si KO, >=0 si OK
*/ */

View File

@@ -22,17 +22,17 @@
/** /**
\file htdocs/lib/databases/pgsql.lib.php \file htdocs/lib/databases/pgsql.lib.php
\brief Fichier de la classe permettant de g<>r<EFBFBD>r une base pgsql \brief Fichier de la classe permettant de g<>r<EFBFBD>r une base pgsql
\version $Id$ \version $Id$
*/ */
// Pour compatibilit<EFBFBD> lors de l'upgrade // For compatibility during upgrade
if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); 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"); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
/** /**
\class DoliDb \class DoliDb
\brief Classe permettant de g<>r<EFBFBD>r la database de dolibarr \brief Classe permettant de g<>r<EFBFBD>r la database de dolibarr
*/ */
class DoliDb class DoliDb
{ {
@@ -42,11 +42,11 @@ class DoliDb
var $forcecharset='latin1'; var $forcecharset='latin1';
var $versionmin=array(8,1,0); // Version min database var $versionmin=array(8,1,0); // Version min database
var $results; // Resultset de la derni<6E>re requete var $results; // Resultset de la derni<6E>re requete
var $connected; // 1 si connect<63>, 0 sinon var $connected; // 1 si connect<63>, 0 sinon
var $database_selected; // 1 si base s<>lectionn<6E>, 0 sinon var $database_selected; // 1 si base s<>lectionn<6E>, 0 sinon
var $database_name; // Nom base s<>lectionn<6E>e var $database_name; // Nom base s<>lectionn<6E>e
var $database_user; //! Nom user base var $database_user; //! Nom user base
var $transaction_opened; // 1 si une transaction est en cours, 0 sinon var $transaction_opened; // 1 si une transaction est en cours, 0 sinon
var $lastquery; var $lastquery;
@@ -60,30 +60,18 @@ class DoliDb
/** /**
\brief Ouverture d'une connexion vers le serveur et une database. \brief Ouverture d'une connexion vers le serveur et une database.
\param type type de base de donn<6E>es (mysql ou pgsql) \param type type de base de donn<6E>es (mysql ou pgsql)
\param host addresse de la base de donn<6E>es \param host addresse de la base de donn<6E>es
\param user nom de l'utilisateur autoris<69> \param user nom de l'utilisateur autoris<69>
\param pass mot de passe \param pass mot de passe
\param name nom de la database \param name nom de la database
\param port Port of database server \param port Port of database server
\return int 1 en cas de succ<63>s, 0 sinon \return int 1 en cas de succ<63>s, 0 sinon
*/ */
function DoliDb($type='pgsql', $host, $user, $pass, $name='', $port=0) function DoliDb($type='pgsql', $host, $user, $pass, $name='', $port=0)
{ {
global $conf,$langs; 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 <20>t<EFBFBD> charg<72>e puisque cette constante est */
/* definie a partir du contenu du fichier conf.php */
/* Et toutes les infos sont charg<72>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->forcecharset=$conf->character_set_client;
$this->forcecollate=$conf->db->dolibarr_main_db_collation; $this->forcecollate=$conf->db->dolibarr_main_db_collation;
$this->database_user=$user; $this->database_user=$user;
@@ -127,7 +115,7 @@ class DoliDb
dolibarr_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR); dolibarr_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR);
} }
// Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base // Si connexion serveur ok et si connexion base demand<6E>e, on essaie connexion base
if ($this->connected && $name) if ($this->connected && $name)
{ {
if ($this->select_db($name)) if ($this->select_db($name))
@@ -147,19 +135,30 @@ class DoliDb
} }
else else
{ {
// Pas de selection de base demand<EFBFBD>e, ok ou ko // Pas de selection de base demandee, ok ou ko
$this->database_selected = 0; $this->database_selected = 0;
} }
return $this->ok; 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. \brief Selectionne une database.
\param database nom de la database \param database nom de la database
\return boolean true si ok, false si ko \return boolean true si ok, false si ko
\remarks Ici postgresql n'a aucune fonction equivalente de mysql_select_db \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<69>e par la connexion \remarks On compare juste manuellement si la database choisie est bien celle activ<69>e par la connexion
*/ */
function select_db($database) function select_db($database)
{ {
@@ -171,12 +170,12 @@ class DoliDb
/** /**
\brief Connection vers le serveur \brief Connection vers le serveur
\param host addresse de la base de donn<6E>es \param host addresse de la base de donn<6E>es
\param login nom de l'utilisateur autoris \param login nom de l'utilisateur autoris
\param passwd mot de passe \param passwd mot de passe
\param name nom de la database (ne sert pas sous mysql, sert sous pgsql) \param name nom de la database (ne sert pas sous mysql, sert sous pgsql)
\param port Port of database server \param port Port of database server
\return resource handler d'acc<63>s <20> la base \return resource handler d'acc<63>s <20> la base
*/ */
function connect($host, $login, $passwd, $name, $port=0) 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 \param query Contenu de la query
\return resource Resultset de la reponse \return resource Resultset de la reponse
*/ */
@@ -343,31 +342,31 @@ class DoliDb
*/ */
function fetch_object($resultset=0) function fetch_object($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_fetch_object($resultset); return pg_fetch_object($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es dans un tableau. \brief Renvoie les donn<6E>es dans un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_array($resultset=0) function fetch_array($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_fetch_array($resultset); return pg_fetch_array($resultset);
} }
/** /**
\brief Renvoie les donn<6E>es comme un tableau. \brief Renvoie les donn<6E>es comme un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_row($resultset=0) function fetch_row($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_fetch_row($resultset); return pg_fetch_row($resultset);
} }
@@ -380,7 +379,7 @@ class DoliDb
*/ */
function num_rows($resultset=0) function num_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_num_rows($resultset); return pg_num_rows($resultset);
} }
@@ -393,7 +392,7 @@ class DoliDb
*/ */
function affected_rows($resultset=0) function affected_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } if (! is_resource($resultset)) { $resultset=$this->results; }
// pgsql necessite un resultset pour cette fonction contrairement // pgsql necessite un resultset pour cette fonction contrairement
// a mysql qui prend un link de base // a mysql qui prend un link de base
@@ -402,22 +401,22 @@ class DoliDb
/** /**
\brief Lib<69>re le dernier resultset utilis<69> sur cette connexion. \brief Lib<69>re le dernier resultset utilis<69> sur cette connexion.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
*/ */
function free($resultset=0) function free($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilis<69> sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; } 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); if (is_resource($resultset)) pg_free_result($resultset);
} }
/** /**
\brief D<>fini les limites de la requ<71>te. \brief D<>fini les limites de la requ<71>te.
\param limit nombre maximum de lignes retourn<72>es \param limit nombre maximum de lignes retourn<72>es
\param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les lignes \param offset num<75>ro de la ligne <20> partir de laquelle recup<75>rer les lignes
\return string chaine exprimant la syntax sql de la limite \return string chaine exprimant la syntax sql de la limite
*/ */
function plimit($limit=0,$offset=0) function plimit($limit=0,$offset=0)
@@ -430,7 +429,7 @@ class DoliDb
/** /**
\brief D<>fini le tri de la requ<71>te. \brief D<>fini le tri de la requ<71>te.
\param sortfield liste des champ de tri \param sortfield liste des champ de tri
\param sortorder ordre du tri \param sortorder ordre du tri
\return string chaine exprimant la syntax sql de l'ordre de 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<6E>es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS) * \brief Formatage (par la base de donn<6E>es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
* afin de retourner une donn<6E>e toujours au format universel date tms unix. * afin de retourner une donn<6E>e toujours au format universel date tms unix.
* Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT. * Fonction <20> utiliser pour g<>n<EFBFBD>rer les SELECT.
* \param param Date au format text <20> convertir * \param param Date au format text <20> convertir
* \return date Date au format tms. * \return date Date au format tms.
*/ */
function pdate($param) function pdate($param)
@@ -484,8 +483,8 @@ class DoliDb
/** /**
\brief Formatage (par PHP) de la date en texte qui s'insere dans champ date. \brief Formatage (par PHP) de la date en texte qui s'insere dans champ date.
Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT. Fonction <20> utiliser pour g<>n<EFBFBD>rer les INSERT.
\param param Date tms <20> convertir \param param Date tms <20> convertir
\return date Date au format text YYYYMMDDHHMMSS. \return date Date au format text YYYYMMDDHHMMSS.
*/ */
function idate($param) function idate($param)
@@ -499,7 +498,7 @@ class DoliDb
\param test chaine test \param test chaine test
\param resok resultat si test egal \param resok resultat si test egal
\param resko resultat si test non egal \param resko resultat si test non egal
\return string chaine format<61> SQL \return string chaine format<61> SQL
*/ */
function ifsql($test,$resok,$resko) function ifsql($test,$resok,$resko)
{ {
@@ -549,8 +548,8 @@ class DoliDb
*/ */
function errno() function errno()
{ {
static $error_regexps; if (empty($error_regexps))
if (empty($error_regexps)) { {
$error_regexps = array( $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\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => 'DB_ERROR_NOSUCHTABLE',
'/table [\"\'].*[\"\'] does not exist/' => 'DB_ERROR_NOSUCHTABLE', '/table [\"\'].*[\"\'] does not exist/' => 'DB_ERROR_NOSUCHTABLE',
@@ -581,8 +580,8 @@ class DoliDb
} }
/** /**
\brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT. \brief R<>cup<75>re l'id gen<65>r<EFBFBD> par le dernier INSERT.
\param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit<69> avec Postgresql \param tab Nom de la table concern<72>e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit<69> avec Postgresql
\return int id \return int id
*/ */
function last_insert_id($tab) function last_insert_id($tab)
@@ -609,9 +608,9 @@ class DoliDb
/** /**
\brief Cr<43>ation d'une nouvelle base de donn<6E>e \brief Cr<43>ation d'une nouvelle base de donn<6E>e
\param database nom de la database <20> cr<63>er \param database nom de la database <20> cr<63>er
\return resource resource d<>finie si ok, null si ko \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 \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
*/ */
function DDLCreateDb($database) function DDLCreateDb($database)
@@ -635,8 +634,8 @@ class DoliDb
/** /**
\brief Create a user \brief Create a user
\param dolibarr_main_db_host Ip serveur \param dolibarr_main_db_host Ip serveur
\param dolibarr_main_db_user Nom user <20> cr<63>er \param dolibarr_main_db_user Nom user <20> cr<63>er
\param dolibarr_main_db_pass Mot de passe user <20> cr<63>er \param dolibarr_main_db_pass Mot de passe user <20> cr<63>er
\param dolibarr_main_db_name Database name where user must be granted \param dolibarr_main_db_name Database name where user must be granted
\return int <0 si KO, >=0 si OK \return int <0 si KO, >=0 si OK
*/ */