[ Index ] |
|
Code source de Dolibarr 2.0.1 |
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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Mon Nov 26 12:29:37 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |