Ignore:
Timestamp:
May 2, 2016, 12:09:23 PM (3 years ago)
Author:
jrpelegrina
Message:

Updated to moodle 3.0.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • moodle/trunk/fuentes/lib/adodb/drivers/adodb-postgres7.inc.php

    r136 r1331  
    11<?php
    22/*
    3  V5.19  23-Apr-2014  (c) 2000-2014 John Lim (jlim#natsoft.com). All rights reserved.
     3 @version   v5.20.1  06-Dec-2015
     4 @copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.
     5 @copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community
    46  Released under both BSD license and Lesser GPL library license.
    57  Whenever there is any discrepancy between the two licenses,
     
    2224        var $ansiOuter = true;
    2325        var $charSet = true; //set to true for Postgres 7 and above - PG client supports encodings
    24            // Richard 3/18/2012 - Modified SQL to return SERIAL type correctly AS old driver no longer return SERIAL as data type.
    25         var $metaColumnsSQL =
    26                                                  "SELECT a.attname,
    27                                                                         CASE
    28                                                                                            WHEN x.sequence_name != '' THEN 'SERIAL'
    29                                                                                            ELSE t.typname
    30                                                                         END AS typname,
    31                                                                         a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum
    32                                                  FROM pg_class c, pg_attribute a
    33                                                  JOIN pg_type t ON a.atttypid = t.oid
    34                                                  LEFT JOIN
    35                                                                         (SELECT c.relname as sequence_name,
    36                                                                                                   c1.relname as related_table,
    37                                                                                                   a.attname as related_column
    38                                                                         FROM pg_class c
    39                                                                            JOIN pg_depend d ON d.objid = c.oid
    40                                                                            LEFT JOIN pg_class c1 ON d.refobjid = c1.oid
    41                                                                            LEFT JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
    42                                                                         WHERE c.relkind = 'S' AND c1.relname = '%s') x
    43                                                                         ON x.related_column= a.attname
    44                                                  WHERE c.relkind in ('r','v') AND
    45                                                                         (c.relname='%s' or c.relname = lower('%s')) AND
    46                                                                         a.attname not like '....%%' AND
    47                                                                         a.attnum > 0 AND
    48                                                                         a.attrelid = c.oid
    49                                                  ORDER BY a.attnum";
    50 
    51    // used when schema defined
     26
     27        // Richard 3/18/2012 - Modified SQL to return SERIAL type correctly AS old driver no longer return SERIAL as data type.
     28        var $metaColumnsSQL = "
     29                SELECT
     30                        a.attname,
     31                        CASE
     32                                WHEN x.sequence_name != ''
     33                                THEN 'SERIAL'
     34                                ELSE t.typname
     35                        END AS typname,
     36                        a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
     37                FROM
     38                        pg_class c,
     39                        pg_attribute a
     40                JOIN pg_type t ON a.atttypid = t.oid
     41                LEFT JOIN (
     42                        SELECT
     43                                c.relname as sequence_name,
     44                                c1.relname as related_table,
     45                                a.attname as related_column
     46                        FROM pg_class c
     47                        JOIN pg_depend d ON d.objid = c.oid
     48                        LEFT JOIN pg_class c1 ON d.refobjid = c1.oid
     49                        LEFT JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
     50                        WHERE c.relkind = 'S' AND c1.relname = '%s'
     51                ) x ON x.related_column= a.attname
     52                WHERE
     53                        c.relkind in ('r','v')
     54                        AND (c.relname='%s' or c.relname = lower('%s'))
     55                        AND a.attname not like '....%%'
     56                        AND a.attnum > 0
     57                        AND a.attrelid = c.oid
     58                ORDER BY
     59                        a.attnum";
     60
     61        // used when schema defined
    5262        var $metaColumnsSQL1 = "
    53                                                  SELECT a.attname,
    54                                                                         CASE
    55                                                                                            WHEN x.sequence_name != '' THEN 'SERIAL'
    56                                                                                            ELSE t.typname
    57                                                                         END AS typname,
    58                                                                         a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
    59                                                  FROM pg_class c, pg_namespace n, pg_attribute a
    60                                                  JOIN pg_type t ON a.atttypid = t.oid
    61                                                  LEFT JOIN
    62                                                                         (SELECT c.relname as sequence_name,
    63                                                                                                   c1.relname as related_table,
    64                                                                                                   a.attname as related_column
    65                                                                         FROM pg_class c
    66                                                                            JOIN pg_depend d ON d.objid = c.oid
    67                                                                            LEFT JOIN pg_class c1 ON d.refobjid = c1.oid
    68                                                                            LEFT JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
    69                                                                         WHERE c.relkind = 'S' AND c1.relname = '%s') x
    70                                                                         ON x.related_column= a.attname
    71                                                  WHERE c.relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
    72                                                                         AND c.relnamespace=n.oid and n.nspname='%s'
    73                                                                         AND a.attname not like '....%%' AND a.attnum > 0
    74                                                                         AND a.atttypid = t.oid AND a.attrelid = c.oid
    75                                                  ORDER BY a.attnum";
     63                SELECT
     64                        a.attname,
     65                        CASE
     66                                WHEN x.sequence_name != ''
     67                                THEN 'SERIAL'
     68                                ELSE t.typname
     69                        END AS typname,
     70                        a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
     71                FROM
     72                        pg_class c,
     73                        pg_namespace n,
     74                        pg_attribute a
     75                JOIN pg_type t ON a.atttypid = t.oid
     76                LEFT JOIN (
     77                        SELECT
     78                                c.relname as sequence_name,
     79                                c1.relname as related_table,
     80                                a.attname as related_column
     81                        FROM pg_class c
     82                        JOIN pg_depend d ON d.objid = c.oid
     83                        LEFT JOIN pg_class c1 ON d.refobjid = c1.oid
     84                        LEFT JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
     85                        WHERE c.relkind = 'S' AND c1.relname = '%s'
     86                ) x ON x.related_column= a.attname
     87                WHERE
     88                        c.relkind in ('r','v')
     89                        AND (c.relname='%s' or c.relname = lower('%s'))
     90                        AND c.relnamespace=n.oid and n.nspname='%s'
     91                        AND a.attname not like '....%%'
     92                        AND a.attnum > 0
     93                        AND a.atttypid = t.oid
     94                        AND a.attrelid = c.oid
     95                ORDER BY a.attnum";
    7696
    7797
     
    7999        {
    80100                parent::__construct();
    81                 if (ADODB_ASSOC_CASE !== 2) {
     101                if (ADODB_ASSOC_CASE !== ADODB_ASSOC_CASE_NATIVE) {
    82102                        $this->rsPrefix .= 'assoc_';
    83103                }
     
    88108        // the following should be compat with postgresql 7.2,
    89109        // which makes obsolete the LIMIT limit,offset syntax
    90          function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
    91          {
    92                  $offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : '';
    93                  $limitStr  = ($nrows >= 0)  ? " LIMIT ".((integer)$nrows) : '';
    94                  if ($secs2cache)
    95                         $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
    96                  else
    97                         $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
     110        function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
     111        {
     112                $offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : '';
     113                $limitStr  = ($nrows >= 0)  ? " LIMIT ".((integer)$nrows) : '';
     114                if ($secs2cache)
     115                        $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
     116                else
     117                        $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
    98118
    99119                return $rs;
    100          }
    101         /*
    102         function Prepare($sql)
     120        }
     121
     122        /*
     123        function Prepare($sql)
    103124        {
    104125                $info = $this->ServerInfo();
     
    108129                return $sql;
    109130        }
    110         */
    111 
    112         /*
    113                 I discovered that the MetaForeignKeys method no longer worked for Postgres 8.3.
    114                 I went ahead and modified it to work for both 8.2 and 8.3.
    115                 Please feel free to include this change in your next release of adodb.
    116                  William Kolodny [William.Kolodny#gt-t.net]
    117131        */
     132
     133        /**
     134         * Generate the SQL to retrieve MetaColumns data
     135         * @param string $table Table name
     136         * @param string $schema Schema name (can be blank)
     137         * @return string SQL statement to execute
     138         */
     139        protected function _generateMetaColumnsSQL($table, $schema)
     140        {
     141                if ($schema) {
     142                        return sprintf($this->metaColumnsSQL1, $table, $table, $table, $schema);
     143                }
     144                else {
     145                        return sprintf($this->metaColumnsSQL, $table, $table, $schema);
     146                }
     147        }
     148
     149        /**
     150         * @returns assoc array where keys are tables, and values are foreign keys
     151         */
    118152        function MetaForeignKeys($table, $owner=false, $upper=false)
    119153        {
    120           $sql="
    121           SELECT fum.ftblname AS lookup_table, split_part(fum.rf, ')'::text, 1) AS lookup_field,
    122              fum.ltable AS dep_table, split_part(fum.lf, ')'::text, 1) AS dep_field
    123           FROM (
    124           SELECT fee.ltable, fee.ftblname, fee.consrc, split_part(fee.consrc,'('::text, 2) AS lf,
    125             split_part(fee.consrc, '('::text, 3) AS rf
    126           FROM (
    127               SELECT foo.relname AS ltable, foo.ftblname,
    128                   pg_get_constraintdef(foo.oid) AS consrc
    129               FROM (
    130                   SELECT c.oid, c.conname AS name, t.relname, ft.relname AS ftblname
    131                   FROM pg_constraint c
    132                   JOIN pg_class t ON (t.oid = c.conrelid)
    133                   JOIN pg_class ft ON (ft.oid = c.confrelid)
    134                   JOIN pg_namespace nft ON (nft.oid = ft.relnamespace)
    135                   LEFT JOIN pg_description ds ON (ds.objoid = c.oid)
    136                   JOIN pg_namespace n ON (n.oid = t.relnamespace)
    137                   WHERE c.contype = 'f'::\"char\"
    138                   ORDER BY t.relname, n.nspname, c.conname, c.oid
    139                   ) foo
    140               ) fee) fum
    141           WHERE fum.ltable='".strtolower($table)."'
    142           ORDER BY fum.ftblname, fum.ltable, split_part(fum.lf, ')'::text, 1)
    143           ";
    144           $rs = $this->Execute($sql);
    145 
    146           if (!$rs || $rs->EOF) return false;
    147 
    148           $a = array();
    149           while (!$rs->EOF) {
    150             if ($upper) {
    151               $a[strtoupper($rs->Fields('lookup_table'))][] = strtoupper(str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')));
    152             } else {
    153               $a[$rs->Fields('lookup_table')][] = str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'));
    154             }
    155                 $rs->MoveNext();
    156           }
    157 
    158           return $a;
     154                # Regex isolates the 2 terms between parenthesis using subexpressions
     155                $regex = '^.*\((.*)\).*\((.*)\).*$';
     156                $sql="
     157                        SELECT
     158                                lookup_table,
     159                                regexp_replace(consrc, '$regex', '\\2') AS lookup_field,
     160                                dep_table,
     161                                regexp_replace(consrc, '$regex', '\\1') AS dep_field
     162                        FROM (
     163                                SELECT
     164                                        pg_get_constraintdef(c.oid) AS consrc,
     165                                        t.relname AS dep_table,
     166                                        ft.relname AS lookup_table
     167                                FROM pg_constraint c
     168                                JOIN pg_class t ON (t.oid = c.conrelid)
     169                                JOIN pg_class ft ON (ft.oid = c.confrelid)
     170                                JOIN pg_namespace nft ON (nft.oid = ft.relnamespace)
     171                                LEFT JOIN pg_description ds ON (ds.objoid = c.oid)
     172                                JOIN pg_namespace n ON (n.oid = t.relnamespace)
     173                                WHERE c.contype = 'f'::\"char\"
     174                                ORDER BY t.relname, n.nspname, c.conname, c.oid
     175                                ) constraints
     176                        WHERE
     177                                dep_table='".strtolower($table)."'
     178                        ORDER BY
     179                                lookup_table,
     180                                dep_table,
     181                                dep_field";
     182                $rs = $this->Execute($sql);
     183
     184                if (!$rs || $rs->EOF) return false;
     185
     186                $a = array();
     187                while (!$rs->EOF) {
     188                        if ($upper) {
     189                                $a[strtoupper($rs->Fields('lookup_table'))][] = strtoupper(str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')));
     190                        } else {
     191                                $a[$rs->Fields('lookup_table')][] = str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'));
     192                        }
     193                        $rs->MoveNext();
     194                }
     195
     196                return $a;
    159197
    160198        }
     
    220258                }
    221259                // check if no data returned, then no need to create real recordset
    222                 if ($rez && pg_numfields($rez) <= 0) {
     260                if ($rez && pg_num_fields($rez) <= 0) {
    223261                        if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') {
    224                                 pg_freeresult($this->_resultid);
     262                                pg_free_result($this->_resultid);
    225263                        }
    226264                        $this->_resultid = $rez;
     
    230268        }
    231269
    232          // this is a set of functions for managing client encoding - very important if the encodings
     270        // this is a set of functions for managing client encoding - very important if the encodings
    233271        // of your database and your output target (i.e. HTML) don't match
    234272        //for instance, you may have UNICODE database and server it on-site as WIN1251 etc.
     
    263301
    264302/*--------------------------------------------------------------------------------------
    265          Class Name: Recordset
     303        Class Name: Recordset
    266304--------------------------------------------------------------------------------------*/
    267305
     
    309347        function _fetch()
    310348        {
    311                 if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0)
    312                 return false;
     349                if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0) {
     350                        return false;
     351                }
    313352
    314353                $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
     
    320359
    321360                return (is_array($this->fields));
    322         }
    323 
    324                 // Create associative array
    325         function _updatefields()
    326         {
    327                 if (ADODB_ASSOC_CASE == 2) return; // native
    328 
    329                 $arr = array();
    330                 $lowercase = (ADODB_ASSOC_CASE == 0);
    331 
    332                 foreach($this->fields as $k => $v) {
    333                         if (is_integer($k)) $arr[$k] = $v;
    334                         else {
    335                                 if ($lowercase)
    336                                         $arr[strtolower($k)] = $v;
    337                                 else
    338                                         $arr[strtoupper($k)] = $v;
    339                         }
    340                 }
    341                 $this->fields = $arr;
    342361        }
    343362
Note: See TracChangeset for help on using the changeset viewer.