Extend dbClass for PostgreSQL (rename original Rico class)
[misc/kostenrechnung] / lib / dbClass.php
1 <?php
2
3 require_once('rico/dbClass2.php');
4
5 class dbClass_postgresql
6 {
7   var $lastQuery;
8   function dbClass_postgresql($conn) { $this->conn=$conn; }
9   function HasError() { return pg_last_error() !== ''; }
10   function ErrorMsg() { return pg_last_error(); }
11   function Close() { return pg_close(); }
12   function FreeResult($rsLookUp) { return pg_free_result($rsLookUp); }
13   function RunQuery($sqltext) { $this->lastQuery=$sqltext; return pg_query($sqltext); }
14   function NumFields($rsMain) { return pg_num_fields($rsMain); }
15   function NumRows($rsMain) { return pg_num_rows($rsMain); }
16   function FieldType($rsMain,$i) { return pg_field_type($rsMain,$i); }
17   function FetchRow($rsMain,&$result) { $result=pg_fetch_row($rsMain); return ($result==false) ? false : true; }
18   function FetchAssoc($rsMain,&$result) { $result=pg_fetch_assoc($rsMain); return ($result==false) ? false : true; }
19   function FetchArray($rsMain,&$result) { $result=pg_fetch_array($rsMain,MYSQL_NUM); return ($result==false) ? false : true; }
20   function AffectedRows($rsMain) { return pg_affected_rows($this->conn); }
21   function Seek($rsMain,$offset) { error_log("mysql_data_seek($rsMain,$offset);"); return false; }
22   function RunParamQuery($query, $phs = array()) {
23     foreach ($phs as $ph) {   // from php.net
24       if ( isset($ph) ) {
25         $ph = "'" . pg_escape_string($ph) . "'";
26       } else {
27         $ph = "NULL" ;
28       }
29       $query = substr_replace($query, $ph, strpos($query, '?'), 1);
30     }
31     $this->lastQuery=$query;
32     $result = pg_query($query);
33     return ($result===false) ? false : true;
34   }
35   function GetColumnInfo($TableName) {
36     $rsMain=$this->RunQuery("SHOW COLUMNS FROM ".$TableName);
37     if (!$rsMain) return null;
38     $arColumns=array();
39     while($this->FetchAssoc($rsMain,$row)) {
40       $colinfo=new dbColumn;
41       $colinfo->IsPKey=($row["Key"]=="PRI");
42       $colinfo->ColName=$row["Field"];
43       $colinfo->ColType=$row["Type"];
44       $colinfo->Nullable=($row["Null"]=="YES");
45       if (preg_match("/\((\d+)\)/", $row["Type"], $matches))
46         $colinfo->ColLength=$matches[1];
47       else
48         $colinfo->ColLength=0;
49       $colinfo->Writeable=($row["Extra"] != 'auto_increment');
50       array_push($arColumns, $colinfo);
51     } 
52     $this->FreeResult($rsMain);
53     return $arColumns;
54   }
55   function GetTableList($TableType) {
56     if ($TableType!='VIEW') $TableType='BASE TABLE';
57     $rsMain=$this->RunQuery("SHOW FULL TABLES WHERE Table_type='".$TableType."'");
58     if (!$rsMain) return null;
59     $arTables=array();
60     while($this->FetchRow($rsMain,$row)) {
61       array_push($arTables, $row[0]);
62     } 
63     $this->FreeResult($rsMain);
64     return $arTables;
65   }
66   function Concat($arStrings) {
67     return "concat(".implode(",",$arStrings).")";
68   }
69   function Convert2Char($s) {
70     return $s; // implicit conversion
71   }
72   function SqlDay($s) {
73     return "dayofmonth(".$s.")";
74   }
75   function SqlMonth($s) {
76     return "month(".$s.")";
77   }
78   function SqlYear($s) {
79     return "year(".$s.")";
80   }
81   function CurrentTime() {
82     return "LOCALTIMESTAMP";
83   }
84 }
85
86 class dbClass extends dbClassRico
87 {
88
89 //********************************************************************************************************
90 // Attempts to connect to the Database. Returns true on success.
91 //********************************************************************************************************
92   function PostgreSqlLogon($DefDB,$userid,$pw)
93   {
94     $this->Dialect="PostgreSQL";
95     $this->dbDefault = $DefDB;
96
97     $dsn = sprintf('host=%s dbname=%s user=%s password=%s',DBHOST,$DefDB,$userid,$pw);
98     $this->dbMain = pg_connect($dsn);
99     $this->db =& new dbClass_postgresql($this->dbMain);
100
101     if ($this->dbMain === false && $this->CheckForError("opening connection")) return false;
102     return true;
103   }
104
105 }
106
107 ?>