[ Index ]
 

Code source de Dolibarr 2.0.1

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/htdocs/lib/ -> pgsql.lib.php (source)

   1  <?php
   2  /* Copyright (C) 2001      Fabien Seisen        <seisen@linuxfr.org>
   3   * Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
   4   * Copyright (C) 2004      Laurent Destailleur  <eldy@users.sourceforge.net>
   5   * Copyright (C) 2004      Sebastien Di Cintio  <sdicintio@ressource-toi.org>
   6   * Copyright (C) 2004      Benoit Mortier              <benoit.mortier@opensides.be>
   7   *
   8   * This program is free software; you can redistribute it and/or modify
   9   * it under the terms of the GNU General Public License as published by
  10   * the Free Software Foundation; either version 2 of the License, or
  11   * (at your option) any later version.
  12   *
  13   * This program is distributed in the hope that it will be useful,
  14   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16   * GNU General Public License for more details.
  17   *
  18   * You should have received a copy of the GNU General Public License
  19   * along with this program; if not, write to the Free Software
  20   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21   *
  22   * $Id: pgsql.lib.php,v 1.39 2005/12/03 17:31:24 eldy Exp $
  23   * $Source: /cvsroot/dolibarr/dolibarr/htdocs/lib/pgsql.lib.php,v $
  24   */
  25  
  26  /**
  27          \file       htdocs/lib/pgsql.lib.php
  28          \brief      Fichier de la classe permettant de gérér une base pgsql
  29          \author     Fabien Seisen
  30          \author     Rodolphe Quiedeville.
  31          \author        Laurent Destailleur.
  32          \author     Sébastien Di Cintio
  33          \author     Benoit Mortier
  34          \version    $Revision: 1.39 $
  35  */
  36  
  37  
  38  /**
  39           \class      DoliDb
  40          \brief      Classe permettant de gérér la database de dolibarr
  41  */
  42  
  43  class DoliDb 
  44  {
  45      var $db;                      // Handler de base
  46      var $type='pgsql';            // Nom du gestionnaire
  47  
  48      var $results;                 // Resultset de la dernière requete
  49      
  50      var $connected;               // 1 si connecté, 0 sinon
  51      var $database_selected;       // 1 si base sélectionné, 0 sinon
  52      var $database_name;              // Nom base sélectionnée
  53      var $transaction_opened;      // 1 si une transaction est en cours, 0 sinon
  54      var $lastquery;
  55      
  56      var $ok;
  57      var $error;
  58      
  59      
  60      /**
  61          \brief      Ouverture d'une connection vers le serveur et une database.
  62          \param        type        type de base de données (mysql ou pgsql)
  63          \param        host        addresse de la base de données
  64          \param        user        nom de l'utilisateur autorisé
  65          \param        pass        mot de passe
  66          \param        name        nom de la database
  67          \return        int            1 en cas de succès, 0 sinon
  68      */
  69      function DoliDb($type='pgsql', $host, $user, $pass, $name='')
  70      {
  71          global $conf,$langs;
  72          $this->transaction_opened=0;
  73      
  74          //print "Name DB: $host,$user,$pass,$name<br>";
  75  
  76          if (! function_exists("pg_connect"))
  77          {
  78              $this->connected = 0;
  79              $this->ok = 0;
  80              $this->error="Pgsql PHP functions are not available in this version of PHP";
  81              dolibarr_syslog("DoliDB::DoliDB : Pgsql PHP functions are not available in this version of PHP");
  82              return $this->ok;
  83          }
  84  
  85          if (! $host)
  86          {
  87              $this->connected = 0;
  88              $this->ok = 0;
  89              $this->error=$langs->trans("ErrorWrongHostParameter");
  90              dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters");
  91              return $this->ok;
  92          }
  93      
  94          // Essai connexion serveur
  95          $this->db = $this->connect($host, $user, $pass, $name);
  96      
  97          if ($this->db)
  98          {
  99              $this->connected = 1;
 100              $this->ok = 1;
 101          }
 102          else
 103          {
 104              // host, login ou password incorrect
 105              $this->connected = 0;
 106              $this->ok = 0;
 107              dolibarr_syslog("DoliDB::DoliDB : Erreur Connect");
 108          }
 109      
 110          // Si connexion serveur ok et si connexion base demandée, on essaie connexion base
 111          if ($this->connected && $name)
 112          {
 113              if ($this->select_db($name) == 1)
 114              {
 115                  $this->database_selected = 1;
 116                  $this->database_name = $name;
 117                  $this->ok = 1;
 118              }
 119              else
 120              {
 121                  $this->database_selected = 0;
 122                  $this->ok = 0;
 123                  $this->error=$this->error();
 124                  dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db");
 125              }
 126          }
 127          else
 128          {
 129              // Pas de selection de base demandée, ok ou ko
 130              $this->database_selected = 0;
 131          }
 132      
 133          return $this->ok;
 134      }
 135      
 136      /**
 137          \brief      Selectionne une database.
 138          \param        database        nom de la database
 139          \return        resource
 140          \remarks     ici postgresql n'a aucune fonction equivalente de mysql_select_db
 141          \remarks     comparaison manuel si la database est bien celle choisie par l'utilisateur
 142          \remarks     en cas de succes renverra 1 ou 0
 143      */
 144      function select_db($database)
 145      {
 146          if ($database == $this->database_name)
 147              return 1;
 148          else
 149              return 0;
 150      }
 151      
 152      /**
 153          \brief      Connection vers le serveur
 154          \param        host        addresse de la base de données
 155          \param        login        nom de l'utilisateur autoris
 156          \param        passwd        mot de passe
 157          \param        name        nom de la database (ne sert pas sous mysql, sert sous pgsql)
 158          \return        resource    handler d'accès à la base
 159      */
 160      function connect($host, $login, $passwd, $name)
 161      {
 162          $con_string = "host=$host dbname=$name user=$login password=$passwd";
 163          $this->db = pg_connect($con_string);
 164          return $this->db;
 165      }
 166      
 167      
 168      /**
 169              \brief          Renvoie la version du serveur
 170              \return            string      Chaine version
 171      */
 172      function getVersion()
 173      {
 174          return '?';
 175      }
 176          
 177          
 178      /**
 179              \brief          Renvoie l'id de la connection
 180              \return            string      Id connection
 181      */
 182      function getConnectId()
 183      {
 184          return '?';
 185      }
 186  
 187  
 188      /**
 189              \brief          Renvoie la commande sql qui donne les droits à user sur les tables
 190              \param          databaseuse     User à autoriser
 191              \return            string          Requete sql
 192      */
 193      function getGrantForUserQuery($databaseuser)
 194      {
 195          // Scan tables pour générer le grant
 196          $dir = DOL_DOCUMENT_ROOT."/pgsql/tables";
 197          
 198          $handle=opendir($dir);
 199          $table_list="";
 200          while (($file = readdir($handle))!==false)
 201          {
 202              if (! ereg("\.key\.sql",$file) && ereg("^(.*)\.sql",$file,$reg))
 203              {
 204                  if ($table_list) {
 205                      $table_list.=", ".$reg[0];
 206                  }
 207                  else {
 208                      $table_list.=$reg[0];
 209                  }
 210              }
 211          }
 212          
 213          // Genere le grant_query
 214          $grant_query = 'GRANT ALL ON '.$table_list.' TO "'.$databaseuser.'";';
 215          return $grant_query;
 216      }
 217          
 218        
 219      /**
 220              \brief          Création d'une nouvelle base de donnée
 221              \param            database        nom de la database à créer
 222              \return            resource        resource définie si ok, null si ko
 223              \remarks        Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
 224      */
 225      function create_db($database)
 226      {
 227          $ret=$this->query('CREATE DATABASE '.$database.';');
 228          return $ret;
 229      }
 230          
 231      
 232      /**
 233              \brief      Copie d'un handler de database.
 234              \return        resource
 235      */
 236      
 237      function dbclone()
 238      {
 239          $db2 = new DoliDb("", "", "", "", "");
 240          $db2->db = $this->db;
 241          return $db2;
 242      }
 243      
 244      /**
 245              \brief      Ouverture d'une connection vers une database.
 246              \param        host        Adresse de la base de données
 247              \param        login        Nom de l'utilisateur autorisé
 248              \param        passwd        Mot de passe
 249              \param        name        Nom de la database
 250              \return        resource    handler d'accès à la base
 251      */
 252      
 253      function pconnect($host, $login, $passwd, $name)
 254      {
 255          $con_string = "host=$host dbname=$name user=$login password=$passwd";
 256          $this->db = pg_pconnect($con_string);
 257          return $this->db;
 258      }
 259      
 260      /**
 261              \brief      Fermeture d'une connection vers une database.
 262              \return        resource
 263      */
 264      
 265      function close()
 266      {
 267          return pg_close($this->db);
 268      }
 269      
 270      /**
 271          \brief      Debut d'une transaction.
 272          \return        int         1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
 273      */
 274      
 275      function begin()
 276      {
 277          if (! $this->transaction_opened)
 278          {
 279              $ret=$this->query("BEGIN;");
 280              if ($ret) $this->transaction_opened++;
 281              return $ret;
 282          }
 283          else
 284          {
 285              $this->transaction_opened++;
 286              return 1;
 287          }
 288      }
 289      
 290      /**
 291          \brief      Validation d'une transaction
 292          \return        int         1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
 293      */
 294  
 295      function commit()
 296      {
 297          if ($this->transaction_opened==1)
 298          {
 299              $ret=$this->query("COMMIT;");
 300              if ($ret) $this->transaction_opened=0;
 301              return $ret;
 302          }
 303          else
 304          {
 305              $this->transaction_opened--;
 306              return 1;
 307          }
 308      }
 309      
 310      /**
 311          \brief      Annulation d'une transaction et retour aux anciennes valeurs
 312          \return        int         1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
 313      */
 314      
 315      function rollback()
 316      {
 317          if ($this->transaction_opened)
 318          {
 319              $ret=$this->query("ROLLBACK;");
 320              $this->transaction_opened=0;
 321              return $ret;
 322          }
 323          else
 324          {
 325              return 1;
 326          }
 327      }
 328      
 329      /**
 330          \brief      Effectue une requete et renvoi le resultset de réponse de la base
 331          \param        query        Contenu de la query
 332          \return        resource    Resultset de la reponse
 333      */
 334      
 335      function query($query)
 336      {
 337          $query = trim($query);
 338          $ret = pg_query($this->db, $query);
 339  
 340          if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) {
 341              // Si requete utilisateur, on la sauvegarde ainsi que son resultset
 342              $this->lastquery=$query;
 343              $this->results = $ret;
 344          }
 345      
 346          return $ret;
 347      }
 348      
 349      /**
 350          \brief      Renvoie les données de la requete.
 351          \param        nb            Contenu de la query
 352          \param        fieldname    Nom du champ
 353          \return        resource
 354      */
 355      
 356      function result($nb, $fieldname)
 357      {
 358          return pg_fetch_result($this->results, $nb, $fieldname);
 359      }
 360      
 361      /**
 362          \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
 363          \param      resultset   Curseur de la requete voulue
 364          \return        resource
 365      */
 366      
 367      function fetch_object($resultset=0)
 368      {
 369          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 370          if (! is_resource($resultset)) { $resultset=$this->results; }
 371          return pg_fetch_object($resultset);
 372      }
 373      
 374      /**
 375          \brief      Renvoie les données dans un tableau.
 376          \param      resultset   Curseur de la requete voulue
 377          \return        array
 378      */
 379      
 380      function fetch_array($resultset=0)
 381      {
 382          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 383          if (! is_resource($resultset)) { $resultset=$this->results; }
 384          return pg_fetch_array($resultset);
 385      }
 386      
 387      /**
 388          \brief      Renvoie les données comme un tableau.
 389          \param      resultset   Curseur de la requete voulue
 390          \return        array
 391      */
 392      
 393      function fetch_row($resultset=0)
 394      {
 395          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 396          if (! is_resource($resultset)) { $resultset=$this->results; }
 397          return pg_fetch_row($resultset);
 398      }
 399      
 400      /**
 401          \brief      Obtient les données d'un colonne et renvoie les données sous forme d'objet.
 402          \param      resultset   Curseur de la requete voulue
 403          \return     array
 404      */
 405      
 406      function fetch_field($resultset=0)
 407      {
 408          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 409          if (! is_resource($resultset)) { $resultset=$this->results; }
 410          return pg_field_name($resultset);
 411      }
 412      
 413      /**
 414          \brief      Renvoie le nombre de lignes dans le resultat d'une requete SELECT
 415          \see        affected_rows
 416          \param      resultset   Curseur de la requete voulue
 417          \return     int            Nombre de lignes
 418      */
 419      
 420      function num_rows($resultset=0)
 421      {
 422          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 423          if (! is_resource($resultset)) { $resultset=$this->results; }
 424          return pg_num_rows($resultset);
 425      }
 426      
 427      /**
 428          \brief      Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
 429          \see        num_rows
 430          \param      resultset   Curseur de la requete voulue
 431          \return     int            Nombre de lignes
 432      */
 433      
 434      function affected_rows($resultset=0)
 435      {
 436          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 437          if (! is_resource($resultset)) { $resultset=$this->results; }
 438          // pgsql necessite un resultset pour cette fonction contrairement
 439          // a mysql qui prend un link de base
 440          return pg_affected_rows($resultset);
 441      }
 442      
 443      
 444      /**
 445          \brief      Renvoie le nombre de champs dans le resultat de la requete.
 446          \param      resultset   Curseur de la requete voulue
 447          \return        int
 448      */
 449      
 450      function num_fields($resultset=0)
 451      {
 452          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 453          if (! is_resource($resultset)) { $resultset=$this->results; }
 454          return pg_num_fields($resultset);
 455      }
 456  
 457      /**
 458          \brief      Libère le dernier resultset utilisé sur cette connexion.
 459          \param      resultset   Curseur de la requete voulue
 460      */
 461      
 462      function free($resultset=0)
 463      {
 464          // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
 465          if (! is_resource($resultset)) { $resultset=$this->results; }
 466          // Si resultset en est un, on libere la mémoire
 467          if (is_resource($resultset)) pg_free_result($resultset);
 468      }
 469      
 470  
 471      /**
 472          \brief      Défini les limites de la requète.
 473          \param        limit       nombre maximum de lignes retournées
 474          \param        offset      numéro de la ligne à partir de laquelle recupérer les lignes
 475          \return        string      chaine exprimant la syntax sql de la limite
 476      */
 477      
 478      function plimit($limit=0,$offset=0)
 479      {
 480          global $conf;
 481          if (! $limit) $limit=$conf->liste_limit;
 482          if ($offset > 0) return " LIMIT $offset,$limit ";
 483          else return " LIMIT $limit ";
 484      }
 485      
 486      
 487      /**
 488          \brief      Formatage (par la base de données) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
 489                      afin de retourner une donnée toujours au format universel date tms unix.
 490          \param        param
 491          \return        date        date au format tms.
 492      */
 493      function pdate($param)
 494      {
 495          return "unix_timestamp(".$param.")";
 496      }
 497  
 498      /**
 499          \brief      Formatage (par la base de données) d'un champ de la base au format tms
 500                      afin de retourner une donnée au format text YYYYMMDDHHMMSS.
 501          \param        param
 502          \return        string      date au format text YYYYMMDDHHMMSS.
 503      */
 504      function qdate($param)
 505      {
 506          return "from_unixtime(".$param.")";
 507      }
 508      
 509      /**
 510          \brief      Formatage (par PHP) de la date en texte.
 511          \param        param
 512          \return        date
 513      */
 514      function idate($param)
 515      {
 516          return strftime("%Y%m%d%H%M%S",$param);
 517      }
 518  
 519  
 520      /**
 521          \brief      Formatage d'un if SQL
 522          \param        test            chaine test
 523          \param        resok           resultat si test egal
 524          \param        resko           resultat si test non egal
 525          \return        string          chaine formaté SQL
 526      */
 527      function ifsql($test,$resok,$resko)
 528      {
 529          return 'IF('.$test.','.$resok.','.$resko.')';
 530      }
 531  
 532  
 533      /**
 534          \brief         Renvoie la derniere requete soumise par la methode query()
 535          \return        lastquery
 536      */
 537      
 538      function lastquery()
 539      {
 540          return $this->lastquery;
 541      }
 542      
 543      /**
 544           \brief     Renvoie le code erreur generique de l'operation precedente.
 545           \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
 546      */
 547      
 548      function errno()
 549      {
 550          static $error_regexps;
 551          if (empty($error_regexps)) {
 552              $error_regexps = array(
 553                  '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => 'DB_ERROR_NOSUCHTABLE',
 554                  '/table [\"\'].*[\"\'] does not exist/' => 'DB_ERROR_NOSUCHTABLE',
 555                  '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/'      => 'DB_ERROR_RECORD_ALREADY_EXISTS',
 556                  '/divide by zero$/'                     => 'DB_ERROR_DIVZERO',
 557                  '/pg_atoi: error in .*: can\'t parse /' => 'DB_ERROR_INVALID_NUMBER',
 558                  '/ttribute [\"\'].*[\"\'] not found$|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => 'DB_ERROR_NOSUCHFIELD',
 559                  '/parser: parse error at or near \"/'   => 'DB_ERROR_SYNTAX',
 560                  '/referential integrity violation/'     => 'DB_ERROR_CONSTRAINT'
 561              );
 562          }
 563          foreach ($error_regexps as $regexp => $code) {
 564              if (preg_match($regexp, pg_last_error($this->db))) {
 565                  return $code;
 566              }
 567          }
 568          $errno=pg_last_error($this->db);
 569          return ($errno?'DB_ERROR':'0');
 570      }
 571      
 572      /**
 573          \brief         Renvoie le texte de l'erreur pgsql de l'operation precedente.
 574          \return        error_text
 575      */
 576      
 577      function error()
 578      {
 579          return pg_last_error($this->db);
 580      }
 581      
 582      /**
 583          \brief      Récupère l'id genéré par le dernier INSERT.
 584          \param         tab     Nom de la table concernée par l'insert. Ne sert pas sous MySql mais requis pour compatibilité avec Postgresql
 585          \return     int     id
 586      */
 587      
 588      function last_insert_id($tab)
 589      {
 590          $result = pg_query($this->db,"SELECT MAX(rowid) FROM ".$tab." ;");
 591          $nbre = pg_num_rows($result);
 592          $row = pg_fetch_result($result,0,0);
 593          return $row;
 594      }
 595      
 596      /**
 597          \brief      Retourne le dsn pear
 598          \return     dsn
 599      */
 600      
 601      function getdsn($db_type,$db_user,$db_pass,$db_host,$dbname)
 602      {
 603          $pear = $db_type.'://'.$db_user.':'.$db_pass.'@'.
 604          $db_host.'/'.$db_name;
 605      
 606          return $pear;
 607      }
 608  
 609      /**
 610          \brief      Liste des tables dans une database.
 611          \param        database    Nom de la database
 612          \return        resource
 613      */
 614      
 615      function list_tables($database)
 616      {
 617          $this->results = pg_query($this->db, "SHOW TABLES;");
 618          return  $this->results;
 619      }
 620      
 621  
 622      function setLastQuery($s)
 623      {
 624          $this->lastquery=$s;
 625      }
 626  
 627  
 628      /**
 629          \brief      Renvoie toutes les données comme un tableau.
 630          \param      sql         Requete sql
 631          \param      datas       Tableau de données pour retour
 632          \return        int         >0 si ok, <0 si ko
 633      */
 634      function fetch_all_rows($sql, &$datas)
 635      {
 636          $datas = array();
 637      
 638          $resql = $this->query($sql);
 639          if ($resql)
 640          {
 641              $i = 0;
 642              $num = $this->num_rows($resql);
 643      
 644              while ($i < $num)
 645              {
 646                  $row = $this->fetch_row($resql);
 647                  array_push($datas, $row[0]);
 648                  $i++;
 649              }
 650          }
 651          else
 652          {
 653              print $this->error();
 654              return -1;
 655          }
 656          return 1;
 657      }
 658  
 659  }
 660  
 661  ?>


Généré le : Mon Nov 26 12:29:37 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics