Amélioration des gestionnaires de bases: Meilleur commentaire et les fonctions qui nécessitent un resultset peuvent le recevoir en paramètre.

This commit is contained in:
Laurent Destailleur 2005-01-23 01:47:51 +00:00
parent 644e0c7039
commit 830137f270
2 changed files with 857 additions and 838 deletions

View File

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

View File

@ -25,486 +25,495 @@
*/ */
/** \file htdocs/lib/pgsql.lib.php /** \file htdocs/lib/pgsql.lib.php
\brief Classe permettant de gérér la database de dolibarr. \brief Fichier de la classe permettant de gérér la database de dolibarr.
\author Fabien Seisen \author Fabien Seisen
\author Rodolphe Quiedeville. \author Rodolphe Quiedeville.
\author Laurent Destailleur. \author Laurent Destailleur.
\author Sébastien Di Cintio \author Sébastien Di Cintio
\author Benoit Mortier \author Benoit Mortier
\version $Revision$ \version $Revision$
Ensemble des fonctions permettant de gérer la database de dolibarr.
*/ */
/** \class DoliDb /** \class DoliDb
\brief Classe permettant de gérér la database de dolibarr \brief Classe permettant de gérér la database de dolibarr
Ensemble des fonctions permettant de gérer la database de dolibarr
*/ */
class DoliDb class DoliDb
{ {
var $db, $results, $ok, $connected, $database_selected; var $db; // Handler de base
var $results; // Resultset de la dernière requete
// Constantes pour code erreurs
var $ERROR_DUPLICATE="23505"; var $connected; // 1 si connecté, 0 sinon
var $ERROR_TABLEEXISTS='42P07'; var $database_selected; // 1 si base sélectionné, 0 sinon
var $transaction_opened; // 1 si une transaction est en cours, 0 sinon
/**
\brief Ouverture d'une connection vers le serveur et une database. var $ok;
\param type type de base de données (mysql ou pgsql)
\param host addresse de la base de données // Constantes pour code erreurs
\param user nom de l'utilisateur autorisé var $ERROR_DUPLICATE="23505";
\param pass mot de passe var $ERROR_TABLEEXISTS='42P07';
\param name nom de la database
\return int 1 en cas de succès, 0 sinon /**
*/ \brief Ouverture d'une connection vers le serveur et une database.
\param type type de base de données (mysql ou pgsql)
function DoliDb($type = 'pgsql', $host = '', $user = '', $pass = '', $name = '') \param host addresse de la base de données
{ \param user nom de l'utilisateur autorisé
global $conf; \param pass mot de passe
\param name nom de la database
if ($host == '') \return int 1 en cas de succès, 0 sinon
{ */
$host = $conf->db->host; function DoliDb($type = 'pgsql', $host = '', $user = '', $pass = '', $name = '')
}
if ($user == '')
{
$user = $conf->db->user;
}
if ($pass == '')
{
$pass = $conf->db->pass;
}
if ($name == '')
{
$name = $conf->db->name;
}
//print "Name DB: $host,$user,$pass,$name<br>";
// Essai connexion serveur
$this->db = $this->connect($host, $user, $pass,$name);
if ($this->db)
{
$this->connected = 1;
$this->ok = 1;
}
else
{
$this->connected = 0;
$this->ok = 0;
}
// Si connexion serveur ok et si connexion base demandée, on essaie connexion base
if ($this->connected && $name)
{
if ($this->select_db($name) == 1)
{
$this->database_selected = 1;
$this->ok = 1;
}
else
{
$this->database_selected = 0;
$this->ok = 0;
}
}
else
{
// Pas de selection de base demandée, ok ou ko
$this->database_selected = 0;
}
return $this->ok;
}
/**
\brief Selectionne une database.
\param database nom de la database
\return resource
\remarks ici postgresql n'a aucune fonction equivalente de mysql_select_db
\remarks comparaison manuel si la database est bien celle choisie par l'utilisateur
\remarks en cas de succes renverra 1 ou 0
*/
function select_db($database)
{ {
if($database == "dolibarr") global $conf;
return 1; $this->transaction_opened=0;
else
return 0; if ($host == '') $host = $conf->db->host;
if ($user == '') $user = $conf->db->user;
if ($pass == '') $pass = $conf->db->pass;
if ($name == '') $name = $conf->db->name;
//print "Name DB: $host,$user,$pass,$name<br>";
// Essai connexion serveur
$this->db = $this->connect($host, $user, $pass, $name);
if ($this->db)
{
$this->connected = 1;
$this->ok = 1;
}
else
{
$this->connected = 0;
$this->ok = 0;
}
// Si connexion serveur ok et si connexion base demandée, on essaie connexion base
if ($this->connected && $name)
{
if ($this->select_db($name) == 1)
{
$this->database_selected = 1;
$this->ok = 1;
}
else
{
$this->database_selected = 0;
$this->ok = 0;
}
}
else
{
// Pas de selection de base demandée, ok ou ko
$this->database_selected = 0;
}
return $this->ok;
} }
/** /**
\brief Connection vers le serveur \brief Selectionne une database.
\param host addresse de la base de données \param database nom de la database
\param login nom de l'utilisateur autorisé \return resource
\param passwd mot de passe \remarks ici postgresql n'a aucune fonction equivalente de mysql_select_db
\param name nom de la database \remarks comparaison manuel si la database est bien celle choisie par l'utilisateur
\return resource handler d'accès à la base \remarks en cas de succes renverra 1 ou 0
*/ */
function connect($host, $login, $passwd, $name) function select_db($database)
{ {
$con_string = "host=$host dbname=$name user=$login password=$passwd "; if($database == "dolibarr")
$this->db = pg_connect($con_string); return 1;
return $this->db; else
return 0;
} }
/** /**
\brief Connexion sur une base de donnée \brief Connection vers le serveur
\param database nom de la database \param host addresse de la base de données
\return result resultat 1 pour ok, 0 pour non ok \param login nom de l'utilisateur autoris
*/ \param passwd mot de passe
\param name nom de la database
function create_db($database) \return resource handler d'accès à la base
{ */
if(createdb($database,$this->db))
return 1; function connect($host, $login, $passwd, $name)
else
return 0;
}
/**
\brief Copie d'une database.
\return resource
*/
function clone()
{ {
$db2 = new DoliDb("", "", "", "", ""); $con_string = "host=$host dbname=$name user=$login password=$passwd ";
$db2->db = $this->db; $this->db = pg_connect($con_string);
return $db2; return $this->db;
} }
/** /**
\brief Ouverture d'une connection vers une database. \brief Connexion sur une base de donnée
\param host addresse de la base de données \param database nom de la database
\param login nom de l'utilisateur autorisé \return result resultat 1 pour ok, 0 pour non ok
\param passwd mot de passe */
\param name nom de la database
\return resource handler d'accès à la base function create_db($database)
*/
function pconnect($host, $login, $passwd,$name)
{ {
$con_string = "host=$host dbname=$name user=$login password=$passwd"; if(createdb($database, $this->db))
$this->db = pg_pconnect($con_string); {
return $this->db; return 1;
}
else
{
return 0;
}
} }
/**
\brief Fermeture d'une connection vers une database. /**
\return resource \brief Copie d'un handler de database.
*/ \return resource
*/
function close()
{ function clone()
return pg_close($this->db);
}
/**
\brief Debut d'une transaction.
\param do
\return string
*/
function begin($do=1)
{
if ($do)
{
return $this->query("BEGIN");
}
else
{
return 1;
}
}
/**
\brief Ecriture d'une transaction.
\param do
\return string
*/
function commit($do=1)
{
if ($do)
{
return $this->query("COMMIT;");
}
else
{
return 1;
}
}
/**
\brief Effacement d'une transaction et retour au ancienne valeurs.
\param do
\return string
*/
function rollback($do=1)
{
if ($do)
{
return $this->query("ROLLBACK;");
}
else
{
return 1;
}
}
/**
\brief Effectue une requete et renvoi le resultset de réponse de la base
\param query contenu de la query
\param limit
\param offset
\return resource resultset
*/
function query($query, $limit="", $offset="")
{ {
$query = trim($query); $db2 = new DoliDb("", "", "", "", "");
$db2->db = $this->db;
$this->lastquery=$query; return $db2;
$this->results = pg_query($this->db,$query);
return $this->results;
} }
/** /**
\brief Liste des tables dans une database. \brief Ouverture d'une connection vers une database.
\param database nom de la database \param host Adresse de la base de données
\return resource \param login Nom de l'utilisateur autorisé
*/ \param passwd Mot de passe
\param name Nom de la database
function list_tables($database) \return resource handler d'accès à la base
{ */
$this->results = pg_query($this->db, "SHOW TABLES;");
return $this->results; function pconnect($host, $login, $passwd, $name)
}
/**
\brief Renvoie les données de la requete.
\param nb contenu de la query
\param fieldname nom du champ
\return resource
*/
function result($nb, $fieldname)
{ {
return pg_fetch_result($this->results, $nb, $fieldname); $con_string = "host=$host dbname=$name user=$login password=$passwd";
$this->db = pg_pconnect($con_string);
return $this->db;
} }
/**
/** \brief Fermeture d'une connection vers une database.
\brief Libère le dernier resultset utilisé sur cette connexion. \return resource
\return resource */
*/
function close()
function free()
{ {
return pg_free_result($this->results); return pg_close($this->db);
} }
/**
\brief Debut d'une transaction.
\return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
*/
function begin()
{
if (! $this->transaction_opened)
{
$ret=$this->query("BEGIN;");
if ($ret) $this->transaction_opened++;
return $ret;
}
else
{
$this->transaction_opened++;
return 1;
}
}
/**
\brief Validation d'une transaction
\return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
*/
/** function commit()
\brief Renvoie la ligne courante (comme un objet) pour le curseur resultset. {
\param resultset curseur de la requete voulue if ($this->transaction_opened==1)
\return resource {
*/ $ret=$this->query("COMMIT;");
if ($ret) $this->transaction_opened=0;
function fetch_object($resultset=0) return $ret;
}
else
{
$this->transaction_opened--;
return 1;
}
}
/**
\brief Annulation d'une transaction et retour aux anciennes valeurs
\return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
*/
function rollback()
{
if ($this->transaction_opened)
{
$ret=$this->query("ROLLBACK;");
$this->transaction_opened=0;
return $ret;
}
else
{
return 1;
}
}
/**
\brief Effectue une requete et renvoi le resultset de réponse de la base
\param query Contenu de la query
\return resource Resultset de la reponse
*/
function query($query)
{
$query = trim($query);
$this->lastquery=$query;
$this->results = pg_query($this->db, $query);
return $this->results;
}
/**
\brief Renvoie les données de la requete.
\param nb Contenu de la query
\param fieldname Nom du champ
\return resource
*/
function result($nb, $fieldname)
{
return pg_fetch_result($this->results, $nb, $fieldname);
}
/**
\brief Renvoie la ligne courante (comme un objet) pour le curseur resultset.
\param resultset Curseur de la requete voulue
\return resource
*/
function fetch_object($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilisé 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 défini les limites de la requète.
\param limit
\param offset
\return int limite
*/
function plimit($limit=0,$offset=0)
{
if ($offset > 0)
{
return " LIMIT $offset,$limit ";
}
else
{
return " LIMIT $limit ";
}
} }
/**
/** \brief Renvoie les données dans un tableau.
\brief Formatage par la base de données d'un champ de la base au format Timestamp ou Date (YYYY-MM-DD HH:MM:SS) \param resultset Curseur de la requete voulue
afin de retourner une donnée toujours au format universel date tms unix. \return array
\param fname */
\return date
*/ function fetch_array($resultset=0)
function pdate($fname)
{ {
return "unix_timestamp($fname)"; // 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 formatage de la date en fonction des locales. \param resultset Curseur de la requete voulue
\param fname \return array
\return date */
*/
function idate($fname) function fetch_row($resultset=0)
{ {
return strftime("%Y%m%d%H%M%S",$fname); // 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);
} }
/**
/** \brief Obtient les données d'un colonne et renvoie les données sous forme d'objet.
\brief Renvoie les données dans un tableau. \param resultset Curseur de la requete voulue
\return array
*/
function fetch_array()
{
return pg_fetch_array($this->results);
}
/**
\brief Renvoie les données comme un tableau.
\return array
*/
function fetch_row()
{
return pg_fetch_row($this->results);
}
/**
\brief Obtient les données d'un colonne et renvoie les données sous forme d'objet.
\return array \return array
*/ */
function fetch_field() function fetch_field($resultset=0)
{ {
return pg_field_name($this->results); // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_field_name($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 pg_num_rows($resultset);
}
/**
\brief Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
\see num_rows
\param resultset Curseur de la requete voulue
\return int Nombre de lignes
*/
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; }
// pgsql necessite un resultset pour cette fonction contrairement
// a mysql qui prend un link de base
return pg_affected_rows($resultset);
}
/**
\brief Renvoie le nombre de champs dans le resultat de la requete.
\param resultset Curseur de la requete voulue
\return int
*/
function num_fields($resultset=0)
{
// Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_num_fields($resultset);
} }
/**
/** \brief Libère le dernier resultset utilisé sur cette connexion.
\brief Renvoie le nombre de lignes dans le \param resultset Curseur de la requete voulue
resultat d'une requete SELECT \return resource
\see affected_rows */
\return int nombre de lignes
*/ function free($resultset=0)
function num_rows()
{ {
return pg_num_rows($this->results); // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_free_result($resultset);
}
/**
\brief Défini les limites de la requète.
\param limit
\param offset
\return int Limite
*/
function plimit($limit=0,$offset=0)
{
if ($offset > 0)
{
return " LIMIT $offset,$limit ";
}
else
{
return " LIMIT $limit ";
}
}
/**
\brief Formatage par la base de données d'un champ de la base au format Timestamp ou Date (YYYY-MM-DD HH:MM:SS)
afin de retourner une donnée toujours au format universel date tms unix.
\param fname
\return date
*/
function pdate($fname)
{
return "unix_timestamp($fname)";
}
/**
\brief Formatage de la date en fonction des locales.
\param fname
\return date
*/
function idate($fname)
{
return strftime("%Y%m%d%H%M%S",$fname);
}
/**
\brief Renvoie la derniere requete soumise par la methode query()
\return lastquery
*/
function lastquery()
{
return $this->lastquery;
}
/**
\brief Renvoie le texte de l'erreur mysql de l'operation precedente.
\return error_text
*/
function error()
{
return pg_last_error($this->db);
}
/**
\brief Renvoie la valeur numerique de l'erreur de l'operation precedente.
pour etre exploiter par l'appelant et détecter les erreurs du genre:
echec car doublons, table deja existante...
\return error_num
\remark pgsql ne permet pas de renvoyer un code générique d'une erreur,
mais juste un message. On utilise donc ces messages plutot qu'un code.
*/
function errno()
{
return pg_last_error($this->db);
}
/**
\brief Obtient l'id genéré par le dernier INSERT.
\return id
*/
function last_insert_id($tab)
{
$result = pg_query($this->db,"select max(rowid) from ".$tab." ;");
$nbre = pg_num_rows($result);
$row = pg_fetch_result($result,0,0);
return $row;
}
/**
\brief Retourne le dsn pear
\return dsn
*/
function getdsn($db_type,$db_user,$db_pass,$db_host,$dbname)
{
$pear = $db_type.'://'.$db_user.':'.$db_pass.'@'.
$db_host.'/'.$db_name;
return $pear;
} }
/** /**
\brief Renvoie le nombre de lignes dans le \brief Liste des tables dans une database.
resultat d'une requete INSERT, DELETE ou UPDATE \param database Nom de la database
\see num_rows \return resource
\return int nombre de lignes */
*/
function list_tables($database)
function affected_rows()
{ {
// pgsql necessite un resultset pour cette fonction contrairement $this->results = pg_query($this->db, "SHOW TABLES;");
// a mysql qui prend un link de base return $this->results;
return pg_affected_rows($this->results);
} }
/**
\brief Renvoie le nombre de champs dans le resultat de la requete.
\return int
*/
function num_fields()
{
return pg_num_fields($this->results);
}
/**
\brief Renvoie la derniere requete soumise par la methode query()
\return lastquery
*/
function lastquery()
{
return $this->lastquery;
}
/**
\brief Renvoie le texte de l'erreur mysql de l'operation precedente.
\return error_text
*/
function error()
{
return pg_last_error($this->db);
}
/**
\brief Renvoie la valeur numerique de l'erreur de l'operation precedente.
pour etre exploiter par l'appelant et détecter les erreurs du genre:
echec car doublons, table deja existante...
\return error_num
\remark pgsql ne permet pas de renvoyer un code générique d'une erreur,
mais juste un message. On utilise donc ces messages plutot qu'un code.
*/
function errno()
{
return pg_last_error($this->db);
}
/**
\brief Obtient l'id genéré par le précedent INSERT.
\return id
*/
function last_insert_id($tab)
{
$result = pg_query($this->db,"select max(rowid) from ".$tab." ;");
$nbre = pg_num_rows($result);
$row = pg_fetch_result($result,0,0);
return $row;
}
/**
\brief Retourne le dsn pear
\return dsn
*/
function getdsn($db_type,$db_user,$db_pass,$db_host,$dbname)
{
$pear = $db_type.'://'.$db_user.':'.$db_pass.'@'.
$db_host.'/'.$db_name;
return $pear;
}
} }
?> ?>