Documentation TYPO3 par Ameos

adodb-pdo_pgsql.inc.php

00001 <?php
00002 
00003 /*
00004 V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
00005   Released under both BSD license and Lesser GPL library license. 
00006   Whenever there is any discrepancy between the two licenses, 
00007   the BSD license will take precedence.
00008   Set tabs to 8.
00009  
00010 */ 
00011 
00012 class ADODB_pdo_pgsql extends ADODB_pdo {
00013         var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1";
00014     var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
00015         and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages',
00016          'sql_packages', 'sql_sizing', 'sql_sizing_profiles') 
00017         union 
00018         select viewname,'V' from pg_views where viewname not like 'pg\_%'";
00019         //"select tablename from pg_tables where tablename not like 'pg_%' order by 1";
00020         var $isoDates = true; // accepts dates in ISO format
00021         var $sysDate = "CURRENT_DATE";
00022         var $sysTimeStamp = "CURRENT_TIMESTAMP";
00023         var $blobEncodeType = 'C';
00024         var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum 
00025                 FROM pg_class c, pg_attribute a,pg_type t 
00026                 WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%'
00027 AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
00028 
00029         // used when schema defined
00030         var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum 
00031 FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n 
00032 WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
00033  and c.relnamespace=n.oid and n.nspname='%s' 
00034         and a.attname not like '....%%' AND a.attnum > 0 
00035         AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
00036         
00037         // get primary key etc -- from Freek Dijkstra
00038         var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key 
00039         FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'";
00040         
00041         var $hasAffectedRows = true;
00042         var $hasLimit = false;  // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
00043         // below suggested by Freek Dijkstra 
00044         var $true = 't';                // string that represents TRUE for a database
00045         var $false = 'f';               // string that represents FALSE for a database
00046         var $fmtDate = "'Y-m-d'";       // used by DBDate() as the default date format used by the database
00047         var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
00048         var $hasMoveFirst = true;
00049         var $hasGenID = true;
00050         var $_genIDSQL = "SELECT NEXTVAL('%s')";
00051         var $_genSeqSQL = "CREATE SEQUENCE %s START %s";
00052         var $_dropSeqSQL = "DROP SEQUENCE %s";
00053         var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum";
00054         var $random = 'random()';               
00055         var $concat_operator='||';
00056         
00057         function _init($parentDriver)
00058         {
00059         
00060                 $parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver
00061                 $parentDriver->hasInsertID = true;
00062                 $parentDriver->_nestedSQL = true;
00063         }
00064         
00065         function ServerInfo()
00066         {
00067                 $arr['description'] = ADOConnection::GetOne("select version()");
00068                 $arr['version'] = ADOConnection::_findvers($arr['description']);
00069                 return $arr;
00070         }
00071         
00072         function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) 
00073         {
00074                  $offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
00075                  $limitStr  = ($nrows >= 0)  ? " LIMIT $nrows" : '';
00076                  if ($secs2cache)
00077                         $rs =& $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
00078                  else
00079                         $rs =& $this->Execute($sql."$limitStr$offsetStr",$inputarr);
00080                 
00081                 return $rs;
00082         }
00083         
00084         function &MetaTables($ttype=false,$showSchema=false,$mask=false) 
00085         {
00086                 $info = $this->ServerInfo();
00087                 if ($info['version'] >= 7.3) {
00088                 $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
00089                           and schemaname  not in ( 'pg_catalog','information_schema')
00090         union 
00091         select viewname,'V' from pg_views where viewname not like 'pg\_%'  and schemaname  not in ( 'pg_catalog','information_schema') ";
00092                 }
00093                 if ($mask) {
00094                         $save = $this->metaTablesSQL;
00095                         $mask = $this->qstr(strtolower($mask));
00096                         if ($info['version']>=7.3)
00097                                 $this->metaTablesSQL = "
00098 select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema')  
00099  union 
00100 select viewname,'V' from pg_views where viewname like $mask and schemaname  not in ( 'pg_catalog','information_schema')  ";
00101                         else
00102                                 $this->metaTablesSQL = "
00103 select tablename,'T' from pg_tables where tablename like $mask 
00104  union 
00105 select viewname,'V' from pg_views where viewname like $mask";
00106                 }
00107                 $ret =& ADOConnection::MetaTables($ttype,$showSchema);
00108                 
00109                 if ($mask) {
00110                         $this->metaTablesSQL = $save;
00111                 }
00112                 return $ret;
00113         }
00114         
00115         function &MetaColumns($table,$normalize=true) 
00116         {
00117         global $ADODB_FETCH_MODE;
00118         
00119                 $schema = false;
00120                 $this->_findschema($table,$schema);
00121                 
00122                 if ($normalize) $table = strtolower($table);
00123 
00124                 $save = $ADODB_FETCH_MODE;
00125                 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00126                 if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
00127                 
00128                 if ($schema) $rs =& $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema));
00129                 else $rs =& $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
00130                 if (isset($savem)) $this->SetFetchMode($savem);
00131                 $ADODB_FETCH_MODE = $save;
00132                 
00133                 if ($rs === false) {
00134                         $false = false;
00135                         return $false;
00136                 }
00137                 if (!empty($this->metaKeySQL)) {
00138                         // If we want the primary keys, we have to issue a separate query
00139                         // Of course, a modified version of the metaColumnsSQL query using a 
00140                         // LEFT JOIN would have been much more elegant, but postgres does 
00141                         // not support OUTER JOINS. So here is the clumsy way.
00142                         
00143                         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00144                         
00145                         $rskey = $this->Execute(sprintf($this->metaKeySQL,($table)));
00146                         // fetch all result in once for performance.
00147                         $keys =& $rskey->GetArray();
00148                         if (isset($savem)) $this->SetFetchMode($savem);
00149                         $ADODB_FETCH_MODE = $save;
00150                         
00151                         $rskey->Close();
00152                         unset($rskey);
00153                 }
00154 
00155                 $rsdefa = array();
00156                 if (!empty($this->metaDefaultsSQL)) {
00157                         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00158                         $sql = sprintf($this->metaDefaultsSQL, ($table));
00159                         $rsdef = $this->Execute($sql);
00160                         if (isset($savem)) $this->SetFetchMode($savem);
00161                         $ADODB_FETCH_MODE = $save;
00162                         
00163                         if ($rsdef) {
00164                                 while (!$rsdef->EOF) {
00165                                         $num = $rsdef->fields['num'];
00166                                         $s = $rsdef->fields['def'];
00167                                         if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */
00168                                                 $s = substr($s, 1);
00169                                                 $s = substr($s, 0, strlen($s) - 1);
00170                                         }
00171 
00172                                         $rsdefa[$num] = $s;
00173                                         $rsdef->MoveNext();
00174                                 }
00175                         } else {
00176                                 ADOConnection::outp( "==> SQL => " . $sql);
00177                         }
00178                         unset($rsdef);
00179                 }
00180         
00181                 $retarr = array();
00182                 while (!$rs->EOF) {     
00183                         $fld = new ADOFieldObject();
00184                         $fld->name = $rs->fields[0];
00185                         $fld->type = $rs->fields[1];
00186                         $fld->max_length = $rs->fields[2];
00187                         if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4;
00188                         if ($fld->max_length <= 0) $fld->max_length = -1;
00189                         if ($fld->type == 'numeric') {
00190                                 $fld->scale = $fld->max_length & 0xFFFF;
00191                                 $fld->max_length >>= 16;
00192                         }
00193                         // dannym
00194                         // 5 hasdefault; 6 num-of-column
00195                         $fld->has_default = ($rs->fields[5] == 't');
00196                         if ($fld->has_default) {
00197                                 $fld->default_value = $rsdefa[$rs->fields[6]];
00198                         }
00199 
00200                         //Freek
00201                         if ($rs->fields[4] == $this->true) {
00202                                 $fld->not_null = true;
00203                         }
00204                         
00205                         // Freek
00206                         if (is_array($keys)) {
00207                                 foreach($keys as $key) {
00208                                         if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true) 
00209                                                 $fld->primary_key = true;
00210                                         if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true) 
00211                                                 $fld->unique = true; // What name is more compatible?
00212                                 }
00213                         }
00214                         
00215                         if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;     
00216                         else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld;
00217                         
00218                         $rs->MoveNext();
00219                 }
00220                 $rs->Close();
00221                 if (empty($retarr)) {
00222                         $false = false;
00223                         return $false;
00224                 } else return $retarr;  
00225                 
00226         }
00227 
00228 }
00229 
00230 ?>


Généré par Les experts TYPO3 avec  doxygen 1.4.6