Ignore:
Timestamp:
09/26/13 15:41:49 (11 years ago)
Author:
angelo
Message:

Ticket #3491 - Compatibilizar Expresso com novas versoes do PHP

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/drivers/adodb-mssql.inc.php

    r34 r8222  
    11<?php 
    22/*  
    3 V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     3V5.18 3 Sep 2012  (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    44  Released under both BSD license and Lesser GPL library license.  
    55  Whenever there is any discrepancy between the two licenses,  
     
    1414         
    1515*/ 
     16 
    1617 
    1718// security - hide paths 
     
    8485        var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; 
    8586        var $metaColumnsSQL = # xtype==61 is datetime 
    86 "select c.name,t.name,c.length, 
    87         (case when c.xusertype=61 then 0 else c.xprec end), 
    88         (case when c.xusertype=61 then 0 else c.xscale end)  
     87        "select c.name,t.name,c.length,c.isnullable, c.status, 
     88                (case when c.xusertype=61 then 0 else c.xprec end), 
     89                (case when c.xusertype=61 then 0 else c.xscale end)  
    8990        from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; 
    9091        var $hasTop = 'top';            // support mssql SELECT TOP 10 * FROM TABLE 
     
    100101        var $ansiOuter = true; // for mssql7 or later 
    101102        var $poorAffectedRows = true; 
    102         var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000 
     103        var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 
    103104        var $uniqueOrderBy = true; 
    104105        var $_bindInputArray = true; 
     106        var $forceNewConnect = false; 
    105107         
    106108        function ADODB_mssql()  
     
    152154        // function, or batch. Thus, two statements are in the same scope if  
    153155        // they are in the same stored procedure, function, or batch. 
     156        if ($this->lastInsID !== false) { 
     157            return $this->lastInsID; // InsID from sp_executesql call 
     158        } else { 
    154159                        return $this->GetOne($this->identitySQL); 
    155         } 
     160                } 
     161        } 
     162 
     163 
     164 
     165        /** 
     166        * Correctly quotes a string so that all strings are escaped. We prefix and append 
     167        * to the string single-quotes. 
     168        * An example is  $db->qstr("Don't bother",magic_quotes_runtime()); 
     169        *  
     170        * @param s         the string to quote 
     171        * @param [magic_quotes]    if $s is GET/POST var, set to get_magic_quotes_gpc(). 
     172        *              This undoes the stupidity of magic quotes for GPC. 
     173        * 
     174        * @return  quoted string to be sent back to database 
     175        */ 
     176        function qstr($s,$magic_quotes=false) 
     177        { 
     178                if (!$magic_quotes) { 
     179                        return  "'".str_replace("'",$this->replaceQuote,$s)."'"; 
     180                } 
     181 
     182                // undo magic quotes for " unless sybase is on 
     183                $sybase = ini_get('magic_quotes_sybase'); 
     184                if (!$sybase) { 
     185                        $s = str_replace('\\"','"',$s); 
     186                        if ($this->replaceQuote == "\\'")  // ' already quoted, no need to change anything 
     187                                return "'$s'"; 
     188                        else {// change \' to '' for sybase/mssql 
     189                                $s = str_replace('\\\\','\\',$s); 
     190                                return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; 
     191                        } 
     192                } else { 
     193                        return "'".$s."'"; 
     194                } 
     195        } 
     196// moodle change end - see readme_moodle.txt 
    156197 
    157198        function _affectedrows() 
     
    201242         
    202243 
    203         function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) 
     244        function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) 
    204245        { 
    205246                if ($nrows > 0 && $offset <= 0) { 
    206247                        $sql = preg_replace( 
    207248                                '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); 
    208                         $rs =& $this->Execute($sql,$inputarr); 
     249                                 
     250                        if ($secs2cache) 
     251                                $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); 
     252                        else 
     253                                $rs = $this->Execute($sql,$inputarr); 
    209254                } else 
    210                         $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); 
     255                        $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); 
    211256         
    212257                return $rs; 
     
    279324                if ($this->transOff) return true;  
    280325                $this->transCnt += 1; 
    281                 $this->Execute('BEGIN TRAN'); 
    282                 return true; 
     326                $ok = $this->Execute('BEGIN TRAN'); 
     327                return $ok; 
    283328        } 
    284329                 
     
    288333                if (!$ok) return $this->RollbackTrans(); 
    289334                if ($this->transCnt) $this->transCnt -= 1; 
    290                 $this->Execute('COMMIT TRAN'); 
    291                 return true; 
     335                $ok = $this->Execute('COMMIT TRAN'); 
     336                return $ok; 
    292337        } 
    293338        function RollbackTrans() 
     
    295340                if ($this->transOff) return true;  
    296341                if ($this->transCnt) $this->transCnt -= 1; 
    297                 $this->Execute('ROLLBACK TRAN'); 
    298                 return true; 
     342                $ok = $this->Execute('ROLLBACK TRAN'); 
     343                return $ok; 
    299344        } 
    300345         
     
    322367                See http://www.swynk.com/friends/achigrik/SQL70Locks.asp 
    323368        */ 
    324         function RowLock($tables,$where,$flds='top 1 null as ignore')  
    325         { 
     369        function RowLock($tables,$where,$col='1 as adodbignore')  
     370        { 
     371                if ($col == '1 as adodbignore') $col = 'top 1 null as ignore'; 
    326372                if (!$this->transCnt) $this->BeginTrans(); 
    327                 return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where"); 
    328         } 
    329          
    330          
    331         function &MetaIndexes($table,$primary=false) 
     373                return $this->GetOne("select $col from $tables with (ROWLOCK,HOLDLOCK) where $where"); 
     374        } 
     375         
     376         
     377        function MetaColumns($table, $normalize=true) 
     378        { 
     379//              $arr = ADOConnection::MetaColumns($table); 
     380//              return $arr; 
     381 
     382                $this->_findschema($table,$schema); 
     383                if ($schema) { 
     384                        $dbName = $this->database; 
     385                        $this->SelectDB($schema); 
     386                } 
     387                global $ADODB_FETCH_MODE; 
     388                $save = $ADODB_FETCH_MODE; 
     389                $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 
     390                 
     391                if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); 
     392                $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); 
     393                 
     394                if ($schema) { 
     395                        $this->SelectDB($dbName); 
     396                } 
     397                 
     398                if (isset($savem)) $this->SetFetchMode($savem); 
     399                $ADODB_FETCH_MODE = $save; 
     400                if (!is_object($rs)) { 
     401                        $false = false; 
     402                        return $false; 
     403                } 
     404                         
     405                $retarr = array(); 
     406                while (!$rs->EOF){ 
     407                        $fld = new ADOFieldObject(); 
     408                        $fld->name = $rs->fields[0]; 
     409                        $fld->type = $rs->fields[1];             
     410                 
     411                        $fld->not_null = (!$rs->fields[3]); 
     412                        $fld->auto_increment = ($rs->fields[4] == 128);         // sys.syscolumns status field. 0x80 = 128 ref: http://msdn.microsoft.com/en-us/library/ms186816.aspx  
     413                 
     414                        if (isset($rs->fields[5]) && $rs->fields[5]) { 
     415                                if ($rs->fields[5]>0) $fld->max_length = $rs->fields[5]; 
     416                                $fld->scale = $rs->fields[6]; 
     417                                if ($fld->scale>0) $fld->max_length += 1; 
     418                        } else 
     419                                $fld->max_length = $rs->fields[2]; 
     420 
     421                        if ($save == ADODB_FETCH_NUM) { 
     422                                $retarr[] = $fld; 
     423                        } else { 
     424                                $retarr[strtoupper($fld->name)] = $fld; 
     425                        } 
     426                                $rs->MoveNext(); 
     427                        } 
     428                 
     429                        $rs->Close(); 
     430                        return $retarr;  
     431                         
     432        } 
     433         
     434         
     435        function MetaIndexes($table,$primary=false, $owner=false) 
    332436        { 
    333437                $table = $this->qstr($table); 
     
    361465                $indexes = array(); 
    362466                while ($row = $rs->FetchRow()) { 
    363                         if (!$primary && $row[5]) continue; 
     467                        if ($primary && !$row[5]) continue; 
    364468                         
    365469            $indexes[$row[0]]['unique'] = $row[6]; 
     
    386490order by constraint_name, referenced_table_name, keyno"; 
    387491                 
    388                 $constraints =& $this->GetArray($sql); 
     492                $constraints = $this->GetArray($sql); 
    389493                 
    390494                $ADODB_FETCH_MODE = $save; 
     
    432536        // "Stein-Aksel Basma" <basma@accelero.no> 
    433537        // tested with MSSQL 2000 
    434         function &MetaPrimaryKeys($table) 
     538        function MetaPrimaryKeys($table, $owner=false) 
    435539        { 
    436540        global $ADODB_FETCH_MODE; 
     
    457561 
    458562         
    459         function &MetaTables($ttype=false,$showSchema=false,$mask=false)  
     563        function MetaTables($ttype=false,$showSchema=false,$mask=false)  
    460564        { 
    461565                if ($mask) { 
     
    464568                        $this->metaTablesSQL .= " AND name like $mask"; 
    465569                } 
    466                 $ret =& ADOConnection::MetaTables($ttype,$showSchema); 
     570                $ret = ADOConnection::MetaTables($ttype,$showSchema); 
    467571                 
    468572                if ($mask) { 
     
    504608        } 
    505609         
    506         // returns true or false 
    507         function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) 
     610        // returns true or false, newconnect supported since php 5.1.0. 
     611        function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$newconnect=false) 
    508612        { 
    509613                if (!function_exists('mssql_pconnect')) return null; 
    510                 $this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword); 
     614                $this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword,$newconnect); 
    511615                if ($this->_connectionID === false) return false; 
    512616                if ($argDatabasename) return $this->SelectDB($argDatabasename); 
     
    531635        } 
    532636         
     637        function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) 
     638    { 
     639                return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true); 
     640    } 
     641 
    533642        function Prepare($sql) 
    534643        { 
     
    539648                        $sql2 .=  '@P'.($i-1) . $sqlarr[$i]; 
    540649                }  
    541                 return array($sql,$this->qstr($sql2),$max); 
    542         } 
    543          
    544         function PrepareSP($sql) 
     650                return array($sql,$this->qstr($sql2),$max,$sql2); 
     651        } 
     652         
     653        function PrepareSP($sql,$param=true) 
    545654        { 
    546655                if (!$this->_has_mssql_init) { 
     
    607716                        switch(gettype($var)) { 
    608717                        default: 
    609                         case 'string': $type = SQLCHAR; break; 
     718                        case 'string': $type = SQLVARCHAR; break; 
    610719                        case 'double': $type = SQLFLT8; break; 
    611720                        case 'integer': $type = SQLINT4; break; 
     
    655764         
    656765        // returns query ID if successful, otherwise false 
    657         function _query($sql,$inputarr) 
     766        function _query($sql,$inputarr=false) 
    658767        { 
    659768                $this->_errorMsg = false; 
     
    663772                        # see http://www.quest-pipelines.com/newsletter-v3/0402_F.htm 
    664773                        # works only with sql server 7 and newer 
     774            $getIdentity = false; 
     775            if (!is_array($sql) && preg_match('/^\\s*insert/i', $sql)) { 
     776                $getIdentity = true; 
     777                $sql .= (preg_match('/;\\s*$/i', $sql) ? ' ' : '; ') . $this->identitySQL; 
     778            } 
    665779                        if (!is_array($sql)) $sql = $this->Prepare($sql); 
    666780                        $params = ''; 
     
    702816                        if ($this->debug) ADOConnection::outp("<font size=-1>sp_executesql N{$sql[1]},N$decl,$params</font>"); 
    703817                        $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params", $this->_connectionID); 
     818            if ($getIdentity) { 
     819                $arr = @mssql_fetch_row($rez); 
     820                $this->lastInsID = isset($arr[0]) ? $arr[0] : false; 
     821                @mssql_data_seek($rez, 0); 
     822            } 
    704823                         
    705824                } else if (is_array($sql)) { 
    706825                        # PrepareSP() 
    707826                        $rez = mssql_execute($sql[1]); 
     827            $this->lastInsID = false; 
    708828                         
    709829                } else { 
    710830                        $rez = mssql_query($sql,$this->_connectionID); 
     831            $this->lastInsID = false; 
    711832                } 
    712833                return $rez; 
     
    723844         
    724845        // mssql uses a default date like Dec 30 2000 12:00AM 
    725         function UnixDate($v) 
     846        static function UnixDate($v) 
    726847        { 
    727848                return ADORecordSet_array_mssql::UnixDate($v); 
    728849        } 
    729850         
    730         function UnixTimeStamp($v) 
     851        static function UnixTimeStamp($v) 
    731852        { 
    732853                return ADORecordSet_array_mssql::UnixTimeStamp($v); 
     
    800921                fetchField() is retrieved.      */ 
    801922 
    802         function &FetchField($fieldOffset = -1)  
     923        function FetchField($fieldOffset = -1)  
    803924        { 
    804925                if ($fieldOffset != -1) { 
     
    850971                                if (ADODB_ASSOC_CASE == 0) { 
    851972                                        foreach($this->fields as $k=>$v) { 
    852                                                 $this->fields[strtolower($k)] = $v; 
     973                                                $kn = strtolower($k); 
     974                                                if ($kn <> $k) { 
     975                                                        unset($this->fields[$k]); 
     976                                                        $this->fields[$kn] = $v; 
     977                                                } 
    853978                                        } 
    854979                                } else if (ADODB_ASSOC_CASE == 1) { 
    855980                                        foreach($this->fields as $k=>$v) { 
    856                                                 $this->fields[strtoupper($k)] = $v; 
     981                                                $kn = strtoupper($k); 
     982                                                if ($kn <> $k) { 
     983                                                        unset($this->fields[$k]); 
     984                                                        $this->fields[$kn] = $v; 
     985                                                } 
    857986                                        } 
    858987                                } 
     
    8951024                        } else if (ADODB_ASSOC_CASE == 0) { 
    8961025                                foreach($this->fields as $k=>$v) { 
    897                                         $this->fields[strtolower($k)] = $v; 
     1026                                        $kn = strtolower($k); 
     1027                                        if ($kn <> $k) { 
     1028                                                unset($this->fields[$k]); 
     1029                                                $this->fields[$kn] = $v; 
     1030                                        } 
    8981031                                } 
    8991032                        } else if (ADODB_ASSOC_CASE == 1) { 
    9001033                                foreach($this->fields as $k=>$v) { 
    901                                         $this->fields[strtoupper($k)] = $v; 
     1034                                        $kn = strtoupper($k); 
     1035                                        if ($kn <> $k) { 
     1036                                                unset($this->fields[$k]); 
     1037                                                $this->fields[$kn] = $v; 
     1038                                        } 
    9021039                                } 
    9031040                        } 
     
    9181055        } 
    9191056        // mssql uses a default date like Dec 30 2000 12:00AM 
    920         function UnixDate($v) 
     1057        static function UnixDate($v) 
    9211058        { 
    9221059                return ADORecordSet_array_mssql::UnixDate($v); 
    9231060        } 
    9241061         
    925         function UnixTimeStamp($v) 
     1062        static function UnixTimeStamp($v) 
    9261063        { 
    9271064                return ADORecordSet_array_mssql::UnixTimeStamp($v); 
     
    9381075         
    9391076                // mssql uses a default date like Dec 30 2000 12:00AM 
    940         function UnixDate($v) 
     1077        static function UnixDate($v) 
    9411078        { 
    9421079         
     
    9691106        } 
    9701107         
    971         function UnixTimeStamp($v) 
     1108        static function UnixTimeStamp($v) 
    9721109        { 
    9731110         
Note: See TracChangeset for help on using the changeset viewer.