source: moodle/trunk/fuentes/lib/adodb/drivers/adodb-pdo_pgsql.inc.php @ 1331

Last change on this file since 1331 was 1331, checked in by jrpelegrina, 3 years ago

Updated to moodle 3.0.3

File size: 8.3 KB
Line 
1<?php
2
3/*
4@version   v5.20.1  06-Dec-2015
5@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.
6@copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community
7  Released under both BSD license and Lesser GPL library license.
8  Whenever there is any discrepancy between the two licenses,
9  the BSD license will take precedence.
10  Set tabs to 8.
11
12*/
13
14class ADODB_pdo_pgsql extends ADODB_pdo {
15        var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1";
16    var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
17        and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages',
18         'sql_packages', 'sql_sizing', 'sql_sizing_profiles')
19        union
20        select viewname,'V' from pg_views where viewname not like 'pg\_%'";
21        //"select tablename from pg_tables where tablename not like 'pg_%' order by 1";
22        var $isoDates = true; // accepts dates in ISO format
23        var $sysDate = "CURRENT_DATE";
24        var $sysTimeStamp = "CURRENT_TIMESTAMP";
25        var $blobEncodeType = 'C';
26        var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum
27                FROM pg_class c, pg_attribute a,pg_type t
28                WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%'
29AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
30
31        // used when schema defined
32        var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
33FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n
34WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
35 and c.relnamespace=n.oid and n.nspname='%s'
36        and a.attname not like '....%%' AND a.attnum > 0
37        AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
38
39        // get primary key etc -- from Freek Dijkstra
40        var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key
41        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'";
42
43        var $hasAffectedRows = true;
44        var $hasLimit = false;  // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
45        // below suggested by Freek Dijkstra
46        var $true = 't';                // string that represents TRUE for a database
47        var $false = 'f';               // string that represents FALSE for a database
48        var $fmtDate = "'Y-m-d'";       // used by DBDate() as the default date format used by the database
49        var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
50        var $hasMoveFirst = true;
51        var $hasGenID = true;
52        var $_genIDSQL = "SELECT NEXTVAL('%s')";
53        var $_genSeqSQL = "CREATE SEQUENCE %s START %s";
54        var $_dropSeqSQL = "DROP SEQUENCE %s";
55        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";
56        var $random = 'random()';               /// random function
57        var $concat_operator='||';
58
59        function _init($parentDriver)
60        {
61
62                $parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver
63                $parentDriver->hasInsertID = true;
64                $parentDriver->_nestedSQL = true;
65        }
66
67        function ServerInfo()
68        {
69                $arr['description'] = ADOConnection::GetOne("select version()");
70                $arr['version'] = ADOConnection::_findvers($arr['description']);
71                return $arr;
72        }
73
74        function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
75        {
76                 $offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
77                 $limitStr  = ($nrows >= 0)  ? " LIMIT $nrows" : '';
78                 if ($secs2cache)
79                        $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
80                 else
81                        $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
82
83                return $rs;
84        }
85
86        function MetaTables($ttype=false,$showSchema=false,$mask=false)
87        {
88                $info = $this->ServerInfo();
89                if ($info['version'] >= 7.3) {
90                $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
91                          and schemaname  not in ( 'pg_catalog','information_schema')
92        union
93        select viewname,'V' from pg_views where viewname not like 'pg\_%'  and schemaname  not in ( 'pg_catalog','information_schema') ";
94                }
95                if ($mask) {
96                        $save = $this->metaTablesSQL;
97                        $mask = $this->qstr(strtolower($mask));
98                        if ($info['version']>=7.3)
99                                $this->metaTablesSQL = "
100select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema')
101 union
102select viewname,'V' from pg_views where viewname like $mask and schemaname  not in ( 'pg_catalog','information_schema')  ";
103                        else
104                                $this->metaTablesSQL = "
105select tablename,'T' from pg_tables where tablename like $mask
106 union
107select viewname,'V' from pg_views where viewname like $mask";
108                }
109                $ret = ADOConnection::MetaTables($ttype,$showSchema);
110
111                if ($mask) {
112                        $this->metaTablesSQL = $save;
113                }
114                return $ret;
115        }
116
117        function MetaColumns($table,$normalize=true)
118        {
119        global $ADODB_FETCH_MODE;
120
121                $schema = false;
122                $this->_findschema($table,$schema);
123
124                if ($normalize) $table = strtolower($table);
125
126                $save = $ADODB_FETCH_MODE;
127                $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
128                if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
129
130                if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema));
131                else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
132                if (isset($savem)) $this->SetFetchMode($savem);
133                $ADODB_FETCH_MODE = $save;
134
135                if ($rs === false) {
136                        $false = false;
137                        return $false;
138                }
139                if (!empty($this->metaKeySQL)) {
140                        // If we want the primary keys, we have to issue a separate query
141                        // Of course, a modified version of the metaColumnsSQL query using a
142                        // LEFT JOIN would have been much more elegant, but postgres does
143                        // not support OUTER JOINS. So here is the clumsy way.
144
145                        $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
146
147                        $rskey = $this->Execute(sprintf($this->metaKeySQL,($table)));
148                        // fetch all result in once for performance.
149                        $keys = $rskey->GetArray();
150                        if (isset($savem)) $this->SetFetchMode($savem);
151                        $ADODB_FETCH_MODE = $save;
152
153                        $rskey->Close();
154                        unset($rskey);
155                }
156
157                $rsdefa = array();
158                if (!empty($this->metaDefaultsSQL)) {
159                        $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
160                        $sql = sprintf($this->metaDefaultsSQL, ($table));
161                        $rsdef = $this->Execute($sql);
162                        if (isset($savem)) $this->SetFetchMode($savem);
163                        $ADODB_FETCH_MODE = $save;
164
165                        if ($rsdef) {
166                                while (!$rsdef->EOF) {
167                                        $num = $rsdef->fields['num'];
168                                        $s = $rsdef->fields['def'];
169                                        if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */
170                                                $s = substr($s, 1);
171                                                $s = substr($s, 0, strlen($s) - 1);
172                                        }
173
174                                        $rsdefa[$num] = $s;
175                                        $rsdef->MoveNext();
176                                }
177                        } else {
178                                ADOConnection::outp( "==> SQL => " . $sql);
179                        }
180                        unset($rsdef);
181                }
182
183                $retarr = array();
184                while (!$rs->EOF) {
185                        $fld = new ADOFieldObject();
186                        $fld->name = $rs->fields[0];
187                        $fld->type = $rs->fields[1];
188                        $fld->max_length = $rs->fields[2];
189                        if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4;
190                        if ($fld->max_length <= 0) $fld->max_length = -1;
191                        if ($fld->type == 'numeric') {
192                                $fld->scale = $fld->max_length & 0xFFFF;
193                                $fld->max_length >>= 16;
194                        }
195                        // dannym
196                        // 5 hasdefault; 6 num-of-column
197                        $fld->has_default = ($rs->fields[5] == 't');
198                        if ($fld->has_default) {
199                                $fld->default_value = $rsdefa[$rs->fields[6]];
200                        }
201
202                        //Freek
203                        if ($rs->fields[4] == $this->true) {
204                                $fld->not_null = true;
205                        }
206
207                        // Freek
208                        if (is_array($keys)) {
209                                foreach($keys as $key) {
210                                        if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true)
211                                                $fld->primary_key = true;
212                                        if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true)
213                                                $fld->unique = true; // What name is more compatible?
214                                }
215                        }
216
217                        if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
218                        else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld;
219
220                        $rs->MoveNext();
221                }
222                $rs->Close();
223                if (empty($retarr)) {
224                        $false = false;
225                        return $false;
226                } else return $retarr;
227
228        }
229
230}
Note: See TracBrowser for help on using the repository browser.