Changeset 8222 for sandbox


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

Ticket #3491 - Compatibilizar Expresso com novas versoes do PHP

Location:
sandbox/2.5.1-evolucao/phpgwapi/inc/adodb
Files:
18 added
145 edited

Legend:

Unmodified
Added
Removed
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-active-record.inc.php

    r34 r8222  
    22/* 
    33 
    4 @version V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     4@version V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    55  Latest version is available at http://adodb.sourceforge.net 
    66  
     
    1111  Active Record implementation. Superset of Zend Framework's. 
    1212   
    13   Version 0.07 
     13  Version 0.92 
    1414   
    1515  See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord  
     
    1717*/ 
    1818 
     19 
    1920global $_ADODB_ACTIVE_DBS; 
    2021global $ADODB_ACTIVE_CACHESECS; // set to true to enable caching of metadata such as field info 
    2122global $ACTIVE_RECORD_SAFETY; // set to false to disable safety checks 
     23global $ADODB_ACTIVE_DEFVALS; // use default values of table definition when creating new active record. 
    2224 
    2325// array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat 
    2426$_ADODB_ACTIVE_DBS = array(); 
    2527$ACTIVE_RECORD_SAFETY = true; 
     28$ADODB_ACTIVE_DEFVALS = false; 
     29$ADODB_ACTIVE_CACHESECS = 0; 
    2630 
    2731class ADODB_Active_DB { 
     
    3539        var $keys; // assoc array of primary keys, indexed by fieldname 
    3640        var $_created; // only used when stored as a cached file 
     41        var $_belongsTo = array(); 
     42        var $_hasMany = array(); 
    3743} 
    3844 
     45// $db = database connection 
     46// $index = name of index - can be associative, for an example see 
     47//    http://phplens.com/lens/lensforum/msgs.php?id=17790  
    3948// returns index into $_ADODB_ACTIVE_DBS 
    40 function ADODB_SetDatabaseAdapter(&$db) 
     49function ADODB_SetDatabaseAdapter(&$db, $index=false) 
    4150{ 
    4251        global $_ADODB_ACTIVE_DBS; 
     
    5261                 
    5362                $obj = new ADODB_Active_DB(); 
    54                 $obj->db =& $db; 
     63                $obj->db = $db; 
    5564                $obj->tables = array(); 
    5665                 
    57                 $_ADODB_ACTIVE_DBS[] = $obj; 
     66                if ($index == false) $index = sizeof($_ADODB_ACTIVE_DBS); 
     67 
     68                 
     69                $_ADODB_ACTIVE_DBS[$index] = $obj; 
    5870                 
    5971                return sizeof($_ADODB_ACTIVE_DBS)-1; 
     
    6274 
    6375class ADODB_Active_Record { 
     76        static $_changeNames = true; // dynamically pluralize table names 
     77        static $_quoteNames = false; 
     78         
     79        static $_foreignSuffix = '_id'; //  
    6480        var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] 
    6581        var $_table; // tablename, if set in class definition then use it as table name 
     
    6985        var $_lasterr = false; // last error message 
    7086        var $_original = false; // the original values loaded or inserted, refreshed on update 
    71          
     87 
     88        var $foreignName; // CFR: class name when in a relationship 
     89 
     90        var $lockMode = ' for update '; // you might want to change to  
     91         
     92        static function UseDefaultValues($bool=null) 
     93        { 
     94        global $ADODB_ACTIVE_DEFVALS; 
     95                if (isset($bool)) $ADODB_ACTIVE_DEFVALS = $bool; 
     96                return $ADODB_ACTIVE_DEFVALS; 
     97        } 
     98 
    7299        // should be static 
    73         function SetDatabaseAdapter(&$db)  
    74         { 
    75                 return ADODB_SetDatabaseAdapter($db); 
    76         } 
    77          
    78         // php4 constructor 
    79         function ADODB_Active_Record($table = false, $pkeyarr=false, $db=false) 
    80         { 
    81                 ADODB_Active_Record::__construct($table,$pkeyarr,$db); 
     100        static function SetDatabaseAdapter(&$db, $index=false)  
     101        { 
     102                return ADODB_SetDatabaseAdapter($db, $index); 
     103        } 
     104         
     105         
     106        public function __set($name, $value) 
     107        { 
     108                $name = str_replace(' ', '_', $name); 
     109                $this->$name = $value; 
    82110        } 
    83111         
     
    96124                        else $table = $this->_pluralize(get_class($this)); 
    97125                } 
     126                $this->foreignName = strtolower(get_class($this)); // CFR: default foreign name 
    98127                if ($db) { 
    99128                        $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); 
    100                 } else 
    101                         $this->_dbat = sizeof($_ADODB_ACTIVE_DBS)-1; 
    102                  
    103                  
    104                 if ($this->_dbat < 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); 
    105                  
     129                } else if (!isset($this->_dbat)) { 
     130                        if (sizeof($_ADODB_ACTIVE_DBS) == 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); 
     131                        end($_ADODB_ACTIVE_DBS); 
     132                        $this->_dbat = key($_ADODB_ACTIVE_DBS); 
     133                } 
     134 
    106135                $this->_table = $table; 
    107136                $this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future 
     137 
    108138                $this->UpdateActiveTable($pkeyarr); 
    109139        } 
     
    117147        function _pluralize($table) 
    118148        { 
     149                if (!ADODB_Active_Record::$_changeNames) return $table; 
     150 
    119151                $ut = strtoupper($table); 
    120152                $len = strlen($table); 
     
    136168        } 
    137169         
     170        // CFR Lamest singular inflector ever - @todo Make it real! 
     171        // Note: There is an assumption here...and it is that the argument's length >= 4 
     172        function _singularize($tables) 
     173        { 
     174         
     175                if (!ADODB_Active_Record::$_changeNames) return $table; 
     176         
     177                $ut = strtoupper($tables); 
     178                $len = strlen($tables); 
     179                if($ut[$len-1] != 'S') 
     180                        return $tables; // I know...forget oxen 
     181                if($ut[$len-2] != 'E') 
     182                        return substr($tables, 0, $len-1); 
     183                switch($ut[$len-3]) 
     184                { 
     185                        case 'S': 
     186                        case 'X': 
     187                                return substr($tables, 0, $len-2); 
     188                        case 'I': 
     189                                return substr($tables, 0, $len-3) . 'y'; 
     190                        case 'H'; 
     191                                if($ut[$len-4] == 'C' || $ut[$len-4] == 'S') 
     192                                        return substr($tables, 0, $len-2); 
     193                        default: 
     194                                return substr($tables, 0, $len-1); // ? 
     195                } 
     196        } 
     197 
     198        function hasMany($foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') 
     199        { 
     200                $ar = new $foreignClass($foreignRef); 
     201                $ar->foreignName = $foreignRef; 
     202                $ar->UpdateActiveTable(); 
     203                $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; 
     204                $table =& $this->TableInfo(); 
     205                $table->_hasMany[$foreignRef] = $ar; 
     206        #       $this->$foreignRef = $this->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get() 
     207        } 
     208         
     209        // use when you don't want ADOdb to auto-pluralize tablename 
     210        static function TableHasMany($table, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') 
     211        { 
     212                $ar = new ADODB_Active_Record($table); 
     213                $ar->hasMany($foreignRef, $foreignKey, $foreignClass); 
     214        } 
     215         
     216        // use when you don't want ADOdb to auto-pluralize tablename 
     217        static function TableKeyHasMany($table, $tablePKey, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') 
     218        { 
     219                if (!is_array($tablePKey)) $tablePKey = array($tablePKey); 
     220                $ar = new ADODB_Active_Record($table,$tablePKey); 
     221                $ar->hasMany($foreignRef, $foreignKey, $foreignClass); 
     222        } 
     223         
     224         
     225        // use when you want ADOdb to auto-pluralize tablename for you. Note that the class must already be defined. 
     226        // e.g. class Person will generate relationship for table Persons 
     227        static function ClassHasMany($parentclass, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') 
     228        { 
     229                $ar = new $parentclass(); 
     230                $ar->hasMany($foreignRef, $foreignKey, $foreignClass); 
     231        } 
     232         
     233 
     234        function belongsTo($foreignRef,$foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') 
     235        { 
     236                global $inflector; 
     237 
     238                $ar = new $parentClass($this->_pluralize($foreignRef)); 
     239                $ar->foreignName = $foreignRef; 
     240                $ar->parentKey = $parentKey; 
     241                $ar->UpdateActiveTable(); 
     242                $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; 
     243                 
     244                $table =& $this->TableInfo(); 
     245                $table->_belongsTo[$foreignRef] = $ar; 
     246        #       $this->$foreignRef = $this->_belongsTo[$foreignRef]; 
     247        } 
     248         
     249        static function ClassBelongsTo($class, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') 
     250        { 
     251                $ar = new $class(); 
     252                $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); 
     253        } 
     254         
     255        static function TableBelongsTo($table, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') 
     256        { 
     257                $ar = new ADOdb_Active_Record($table); 
     258                $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); 
     259        } 
     260         
     261        static function TableKeyBelongsTo($table, $tablePKey, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') 
     262        { 
     263                if (!is_array($tablePKey)) $tablePKey = array($tablePKey); 
     264                $ar = new ADOdb_Active_Record($table, $tablePKey); 
     265                $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); 
     266        } 
     267 
     268 
     269        /** 
     270         * __get Access properties - used for lazy loading 
     271         *  
     272         * @param mixed $name  
     273         * @access protected 
     274         * @return mixed 
     275         */ 
     276         function __get($name) 
     277        { 
     278                return $this->LoadRelations($name, '', -1, -1); 
     279        } 
     280         
     281        /** 
     282         * @param string $name  
     283         * @param string $whereOrderBy : eg. ' AND field1 = value ORDER BY field2' 
     284         * @param offset 
     285         * @param limit 
     286         * @return mixed 
     287         */ 
     288        function LoadRelations($name, $whereOrderBy='', $offset=-1,$limit=-1) 
     289        { 
     290                $extras = array(); 
     291                $table = $this->TableInfo(); 
     292                if ($limit >= 0) $extras['limit'] = $limit; 
     293                if ($offset >= 0) $extras['offset'] = $offset; 
     294                 
     295                if (strlen($whereOrderBy))  
     296                        if (!preg_match('/^[ \n\r]*AND/i',$whereOrderBy)) 
     297                                if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i',$whereOrderBy)) 
     298                                        $whereOrderBy = 'AND '.$whereOrderBy; 
     299                                 
     300                if(!empty($table->_belongsTo[$name])) 
     301                { 
     302                        $obj = $table->_belongsTo[$name]; 
     303                        $columnName = $obj->foreignKey; 
     304                        if(empty($this->$columnName)) 
     305                                $this->$name = null; 
     306                        else 
     307                        { 
     308                                if ($obj->parentKey) $key = $obj->parentKey; 
     309                                else $key = reset($table->keys); 
     310                                 
     311                                $arrayOfOne = $obj->Find($key.'='.$this->$columnName.' '.$whereOrderBy,false,false,$extras); 
     312                                if ($arrayOfOne) { 
     313                                        $this->$name = $arrayOfOne[0]; 
     314                                        return $arrayOfOne[0]; 
     315                                } 
     316                        } 
     317                } 
     318                if(!empty($table->_hasMany[$name])) 
     319                {        
     320                        $obj = $table->_hasMany[$name]; 
     321                        $key = reset($table->keys); 
     322                        $id = @$this->$key; 
     323                        if (!is_numeric($id)) { 
     324                                $db = $this->DB(); 
     325                                $id = $db->qstr($id); 
     326                        } 
     327                        $objs = $obj->Find($obj->foreignKey.'='.$id. ' '.$whereOrderBy,false,false,$extras); 
     328                        if (!$objs) $objs = array(); 
     329                        $this->$name = $objs; 
     330                        return $objs; 
     331                } 
     332                 
     333                return array(); 
     334        } 
    138335        ////////////////////////////////// 
    139336         
     
    142339        { 
    143340        global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS; 
    144          
    145                 $activedb =& $_ADODB_ACTIVE_DBS[$this->_dbat]; 
     341        global $ADODB_ACTIVE_DEFVALS,$ADODB_FETCH_MODE; 
     342 
     343                $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; 
    146344 
    147345                $table = $this->_table; 
     
    149347                $tableat = $this->_tableat; 
    150348                if (!$forceUpdate && !empty($tables[$tableat])) { 
    151                         $tobj =& $tables[$tableat]; 
    152                         foreach($tobj->flds as $name => $fld)  
     349 
     350                        $acttab = $tables[$tableat]; 
     351                        foreach($acttab->flds as $name => $fld) { 
     352                        if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value))  
     353                                $this->$name = $fld->default_value; 
     354                        else 
    153355                                $this->$name = null; 
     356                        } 
    154357                        return; 
    155358                } 
    156                  
    157                 $db =& $activedb->db; 
     359                $db = $activedb->db; 
    158360                $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache'; 
    159361                if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) { 
     
    165367                                // abs(rand()) randomizes deletion, reducing contention to delete/refresh file 
    166368                                // ideally, you should cache at least 32 secs 
     369                                 
     370                                foreach($acttab->flds as $name => $fld) { 
     371                                        if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value))  
     372                                                $this->$name = $fld->default_value; 
     373                                        else 
     374                                                $this->$name = null; 
     375                                } 
     376         
    167377                                $activedb->tables[$table] = $acttab; 
    168378                                 
     
    176386                $activetab->name = $table; 
    177387                 
     388                $save = $ADODB_FETCH_MODE; 
     389                $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; 
     390                if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); 
    178391                 
    179392                $cols = $db->MetaColumns($table); 
     393                 
     394                if (isset($savem)) $db->SetFetchMode($savem); 
     395                $ADODB_FETCH_MODE = $save; 
     396                 
    180397                if (!$cols) { 
    181398                        $this->Error("Invalid table name: $table",'UpdateActiveTable');  
     
    204421                        foreach($cols as $name => $fldobj) { 
    205422                                $name = strtolower($name); 
    206                                 $this->$name = null; 
     423                if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) 
     424                    $this->$name = $fldobj->default_value; 
     425                else 
     426                                        $this->$name = null; 
    207427                                $attr[$name] = $fldobj; 
    208428                        } 
     
    215435                        foreach($cols as $name => $fldobj) { 
    216436                                $name = strtoupper($name); 
    217                                 $this->$name = null; 
     437                
     438                if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) 
     439                    $this->$name = $fldobj->default_value; 
     440                else 
     441                                        $this->$name = null; 
    218442                                $attr[$name] = $fldobj; 
    219443                        } 
     
    226450                        foreach($cols as $name => $fldobj) { 
    227451                                $name = ($fldobj->name); 
    228                                 $this->$name = null; 
     452                 
     453                if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) 
     454                    $this->$name = $fldobj->default_value; 
     455                else 
     456                                        $this->$name = null; 
    229457                                $attr[$name] = $fldobj; 
    230458                        } 
     
    244472                        adodb_write_file($fname,$s); 
    245473                } 
     474                if (isset($activedb->tables[$table])) { 
     475                        $oldtab = $activedb->tables[$table]; 
     476                 
     477                        if ($oldtab) $activetab->_belongsTo = $oldtab->_belongsTo; 
     478                        if ($oldtab) $activetab->_hasMany = $oldtab->_hasMany; 
     479                } 
    246480                $activedb->tables[$table] = $activetab; 
    247481        } 
     
    263497                else { 
    264498                        $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; 
    265                         $db =& $activedb->db; 
     499                        $db = $activedb->db; 
    266500                } 
    267501                 
     
    297531 
    298532        // retrieve ADOConnection from _ADODB_Active_DBs 
    299         function &DB() 
     533        function DB() 
    300534        { 
    301535        global $_ADODB_ACTIVE_DBS; 
     
    307541                } 
    308542                $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; 
    309                 $db =& $activedb->db; 
     543                $db = $activedb->db; 
    310544                return $db; 
    311545        } 
     
    315549        { 
    316550        global $_ADODB_ACTIVE_DBS; 
    317          
    318551                $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; 
    319                 $table =& $activedb->tables[$this->_tableat]; 
     552                $table = $activedb->tables[$this->_tableat]; 
    320553                return $table; 
    321554        } 
     555         
     556         
     557        // I have an ON INSERT trigger on a table that sets other columns in the table. 
     558        // So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook 
     559        function Reload() 
     560        { 
     561                $db =& $this->DB(); if (!$db) return false; 
     562                $table =& $this->TableInfo(); 
     563                $where = $this->GenWhere($db, $table); 
     564                return($this->Load($where)); 
     565        } 
     566 
    322567         
    323568        // set a numeric array (using natural table field ordering) as object properties 
     
    326571        global $ACTIVE_RECORD_SAFETY; 
    327572         
    328                 $db =& $this->DB(); 
     573                $db = $this->DB(); 
    329574                 
    330575                if (!$row) { 
     
    335580                $this->_saved = true; 
    336581                 
    337                 $table =& $this->TableInfo(); 
     582                $table = $this->TableInfo(); 
    338583                if ($ACTIVE_RECORD_SAFETY && sizeof($table->flds) != sizeof($row)) { 
     584            # <AP> 
     585            $bad_size = TRUE; 
     586            if (sizeof($row) == 2 * sizeof($table->flds)) { 
     587                // Only keep string keys 
     588                $keys = array_filter(array_keys($row), 'is_string'); 
     589                if (sizeof($keys) == sizeof($table->flds)) 
     590                    $bad_size = FALSE; 
     591            } 
     592            if ($bad_size) { 
    339593                        $this->Error("Table structure of $this->_table has changed","Load"); 
    340594                        return false; 
    341595                } 
    342                  
    343                 $cnt = 0; 
     596            # </AP> 
     597                } 
     598        else 
     599                        $keys = array_keys($row); 
     600                         
     601        # <AP> 
     602        reset($keys); 
     603        $this->_original = array(); 
    344604                foreach($table->flds as $name=>$fld) { 
    345                         $this->$name = $row[$cnt]; 
    346                         $cnt += 1; 
    347                 } 
    348                 $this->_original = $row; 
     605            $value = $row[current($keys)]; 
     606                        $this->$name = $value; 
     607            $this->_original[] = $value; 
     608            next($keys); 
     609                } 
     610 
     611        # </AP> 
    349612                return true; 
    350613        } 
     
    369632        { 
    370633                switch($t) { 
    371                 case 'D': 
     634                case 'L': 
     635                        if (strpos($db->databaseType,'postgres') !== false) return $db->qstr($val); 
     636                case 'D':        
    372637                case 'T': 
    373638                        if (empty($val)) return 'null'; 
    374                          
     639                 
     640                case 'B':        
     641                case 'N': 
    375642                case 'C': 
    376643                case 'X': 
    377644                        if (is_null($val)) return 'null'; 
    378645                         
    379                         if (strncmp($val,"'",1) != 0 && substr($val,strlen($val)-1,1) != "'") {  
     646                        if (strlen($val)>0 &&  
     647                                (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) {  
    380648                                return $db->qstr($val); 
    381649                                break; 
     
    403671         
    404672         
     673        function _QName($n,$db=false) 
     674        { 
     675                if (!ADODB_Active_Record::$_quoteNames) return $n; 
     676                if (!$db) $db = $this->DB(); if (!$db) return false; 
     677                return $db->nameQuote.$n.$db->nameQuote; 
     678        } 
     679         
    405680        //------------------------------------------------------------ Public functions below 
    406681         
    407         function Load($where,$bindarr=false) 
    408         { 
    409                 $db =& $this->DB(); if (!$db) return false; 
     682        function Load($where=null,$bindarr=false, $lock = false) 
     683        { 
     684        global $ADODB_FETCH_MODE; 
     685         
     686                $db = $this->DB(); if (!$db) return false; 
    410687                $this->_where = $where; 
    411688                 
    412                 $save = $db->SetFetchMode(ADODB_FETCH_NUM); 
    413                 $row = $db->GetRow("select * from ".$this->_table.' WHERE '.$where,$bindarr); 
    414                 $db->SetFetchMode($save); 
     689                $save = $ADODB_FETCH_MODE; 
     690                $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 
     691                if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); 
     692                 
     693                $qry = "select * from ".$this->_table; 
     694                 
     695                if($where) { 
     696                        $qry .= ' WHERE '.$where; 
     697                } 
     698                if ($lock) $qry .= $this->lockMode; 
     699                 
     700                $row = $db->GetRow($qry,$bindarr); 
     701                 
     702                if (isset($savem)) $db->SetFetchMode($savem); 
     703                $ADODB_FETCH_MODE = $save; 
    415704                 
    416705                return $this->Set($row); 
    417706        } 
     707         
     708        function LoadLocked($where=null, $bindarr=false) 
     709        { 
     710                $this->Load($where,$bindarr,true); 
     711        } 
     712         
     713        # useful for multiple record inserts 
     714        # see http://phplens.com/lens/lensforum/msgs.php?id=17795 
     715        function Reset() 
     716        { 
     717        $this->_where=null; 
     718        $this->_saved = false;  
     719        $this->_lasterr = false;  
     720        $this->_original = false; 
     721        $vars=get_object_vars($this); 
     722        foreach($vars as $k=>$v){ 
     723                if(substr($k,0,1)!=='_'){ 
     724                        $this->{$k}=null; 
     725                } 
     726        } 
     727        $this->foreignName=strtolower(get_class($this)); 
     728        return true; 
     729    } 
    418730         
    419731        // false on error 
     
    426738        } 
    427739         
     740         
    428741        // false on error 
    429742        function Insert() 
    430743        { 
    431                 $db =& $this->DB(); if (!$db) return false; 
     744                $db = $this->DB(); if (!$db) return false; 
    432745                $cnt = 0; 
    433                 $table =& $this->TableInfo(); 
     746                $table = $this->TableInfo(); 
    434747                 
    435748                $valarr = array(); 
     
    439752                foreach($table->flds as $name=>$fld) { 
    440753                        $val = $this->$name; 
    441                         if(!is_null($val) || !array_key_exists($name, $table->keys)) { 
     754                        if(!is_array($val) || !is_null($val) || !array_key_exists($name, $table->keys)) { 
    442755                                $valarr[] = $val; 
    443                                 $names[] = $name; 
     756                                $names[] = $this->_QName($name,$db); 
    444757                                $valstr[] = $db->Param($cnt); 
    445758                                $cnt += 1; 
     
    479792        function Delete() 
    480793        { 
    481                 $db =& $this->DB(); if (!$db) return false; 
    482                 $table =& $this->TableInfo(); 
     794                $db = $this->DB(); if (!$db) return false; 
     795                $table = $this->TableInfo(); 
    483796                 
    484797                $where = $this->GenWhere($db,$table); 
     
    490803         
    491804        // returns an array of active record objects 
    492         function &Find($whereOrderBy,$bindarr=false,$pkeysArr=false) 
    493         { 
    494                 $db =& $this->DB(); if (!$db || empty($this->_table)) return false; 
    495                 $arr =& $db->GetActiveRecordsClass(get_class($this),$this->_table, $whereOrderBy,$bindarr,$pkeysArr); 
     805        function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()) 
     806        { 
     807                $db = $this->DB(); if (!$db || empty($this->_table)) return false; 
     808                $arr = $db->GetActiveRecordsClass(get_class($this),$this->_table, $whereOrderBy,$bindarr,$pkeysArr,$extra); 
    496809                return $arr; 
    497810        } 
     
    502815        global $ADODB_ASSOC_CASE; 
    503816                 
    504                 $db =& $this->DB(); if (!$db) return false; 
    505                 $table =& $this->TableInfo(); 
     817                $db = $this->DB(); if (!$db) return false; 
     818                $table = $this->TableInfo(); 
    506819                 
    507820                $pkey = $table->keys; 
     
    522835                continue; 
    523836            } 
     837                         
     838                        if (is_array($val)) continue; 
     839                         
    524840                        $t = $db->MetaType($fld->type); 
    525841                        $arr[$name] = $this->doquote($db,$val,$t); 
     
    533849                        foreach($pkey as $k => $v) 
    534850                                $pkey[$k] = strtolower($v); 
    535                 elseif ($ADODB_ASSOC_CASE == 0)  
     851                elseif ($ADODB_ASSOC_CASE == 1)  
    536852                        foreach($pkey as $k => $v) 
    537853                                $pkey[$k] = strtoupper($v); 
     
    554870                        } 
    555871                         
    556                         $this->_original =& $valarr; 
     872                        $this->_original = $valarr; 
    557873                }  
    558874                return $ok; 
     
    562878        function Update() 
    563879        { 
    564                 $db =& $this->DB(); if (!$db) return false; 
    565                 $table =& $this->TableInfo(); 
     880                $db = $this->DB(); if (!$db) return false; 
     881                $table = $this->TableInfo(); 
    566882                 
    567883                $where = $this->GenWhere($db, $table); 
     
    581897                        $neworig[] = $val; 
    582898                         
    583                         if (isset($table->keys[$name])) { 
     899                        if (isset($table->keys[$name]) || is_array($val))  
    584900                                continue; 
    585                         } 
    586901                         
    587902                        if (is_null($val)) { 
     
    594909                                } 
    595910                        } 
    596                          
    597                         if (isset($this->_original[$i]) && $val == $this->_original[$i]) { 
    598                                 continue; 
    599                         }                        
     911 
     912                        if (isset($this->_original[$i]) && strcmp($val,$this->_original[$i]) == 0) continue; 
     913                         
     914                        if (is_null($this->_original[$i]) && is_null($val)) continue; 
     915                         
    600916                        $valarr[] = $val; 
    601                         $pairs[] = $name.'='.$db->Param($cnt); 
     917                        $pairs[] = $this->_QName($name,$db).'='.$db->Param($cnt); 
    602918                        $cnt += 1; 
    603919                } 
     
    608924                $ok = $db->Execute($sql,$valarr); 
    609925                if ($ok) { 
    610                         $this->_original =& $neworig; 
     926                        $this->_original = $neworig; 
    611927                        return 1; 
    612928                } 
     
    616932        function GetAttributeNames() 
    617933        { 
    618                 $table =& $this->TableInfo(); 
     934                $table = $this->TableInfo(); 
    619935                if (!$table) return false; 
    620936                return array_keys($table->flds); 
     
    623939}; 
    624940 
     941function adodb_GetActiveRecordsClass(&$db, $class, $table,$whereOrderBy,$bindarr, $primkeyArr, 
     942                        $extra) 
     943{ 
     944global $_ADODB_ACTIVE_DBS; 
     945 
     946         
     947        $save = $db->SetFetchMode(ADODB_FETCH_NUM); 
     948        $qry = "select * from ".$table; 
     949         
     950        if (!empty($whereOrderBy)) 
     951                $qry .= ' WHERE '.$whereOrderBy; 
     952        if(isset($extra['limit'])) 
     953        { 
     954                $rows = false; 
     955                if(isset($extra['offset'])) { 
     956                        $rs = $db->SelectLimit($qry, $extra['limit'], $extra['offset'],$bindarr); 
     957                } else { 
     958                        $rs = $db->SelectLimit($qry, $extra['limit'],-1,$bindarr); 
     959                } 
     960                if ($rs) { 
     961                        while (!$rs->EOF) { 
     962                                $rows[] = $rs->fields; 
     963                                $rs->MoveNext(); 
     964                        } 
     965                } 
     966        } else 
     967                $rows = $db->GetAll($qry,$bindarr); 
     968 
     969        $db->SetFetchMode($save); 
     970         
     971        $false = false; 
     972         
     973        if ($rows === false) {   
     974                return $false; 
     975        } 
     976         
     977 
     978        if (!class_exists($class)) { 
     979                $db->outp_throw("Unknown class $class in GetActiveRecordsClass()",'GetActiveRecordsClass'); 
     980                return $false; 
     981        } 
     982        $arr = array(); 
     983        // arrRef will be the structure that knows about our objects. 
     984        // It is an associative array. 
     985        // We will, however, return arr, preserving regular 0.. order so that 
     986        // obj[0] can be used by app developpers. 
     987        $arrRef = array(); 
     988        $bTos = array(); // Will store belongTo's indices if any 
     989        foreach($rows as $row) { 
     990         
     991                $obj = new $class($table,$primkeyArr,$db); 
     992                if ($obj->ErrorNo()){ 
     993                        $db->_errorMsg = $obj->ErrorMsg(); 
     994                        return $false; 
     995                } 
     996                $obj->Set($row); 
     997                $arr[] = $obj; 
     998        } // foreach($rows as $row)  
     999 
     1000        return $arr; 
     1001} 
    6251002?> 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-csvlib.inc.php

    r34 r8222  
    99/*  
    1010 
    11   V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     11  V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    1212  Released under both BSD license and Lesser GPL library license.  
    1313  Whenever there is any discrepancy between the two licenses,  
     
    5555                 
    5656                if ($rs->databaseType == 'array') { 
    57                         $rows =& $rs->_array; 
     57                        $rows = $rs->_array; 
    5858                } else { 
    5959                        $rows = array(); 
     
    6565                 
    6666                for($i=0; $i < $max; $i++) { 
    67                         $o =& $rs->FetchField($i); 
     67                        $o = $rs->FetchField($i); 
    6868                        $flds[] = $o; 
    6969                } 
     
    7272                $class = $rs->connection->arrayClass; 
    7373                $rs2 = new $class(); 
     74                $rs2->timeCreated = $rs->timeCreated; # memcache fix 
    7475                $rs2->sql = $rs->sql; 
    7576                $rs2->oldProvider = $rs->dataProvider;  
     
    9192*                       empty recordset is returned 
    9293*/ 
    93         function &csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array') 
     94        function csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array') 
    9495        { 
    9596                $false = false; 
     
    262263        /** 
    263264        * Save a file $filename and its $contents (normally for caching) with file locking 
     265        * Returns true if ok, false if fopen/fwrite error, 0 if rename error (eg. file is locked) 
    264266        */ 
    265267        function adodb_write_file($filename, $contents,$debug=false) 
     
    281283                        // getmypid() actually returns 0 on Win98 - never mind! 
    282284                        $tmpname = $filename.uniqid($mtime).getmypid(); 
    283                         if (!($fd = @fopen($tmpname,'a'))) return false; 
    284                         $ok = ftruncate($fd,0);                  
    285                         if (!fwrite($fd,$contents)) $ok = false; 
     285                        if (!($fd = @fopen($tmpname,'w'))) return false; 
     286                        if (fwrite($fd,$contents)) $ok = true; 
     287                        else $ok = false; 
    286288                        fclose($fd); 
    287                         chmod($tmpname,0644); 
    288                         // the tricky moment 
    289                         @unlink($filename); 
    290                         if (!@rename($tmpname,$filename)) { 
    291                                 unlink($tmpname); 
    292                                 $ok = false; 
    293                         } 
    294                         if (!$ok) { 
    295                                 if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed')); 
     289                         
     290                        if ($ok) { 
     291                                @chmod($tmpname,0644); 
     292                                // the tricky moment 
     293                                @unlink($filename); 
     294                                if (!@rename($tmpname,$filename)) { 
     295                                        unlink($tmpname); 
     296                                        $ok = 0; 
     297                                } 
     298                                if (!$ok) { 
     299                                        if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed')); 
     300                                } 
    296301                        } 
    297302                        return $ok; 
     
    299304                if (!($fd = @fopen($filename, 'a'))) return false; 
    300305                if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) { 
    301                         $ok = fwrite( $fd, $contents ); 
     306                        if (fwrite( $fd, $contents )) $ok = true; 
     307                        else $ok = false; 
    302308                        fclose($fd); 
    303                         chmod($filename,0644); 
     309                        @chmod($filename,0644); 
    304310                }else { 
    305311                        fclose($fd); 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-datadict.inc.php

    r6057 r8222  
    22 
    33/** 
    4   V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     4  V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    55  Released under both BSD license and Lesser GPL library license.  
    66  Whenever there is any discrepancy between the two licenses,  
     
    216216        } 
    217217         
    218  
    219218        function MetaType($t,$len=-1,$fieldobj=false) 
    220219        {                
     
    232231                'INTERVAL' => 'C',  # Postgres 
    233232                'MACADDR' => 'C', # postgres 
     233                'VAR_STRING' => 'C', # mysql 
    234234                ## 
    235235                'LONGCHAR' => 'X', 
     
    259259                'DATETIME' => 'T', 
    260260                'TIMESTAMPTZ' => 'T', 
     261                'SMALLDATETIME' => 'T', 
    261262                'T' => 'T', 
    262263                'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql 
     
    370371        { 
    371372                $rez = 2; 
    372                 $conn = &$this->connection; 
     373                $conn = $this->connection; 
    373374                $saved = $conn->debug; 
    374375                foreach($sql as $line) { 
     
    519520                        if ($lines == null) $lines = array(); 
    520521                        list(,$first) = each($lines); 
    521                         list(,$column_def) = preg_split('/[\t ]+/',$first,2); 
     522                        list(,$column_def) = preg_split("/[\t ]+/",$first,2); 
    522523                } 
    523524                return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def)); 
     
    589590                return $sql; 
    590591        } 
     592                 
     593         
    591594         
    592595        function _GenFields($flds,$widespacing=false) 
     
    814817         
    815818        // return string must begin with space 
    816         function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint) 
     819        function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) 
    817820        {        
    818821                $suffix = ''; 
     
    913916        } 
    914917         
     918         
     919        function _getSizePrec($size) 
     920        { 
     921                $fsize = false; 
     922                $fprec = false; 
     923                $dotat = strpos($size,'.'); 
     924                if ($dotat === false) $dotat = strpos($size,','); 
     925                if ($dotat === false) $fsize = $size; 
     926                else { 
     927                        $fsize = substr($size,0,$dotat); 
     928                        $fprec = substr($size,$dotat+1); 
     929                } 
     930                return array($fsize, $fprec); 
     931        } 
     932         
    915933        /** 
    916934        "Florian Buzin [ easywe ]" <florian.buzin#easywe.de> 
     
    919937        have to know if the col is new or not. It will check on its own. 
    920938        */ 
    921         function ChangeTableSQL($tablename, $flds, $tableoptions = false) 
     939        function ChangeTableSQL($tablename, $flds, $tableoptions = false, $dropOldFlds=false) 
    922940        { 
    923941        global $ADODB_FETCH_MODE; 
     
    952970                                        if (isset($obj->not_null) && $obj->not_null) 
    953971                                                $v = str_replace('NOT NULL','',$v); 
    954  
     972                                        if (isset($obj->auto_increment) && $obj->auto_increment && empty($v['AUTOINCREMENT']))  
     973                                            $v = str_replace('AUTOINCREMENT','',$v); 
     974                                         
    955975                                        $c = $cols[$k]; 
    956976                                        $ml = $c->max_length; 
    957977                                        $mt = $this->MetaType($c->type,$ml); 
     978                                         
     979                                        if (isset($c->scale)) $sc = $c->scale; 
     980                                        else $sc = 99; // always force change if scale not known. 
     981                                         
     982                                        if ($sc == -1) $sc = false; 
     983                                        list($fsize, $fprec) = $this->_getSizePrec($v['SIZE']); 
     984 
    958985                                        if ($ml == -1) $ml = ''; 
    959986                                        if ($mt == 'X') $ml = $v['SIZE']; 
    960                                         if (($mt != $v['TYPE']) ||  $ml != $v['SIZE']) { 
     987                                        if (($mt != $v['TYPE']) || ($ml != $fsize || $sc != $fprec) || (isset($v['AUTOINCREMENT']) && $v['AUTOINCREMENT'] != $obj->auto_increment)) { 
    961988                                                $holdflds[$k] = $v; 
    962989                                        } 
     
    9821009                                 
    9831010                                //  We are trying to change the size of the field, if not allowed, simply ignore the request. 
    984                                 if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) { 
    985                                         echo "<h3>$this->alterCol cannot be changed to $flds currently</h3>"; 
     1011                                // $flds[1] holds the type, $flds[2] holds the size -postnuke addition 
     1012                                if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4) 
     1013                                 && (isset($flds[0][2]) && is_numeric($flds[0][2]))) { 
     1014                                        if ($this->debug) ADOConnection::outp(sprintf("<h3>%s cannot be changed to %s currently</h3>", $flds[0][0], $flds[0][1])); 
     1015                                        #echo "<h3>$this->alterCol cannot be changed to $flds currently</h3>"; 
    9861016                                        continue;         
    9871017                                } 
     
    9921022                } 
    9931023                 
     1024                if ($dropOldFlds) { 
     1025                        foreach ( $cols as $id => $v ) 
     1026                            if ( !isset($lines[$id]) )  
     1027                                        $sql[] = $alter . $this->dropCol . ' ' . $v->name; 
     1028                } 
    9941029                return $sql; 
    9951030        } 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-error.inc.php

    r34 r8222  
    11<?php 
    22/**  
    3  * @version V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     3 * @version V5.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,  
     
    4242        define("DB_ERROR_NOSUCHDB",           -25); 
    4343        define("DB_ERROR_ACCESS_VIOLATION",   -26); 
     44        define("DB_ERROR_DEADLOCK",           -27); 
     45        define("DB_ERROR_STATEMENT_TIMEOUT",  -28); 
     46        define("DB_ERROR_SERIALIZATION_FAILURE", -29); 
    4447} 
    4548 
     
    9295{ 
    9396        if (is_numeric($errormsg)) return (integer) $errormsg; 
     97        // Postgres has no lock-wait timeout.  The best we could do would be to set a statement timeout. 
    9498    static $error_regexps = array( 
    95             '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => DB_ERROR_NOSUCHTABLE, 
    96             '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/'      => DB_ERROR_ALREADY_EXISTS, 
    97             '/divide by zero$/'                     => DB_ERROR_DIVZERO, 
    98             '/pg_atoi: error in .*: can\'t parse /' => DB_ERROR_INVALID_NUMBER, 
    99             '/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => DB_ERROR_NOSUCHFIELD, 
    100             '/parser: parse error at or near \"/'   => DB_ERROR_SYNTAX, 
    101             '/referential integrity violation/'     => DB_ERROR_CONSTRAINT, 
    102                         '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/'      
    103                                  => DB_ERROR_ALREADY_EXISTS 
     99            '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/i' => DB_ERROR_NOSUCHTABLE, 
     100            '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key.*violates unique constraint/i'     => DB_ERROR_ALREADY_EXISTS, 
     101            '/database ".+" does not exist$/i'       => DB_ERROR_NOSUCHDB, 
     102            '/(divide|division) by zero$/i'          => DB_ERROR_DIVZERO, 
     103            '/pg_atoi: error in .*: can\'t parse /i' => DB_ERROR_INVALID_NUMBER, 
     104            '/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/i' => DB_ERROR_NOSUCHFIELD, 
     105            '/(parser: parse|syntax) error at or near \"/i'   => DB_ERROR_SYNTAX, 
     106            '/referential integrity violation/i'     => DB_ERROR_CONSTRAINT, 
     107            '/deadlock detected$/i'                  => DB_ERROR_DEADLOCK, 
     108            '/canceling statement due to statement timeout$/i' => DB_ERROR_STATEMENT_TIMEOUT, 
     109            '/could not serialize access due to/i'   => DB_ERROR_SERIALIZATION_FAILURE 
    104110        ); 
    105111        reset($error_regexps); 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-errorhandler.inc.php

    r34 r8222  
    11<?php 
    22/** 
    3  * @version V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     3 * @version V5.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, 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-errorpear.inc.php

    r34 r8222  
    11<?php 
    22/**  
    3  * @version V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     3 * @version V5.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,  
     
    7979* occured several sql statements ago. 
    8080*/ 
    81 function &ADODB_PEAR_Error() 
     81function ADODB_PEAR_Error() 
    8282{ 
    8383global $ADODB_Last_PEAR_Error; 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-exceptions.inc.php

    r34 r8222  
    22 
    33/** 
    4  * @version V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     4 * @version V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    55 * Released under both BSD license and Lesser GPL library license. 
    66 * Whenever there is any discrepancy between the two licenses, 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-iterator.inc.php

    r34 r8222  
    22 
    33/* 
    4   V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     4  V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    55  Released under both BSD license and Lesser GPL library license.  
    66  Whenever there is any discrepancy between the two licenses,  
     
    1919                 
    2020        Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2 
     21         
     22         
     23        Moved to adodb.inc.php to improve performance. 
    2124 */ 
    2225  
    2326 
    24  class ADODB_Iterator implements Iterator { 
    2527 
    26     private $rs; 
    27  
    28     function __construct($rs)  
    29         { 
    30         $this->rs = $rs; 
    31     } 
    32     function rewind()  
    33         { 
    34         $this->rs->MoveFirst(); 
    35     } 
    36  
    37         function valid()  
    38         { 
    39         return !$this->rs->EOF; 
    40     } 
    41          
    42     function key()  
    43         { 
    44         return $this->rs->_currentRow; 
    45     } 
    46          
    47     function current()  
    48         { 
    49         return $this->rs->fields; 
    50     } 
    51          
    52     function next()  
    53         { 
    54         $this->rs->MoveNext(); 
    55     } 
    56          
    57         function __call($func, $params) 
    58         { 
    59                 return call_user_func_array(array($this->rs, $func), $params); 
    60         } 
    61  
    62          
    63         function hasMore() 
    64         { 
    65                 return !$this->rs->EOF; 
    66         } 
    67  
    68 } 
    69  
    70  
    71 class ADODB_BASE_RS implements IteratorAggregate { 
    72     function getIterator() { 
    73         return new ADODB_Iterator($this); 
    74     } 
    75          
    76         /* this is experimental - i don't really know what to return... */ 
    77         function __toString() 
    78         { 
    79                 include_once(ADODB_DIR.'/toexport.inc.php'); 
    80                 return _adodb_export($this,',',',',false,true); 
    81         } 
    82 }  
    8328 
    8429 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-lib.inc.php

    r34 r8222  
    11<?php 
    2  
    32// security - hide paths 
    43if (!defined('ADODB_DIR')) die(); 
     
    87 
    98/*  
    10  @version V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim\@natsoft.com.my). All rights reserved. 
     9  @version V5.18 3 Sep 2012  (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    1110  Released under both BSD license and Lesser GPL library license.  
    1211  Whenever there is any discrepancy between the two licenses,  
     
    1716*/  
    1817 
     18function adodb_strip_order_by($sql) 
     19{ 
     20        $rez = preg_match('/(\sORDER\s+BY\s[^)]*)/is',$sql,$arr); 
     21        if ($arr) 
     22                if (strpos($arr[0],'(') !== false) { 
     23                        $at = strpos($sql,$arr[0]); 
     24                        $cntin = 0; 
     25                        for ($i=$at, $max=strlen($sql); $i < $max; $i++) { 
     26                                $ch = $sql[$i]; 
     27                                if ($ch == '(') { 
     28                                        $cntin += 1; 
     29                                } elseif($ch == ')') { 
     30                                        $cntin -= 1; 
     31                                        if ($cntin < 0) { 
     32                                                break; 
     33                                        } 
     34                                } 
     35                        } 
     36                        $sql = substr($sql,0,$at).substr($sql,$i); 
     37                } else 
     38                        $sql = str_replace($arr[0], '', $sql);  
     39        return $sql; 
     40 } 
     41 
     42if (false) { 
     43        $sql = 'select * from (select a from b order by a(b),b(c) desc)'; 
     44        $sql = '(select * from abc order by 1)'; 
     45        die(adodb_strip_order_by($sql)); 
     46} 
     47 
    1948function adodb_probetypes(&$array,&$types,$probe=8) 
    2049{ 
     
    2655         
    2756        for ($j=0;$j < $max; $j++) { 
    28                 $row =& $array[$j]; 
     57                $row = $array[$j]; 
    2958                if (!$row) break; 
    3059                $i = -1; 
     
    112141                } 
    113142                foreach($fieldArray as $k => $v) { 
    114                         if ($autoQuote && !is_numeric($v) and strncmp($v,"'",1) !== 0 and strcasecmp($v,$zthis->null2null)!=0) { 
     143                        if ($v === null) { 
     144                                $v = 'NULL'; 
     145                                $fieldArray[$k] = $v; 
     146                        } else if ($autoQuote && /*!is_numeric($v) /*and strncmp($v,"'",1) !== 0 -- sql injection risk*/ strcasecmp($v,$zthis->null2null)!=0) { 
    115147                                $v = $zthis->qstr($v); 
    116148                                $fieldArray[$k] = $v; 
     
    124156                                $uSet .= ",$k=$v"; 
    125157                } 
    126                   
     158                 
    127159                $where = false; 
    128160                foreach ($keyCol as $v) { 
     
    370402                preg_match('/\s+GROUP\s+BY\s+/is',$sql) ||  
    371403                preg_match('/\s+UNION\s+/is',$sql)) { 
     404                 
     405                $rewritesql = adodb_strip_order_by($sql); 
     406                 
    372407                // ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias 
    373408                // but this is only supported by oracle and postgresql... 
    374409                if ($zthis->dataProvider == 'oci8') { 
    375                          
    376                         $rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$sql); 
    377                          
    378410                        // Allow Oracle hints to be used for query optimization, Chris Wrye 
    379411                        if (preg_match('#/\\*+.*?\\*\\/#', $sql, $hint)) { 
     
    382414                                $rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")";  
    383415                         
    384                 } else if (strncmp($zthis->databaseType,'postgres',8) == 0)  { 
    385                         $rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$sql); 
     416                } else if (strncmp($zthis->databaseType,'postgres',8) == 0 || strncmp($zthis->databaseType,'mysql',5) == 0)  { 
    386417                        $rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_"; 
     418                } else { 
     419                        $rewritesql = "SELECT COUNT(*) FROM ($rewritesql)"; 
    387420                } 
    388421        } else { 
     
    390423                $rewritesql = preg_replace( 
    391424                                        '/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql); 
    392  
    393                  
    394                  
    395425                // fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails  
    396426                // with mssql, access and postgresql. Also a good speedup optimization - skips sorting! 
    397427                // also see http://phplens.com/lens/lensforum/msgs.php?id=12752 
    398                 if (preg_match('/\sORDER\s+BY\s*\(/i',$rewritesql)) 
    399                         $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$rewritesql); 
    400                 else 
    401                         $rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$rewritesql); 
    402         } 
    403          
    404          
     428                $rewritesql = adodb_strip_order_by($rewritesql); 
     429        } 
    405430         
    406431        if (isset($rewritesql) && $rewritesql != $sql) { 
    407                 if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[1]; 
     432                if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; 
    408433                  
    409434                if ($secs2cache) { 
     
    423448        // strip off unneeded ORDER BY if no UNION 
    424449        if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql; 
    425         else $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);  
     450        else $rewritesql = $rewritesql = adodb_strip_order_by($sql);  
    426451         
    427452        if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; 
    428453                 
    429         $rstest = &$zthis->Execute($rewritesql,$inputarr); 
    430         if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr); 
    431          
     454        if ($secs2cache) { 
     455                $rstest = $zthis->CacheExecute($secs2cache,$rewritesql,$inputarr); 
     456                if (!$rstest) $rstest = $zthis->CacheExecute($secs2cache,$sql,$inputarr); 
     457        } else { 
     458                $rstest = $zthis->Execute($rewritesql,$inputarr); 
     459                if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr); 
     460        } 
    432461        if ($rstest) { 
    433462                        $qryRecs = $rstest->RecordCount(); 
     
    461490        rarely change. 
    462491*/ 
    463 function &_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page,  
     492function _adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page,  
    464493                                                $inputarr=false, $secs2cache=0)  
    465494{ 
     
    497526        $offset = $nrows * ($page-1); 
    498527        if ($secs2cache > 0)  
    499                 $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); 
     528                $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); 
    500529        else  
    501                 $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); 
     530                $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); 
    502531 
    503532         
     
    515544 
    516545// Iván Oliva version 
    517 function &_adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0)  
     546function _adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0)  
    518547{ 
    519548 
     
    531560        $pagecounter = $page + 1; 
    532561        $pagecounteroffset = ($pagecounter * $nrows) - $nrows; 
    533         if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); 
    534         else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); 
     562        if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); 
     563        else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); 
    535564        if ($rstest) { 
    536565                while ($rstest && $rstest->EOF && $pagecounter>0) { 
     
    539568                        $pagecounteroffset = $nrows * ($pagecounter - 1); 
    540569                        $rstest->Close(); 
    541                         if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); 
    542                         else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); 
     570                        if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); 
     571                        else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); 
    543572                } 
    544573                if ($rstest) $rstest->Close(); 
     
    552581        // We get the data we want 
    553582        $offset = $nrows * ($page-1); 
    554         if ($secs2cache > 0) $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); 
    555         else $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); 
     583        if ($secs2cache > 0) $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); 
     584        else $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); 
    556585         
    557586        // Before returning the RecordSet, we set the pagination properties we need 
     
    615644                                        } 
    616645                                         
    617                                         if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) 
    618                                                 $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; 
    619                                         else 
     646                                        if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) { 
     647                                                switch (ADODB_QUOTE_FIELDNAMES) { 
     648                                                case 'LOWER': 
     649                                                        $fnameq = $zthis->nameQuote.strtolower($field->name).$zthis->nameQuote;break; 
     650                                                case 'NATIVE': 
     651                                                        $fnameq = $zthis->nameQuote.$field->name.$zthis->nameQuote;break; 
     652                                                case 'UPPER': 
     653                                                default: 
     654                                                        $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;break; 
     655                                                } 
     656                                        } else 
    620657                                                $fnameq = $upperfname; 
    621658                                         
     
    748785                $rsclass = $zthis->rsPrefix.$zthis->databaseType; 
    749786                $recordSet = new $rsclass(-1,$zthis->fetchMode); 
    750                 $recordSet->connection = &$zthis; 
     787                $recordSet->connection = $zthis; 
    751788                 
    752789                if (is_string($cacheRS) && $cacheRS == $rs) { 
    753                         $columns =& $cacheCols; 
     790                        $columns = $cacheCols; 
    754791                } else { 
    755792                        $columns = $zthis->MetaColumns( $tableName ); 
     
    759796        } else if (is_subclass_of($rs, 'adorecordset')) { 
    760797                if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) { 
    761                         $columns =& $cacheCols; 
     798                        $columns = $cacheCols; 
    762799                } else { 
    763800                        for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++)  
     
    767804                        $rs->insertSig = $cacheSig++; 
    768805                } 
    769                 $recordSet =& $rs; 
     806                $recordSet = $rs; 
    770807         
    771808        } else { 
     
    779816                if (adodb_key_exists($upperfname,$arrFields,$force)) { 
    780817                        $bad = false; 
    781                         if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) 
    782                                 $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; 
    783                         else 
     818                        if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) { 
     819                                switch (ADODB_QUOTE_FIELDNAMES) { 
     820                                case 'LOWER': 
     821                                        $fnameq = $zthis->nameQuote.strtolower($field->name).$zthis->nameQuote;break; 
     822                                case 'NATIVE': 
     823                                        $fnameq = $zthis->nameQuote.$field->name.$zthis->nameQuote;break; 
     824                                case 'UPPER': 
     825                                default: 
     826                                        $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;break; 
     827                                } 
     828                        } else 
    784829                                $fnameq = $upperfname; 
    785830                         
     
    9691014                        break; 
    9701015 
    971                  
    9721016                case "T": 
    9731017                        $val = $zthis->DBTimeStamp($arrFields[$fname]); 
    974             break; 
    975  
     1018                        break; 
     1019                         
    9761020                case "N": 
    977                     $val = (float) $arrFields[$fname]; 
     1021                    $val = $arrFields[$fname]; 
     1022                        if (!is_numeric($val)) $val = str_replace(',', '.', (float)$val); 
    9781023                    break; 
    9791024 
    9801025                case "I": 
    9811026                case "R": 
    982                     $val = (int) $arrFields[$fname]; 
     1027                    $val = $arrFields[$fname]; 
     1028                        if (!is_numeric($val)) $val = (integer) $val; 
    9831029                    break; 
    9841030 
     
    10041050                foreach($inputarr as $kk=>$vv) { 
    10051051                        if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...'; 
    1006                         $ss .= "($kk=>'$vv') "; 
     1052                        if (is_null($vv)) $ss .= "($kk=>null) "; 
     1053                        else $ss .= "($kk=>'$vv') "; 
    10071054                } 
    10081055                $ss = "[ $ss ]"; 
     
    10231070                } 
    10241071                if ($zthis->debug === -1) 
    1025                         ADOConnection::outp( "<br />\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<br />\n",false); 
    1026                 else  
    1027                         ADOConnection::outp( "<hr />\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr />\n",false); 
     1072                        ADOConnection::outp( "<br>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<br>\n",false); 
     1073                else if ($zthis->debug !== -99) 
     1074                        ADOConnection::outp( "<hr>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr>\n",false); 
    10281075        } else { 
    1029                 ADOConnection::outp("-----\n($dbt): ".$sqlTxt."\n-----\n",false); 
     1076                $ss = "\n   ".$ss; 
     1077                if ($zthis->debug !== -99) 
     1078                        ADOConnection::outp("-----<hr>\n($dbt): ".$sqlTxt." $ss\n-----<hr>\n",false); 
    10301079        } 
    10311080 
     
    10381087        if ($zthis->databaseType == 'mssql') {  
    10391088        // ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6 
     1089         
    10401090                if($emsg = $zthis->ErrorMsg()) { 
    1041                         if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg); 
     1091                        if ($err = $zthis->ErrorNo()) { 
     1092                                if ($zthis->debug === -99)  
     1093                                        ADOConnection::outp( "<hr>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr>\n",false); 
     1094                 
     1095                                ADOConnection::outp($err.': '.$emsg); 
     1096                        } 
    10421097                } 
    10431098        } else if (!$qID) { 
     1099         
     1100                if ($zthis->debug === -99)  
     1101                                if ($inBrowser) ADOConnection::outp( "<hr>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr>\n",false); 
     1102                                else ADOConnection::outp("-----<hr>\n($dbt): ".$sqlTxt."$ss\n-----<hr>\n",false); 
     1103                                 
    10441104                ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg()); 
    10451105        } 
     
    10501110 
    10511111# pretty print the debug_backtrace function 
    1052 function _adodb_backtrace($printOrArr=true,$levels=9999,$skippy=0) 
     1112function _adodb_backtrace($printOrArr=true,$levels=9999,$skippy=0,$ishtml=null) 
    10531113{ 
    10541114        if (!function_exists('debug_backtrace')) return ''; 
    10551115          
    1056         $html =  (isset($_SERVER['HTTP_USER_AGENT'])); 
     1116        if ($ishtml === null) $html =  (isset($_SERVER['HTTP_USER_AGENT'])); 
     1117        else $html = $ishtml; 
     1118         
    10571119        $fmt =  ($html) ? "</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" : "%% line %4d, file: %s"; 
    10581120 
     
    10851147                        else { 
    10861148                                $v = (string) @$v; 
    1087                                 $str = htmlspecialchars(substr($v,0,$MAXSTRLEN)); 
     1149                                $str = htmlspecialchars(str_replace(array("\r","\n"),' ',substr($v,0,$MAXSTRLEN))); 
    10881150                                if (strlen($v) > $MAXSTRLEN) $str .= '...'; 
    10891151                                $args[] = $str; 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-memcache.lib.inc.php

    r34 r8222  
    77$ADODB_INCLUDED_MEMCACHE = 1; 
    88 
     9global $ADODB_INCLUDED_CSV; 
     10if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); 
     11 
    912/*  
    1013 
    11   V4.90 8 June 2006  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     14  V5.18 3 Sep 2012  (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    1215  Released under both BSD license and Lesser GPL library license.  
    1316  Whenever there is any discrepancy between the two licenses,  
     
    1619   
    1720  Latest version is available at http://adodb.sourceforge.net 
     21 
     22Usage: 
    1823   
     24$db = NewADOConnection($driver); 
     25$db->memCache = true; /// should we use memCache instead of caching in files 
     26$db->memCacheHost = array($ip1, $ip2, $ip3); 
     27$db->memCachePort = 11211; /// this is default memCache port 
     28$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) 
     29 
     30$db->Connect(...); 
     31$db->CacheExecute($sql); 
     32   
     33  Note the memcache class is shared by all connections, is created during the first call to Connect/PConnect. 
     34   
     35  Class instance is stored in $ADODB_CACHE 
    1936*/ 
    2037 
    21         function &getmemcache($key,&$err, $timeout=0, $host, $port) 
    22         { 
    23                 $false = false; 
    24                 $err = false; 
     38        class ADODB_Cache_MemCache { 
     39                var $createdir = false; // create caching directory structure? 
     40                 
     41                //----------------------------- 
     42                // memcache specific variables 
     43                 
     44                var $hosts;     // array of hosts 
     45                var $port = 11211; 
     46                var $compress = false; // memcache compression with zlib 
     47                 
     48                var $_connected = false; 
     49                var $_memcache = false; 
     50                 
     51                function ADODB_Cache_MemCache(&$obj) 
     52                { 
     53                        $this->hosts = $obj->memCacheHost; 
     54                        $this->port = $obj->memCachePort; 
     55                        $this->compress = $obj->memCacheCompress; 
     56                } 
     57                 
     58                // implement as lazy connection. The connection only occurs on CacheExecute call 
     59                function connect(&$err) 
     60                { 
     61                        if (!function_exists('memcache_pconnect')) { 
     62                                $err = 'Memcache module PECL extension not found!'; 
     63                                return false; 
     64                        } 
    2565 
    26                 if (!function_exists('memcache_pconnect')) { 
    27                         $err = 'Memcache module PECL extension not found!'; 
    28                         return $false; 
     66                        $memcache = new MemCache; 
     67                         
     68                        if (!is_array($this->hosts)) $this->hosts = array($this->hosts); 
     69                 
     70                        $failcnt = 0; 
     71                        foreach($this->hosts as $host) { 
     72                                if (!@$memcache->addServer($host,$this->port,true)) { 
     73                                        $failcnt += 1; 
     74                                } 
     75                        } 
     76                        if ($failcnt == sizeof($this->hosts)) { 
     77                                $err = 'Can\'t connect to any memcache server'; 
     78                                return false; 
     79                        } 
     80                        $this->_connected = true; 
     81                        $this->_memcache = $memcache; 
     82                        return true; 
    2983                } 
    30  
    31                 $memcache = new Memcache; 
    32                 if (!@$memcache->pconnect($host, $port)) { 
    33                         $err = 'Can\'t connect to memcache server on: '.$host.':'.$port; 
    34                         return $false; 
     84                 
     85                // returns true or false. true if successful save 
     86                function writecache($filename, $contents, $debug, $secs2cache) 
     87                { 
     88                        if (!$this->_connected) { 
     89                                $err = ''; 
     90                                if (!$this->connect($err) && $debug) ADOConnection::outp($err); 
     91                        } 
     92                        if (!$this->_memcache) return false; 
     93                         
     94                        if (!$this->_memcache->set($filename, $contents, $this->compress ? MEMCACHE_COMPRESSED : 0, $secs2cache)) { 
     95                                if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n"); 
     96                                return false; 
     97                        } 
     98                         
     99                        return true; 
    35100                } 
    36  
    37                 $rs = $memcache->get($key); 
    38                 if (!$rs) { 
    39                         $err = 'Item with such key doesn\'t exists on the memcached server.'; 
    40                         return $false; 
     101                 
     102                // returns a recordset 
     103                function readcache($filename, &$err, $secs2cache, $rsClass) 
     104                { 
     105                        $false = false; 
     106                        if (!$this->_connected) $this->connect($err); 
     107                        if (!$this->_memcache) return $false; 
     108                         
     109                        $rs = $this->_memcache->get($filename); 
     110                        if (!$rs) { 
     111                                $err = 'Item with such key doesn\'t exists on the memcached server.'; 
     112                                return $false; 
     113                        } 
     114                         
     115                        // hack, should actually use _csv2rs 
     116                        $rs = explode("\n", $rs); 
     117            unset($rs[0]); 
     118            $rs = join("\n", $rs); 
     119                        $rs = unserialize($rs); 
     120                        if (! is_object($rs)) { 
     121                                $err = 'Unable to unserialize $rs';              
     122                                return $false; 
     123                        } 
     124                        if ($rs->timeCreated == 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere 
     125                         
     126                        $tdiff = intval($rs->timeCreated+$secs2cache - time()); 
     127                        if ($tdiff <= 2) { 
     128                                switch($tdiff) { 
     129                                        case 2:  
     130                                                if ((rand() & 15) == 0) { 
     131                                                        $err = "Timeout 2"; 
     132                                                        return $false; 
     133                                                } 
     134                                                break; 
     135                                        case 1: 
     136                                                if ((rand() & 3) == 0) { 
     137                                                        $err = "Timeout 1"; 
     138                                                        return $false; 
     139                                                } 
     140                                                break; 
     141                                        default:  
     142                                                $err = "Timeout 0"; 
     143                                                return $false; 
     144                                } 
     145                        } 
     146                        return $rs; 
    41147                } 
    42  
    43                 $tdiff = intval($rs->timeCreated+$timeout - time()); 
    44                 if ($tdiff <= 2) { 
    45                         switch($tdiff) { 
    46                                 case 2:  
    47                                         if ((rand() & 15) == 0) { 
    48                                                 $err = "Timeout 2"; 
    49                                                 return $false; 
    50                                         } 
    51                                         break; 
    52                                 case 1: 
    53                                         if ((rand() & 3) == 0) { 
    54                                                 $err = "Timeout 1"; 
    55                                                 return $false; 
    56                                         } 
    57                                         break; 
    58                                 default:  
    59                                         $err = "Timeout 0"; 
    60                                         return $false; 
     148                 
     149                function flushall($debug=false) 
     150                { 
     151                        if (!$this->_connected) { 
     152                                $err = ''; 
     153                                if (!$this->connect($err) && $debug) ADOConnection::outp($err); 
    61154                        } 
     155                        if (!$this->_memcache) return false; 
     156                         
     157                        $del = $this->_memcache->flush(); 
     158                         
     159                        if ($debug)  
     160                                if (!$del) ADOConnection::outp("flushall: failed!<br>\n"); 
     161                                else ADOConnection::outp("flushall: succeeded!<br>\n"); 
     162                                 
     163                        return $del; 
    62164                } 
    63                 return $rs; 
     165                 
     166                function flushcache($filename, $debug=false) 
     167                { 
     168                        if (!$this->_connected) { 
     169                                $err = ''; 
     170                                if (!$this->connect($err) && $debug) ADOConnection::outp($err);  
     171                        }  
     172                        if (!$this->_memcache) return false; 
     173   
     174                        $del = $this->_memcache->delete($filename); 
     175                         
     176                        if ($debug)  
     177                                if (!$del) ADOConnection::outp("flushcache: $key entry doesn't exist on memcached server!<br>\n"); 
     178                                else ADOConnection::outp("flushcache: $key entry flushed from memcached server!<br>\n"); 
     179                                 
     180                        return $del; 
     181                } 
     182                 
     183                // not used for memcache 
     184                function createdir($dir, $hash)  
     185                { 
     186                        return true; 
     187                } 
    64188        } 
    65189 
    66         function putmemcache($key, $rs, $host, $port, $compress, $debug=false) 
    67         { 
    68                 $false = false; 
    69                 $true = true; 
    70  
    71                 if (!function_exists('memcache_pconnect')) { 
    72                         if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!<br>\n"); 
    73                         return $false; 
    74                 } 
    75  
    76                 $memcache = new Memcache; 
    77                 if (!@$memcache->pconnect($host, $port)) { 
    78                         if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port<br>\n"); 
    79                         return $false; 
    80                 } 
    81  
    82                 $rs->timeCreated = time(); 
    83                 if (!$memcache->set($key, $rs, $compress, 0)) { 
    84                         if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n"); 
    85                         return $false; 
    86                 } 
    87                 return $true; 
    88         } 
    89  
    90         function flushmemcache($key=false, $host, $port, $debug=false) 
    91         { 
    92                 if (!function_exists('memcache_pconnect')) { 
    93                         if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!<br>\n"); 
    94                         return; 
    95                 } 
    96  
    97                 $memcache = new Memcache; 
    98                 if (!@$memcache->pconnect($host, $port)) { 
    99                         if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port<br>\n"); 
    100                         return; 
    101                 } 
    102  
    103                 if ($key) { 
    104                         if (!$memcache->delete($key)) { 
    105                                 if ($debug) ADOConnection::outp("CacheFlush: $key entery doesn't exist on memcached server!<br>\n"); 
    106                         } else { 
    107                                 if ($debug) ADOConnection::outp("CacheFlush: $key entery flushed from memcached server!<br>\n"); 
    108                         } 
    109                 } else { 
    110                         if (!$memcache->flush()) { 
    111                                 if ($debug) ADOConnection::outp("CacheFlush: Failure flushing all enteries from memcached server!<br>\n"); 
    112                         } else { 
    113                                 if ($debug) ADOConnection::outp("CacheFlush: All enteries flushed from memcached server!<br>\n"); 
    114                         } 
    115                 } 
    116                 return; 
    117         } 
    118190?> 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-pager.inc.php

    r34 r8222  
    22 
    33/* 
    4         V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     4        V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    55          Released under both BSD license and Lesser GPL library license.  
    66          Whenever there is any discrepancy between the two licenses,  
     
    6161         
    6262                $curr_page = $id.'_curr_page'; 
    63                 if (empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks 
     63                if (!empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks 
    6464                 
    6565                $this->sql = $sql; 
     
    248248                if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true; 
    249249                if ($this->cache) 
    250                         $rs = &$this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page); 
     250                        $rs = $this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page); 
    251251                else 
    252                         $rs = &$this->db->PageExecute($this->sql,$rows,$this->curr_page); 
     252                        $rs = $this->db->PageExecute($this->sql,$rows,$this->curr_page); 
    253253                $ADODB_COUNTRECS = $savec; 
    254254                 
    255                 $this->rs = &$rs; 
     255                $this->rs = $rs; 
    256256                if (!$rs) { 
    257257                        print "<h3>Query failed: $this->sql</h3>"; 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-pear.inc.php

    r34 r8222  
    11<?php 
    22/**  
    3  * @version V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     3 * @version V5.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,  
     
    110110         */ 
    111111 
    112         function &factory($type) 
     112        function factory($type) 
    113113        { 
    114114                include_once(ADODB_DIR."/drivers/adodb-$type.inc.php"); 
    115                 $obj = &NewADOConnection($type); 
    116                 if (!is_object($obj)) $obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); 
     115                $obj = NewADOConnection($type); 
     116                if (!is_object($obj)) $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); 
    117117                return $obj; 
    118118        } 
     
    137137         * @see DB::isError 
    138138         */ 
    139         function &connect($dsn, $options = false) 
     139        function connect($dsn, $options = false) 
    140140        { 
    141141                if (is_array($dsn)) { 
     
    158158                } 
    159159 
    160                 @$obj =& NewADOConnection($type); 
     160                @$obj = NewADOConnection($type); 
    161161                if (!is_object($obj)) { 
    162                         $obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); 
     162                        $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); 
    163163                        return $obj; 
    164164                } 
     
    212212        { 
    213213                if (!is_object($value)) return false; 
    214                 $class = get_class($value); 
     214                $class = strtolower(get_class($value)); 
    215215                return $class == 'pear_error' || is_subclass_of($value, 'pear_error') ||  
    216216                                $class == 'db_error' || is_subclass_of($value, 'db_error'); 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-perf.inc.php

    r6057 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,  
     
    2323define( 'ADODB_OPT_LOW', 1); 
    2424 
     25global $ADODB_PERF_MIN; 
     26$ADODB_PERF_MIN = 0.05; // log only if >= minimum number of secs to run 
     27 
     28 
    2529// returns in K the memory of current process, or 0 if not known 
    2630function adodb_getmem() 
     
    5458} 
    5559 
    56 /* return microtime value as a float */ 
     60/* obsolete: return microtime value as a float. Retained for backward compat */ 
    5761function adodb_microtime() 
    5862{ 
    59         $t = microtime(); 
    60         $t = explode(' ',$t); 
    61         return (float)$t[1]+ (float)$t[0]; 
     63        return microtime(true); 
    6264} 
    6365 
    6466/* sql code timing */ 
    65 function& adodb_log_sql(&$connx,$sql,$inputarr) 
     67function adodb_log_sql(&$connx,$sql,$inputarr) 
    6668{ 
    6769    $perf_table = adodb_perf::table(); 
    6870        $connx->fnExecute = false; 
    69         $t0 = microtime(); 
    70         $rs =& $connx->Execute($sql,$inputarr); 
    71         $t1 = microtime(); 
     71        $a0 = microtime(true); 
     72        $rs = $connx->Execute($sql,$inputarr); 
     73        $a1 = microtime(true); 
    7274 
    7375        if (!empty($connx->_logsql) && (empty($connx->_logsqlErrors) || !$rs)) { 
     
    7577         
    7678                if (!empty($ADODB_LOG_CONN)) { 
    77                         $conn = &$ADODB_LOG_CONN; 
     79                        $conn = $ADODB_LOG_CONN; 
    7880                        if ($conn->databaseType != $connx->databaseType) 
    7981                                $prefix = '/*dbx='.$connx->databaseType .'*/ '; 
     
    8183                                $prefix = ''; 
    8284                } else { 
    83                         $conn =& $connx; 
     85                        $conn = $connx; 
    8486                        $prefix = ''; 
    8587                } 
     
    8789                $conn->_logsql = false; // disable logsql error simulation 
    8890                $dbT = $conn->databaseType; 
    89                  
    90                 $a0 = preg_split('/ /',$t0); 
    91                 $a0 = (float)$a0[1]+(float)$a0[0]; 
    92                  
    93                 $a1 = preg_split('/ /',$t1); 
    94                 $a1 = (float)$a1[1]+(float)$a1[0]; 
    9591                 
    9692                $time = $a1 - $a0; 
     
    114110                if (isset($_SERVER['HTTP_HOST'])) { 
    115111                        $tracer .= '<br>'.$_SERVER['HTTP_HOST']; 
    116                         if (isset($_SERVER['PHP_SELF'])) $tracer .= $_SERVER['PHP_SELF']; 
     112                        if (isset($_SERVER['PHP_SELF'])) $tracer .= htmlspecialchars($_SERVER['PHP_SELF']); 
    117113                } else  
    118                         if (isset($_SERVER['PHP_SELF'])) $tracer .= '<br>'.$_SERVER['PHP_SELF']; 
     114                        if (isset($_SERVER['PHP_SELF'])) $tracer .= '<br>'.htmlspecialchars($_SERVER['PHP_SELF']); 
    119115                //$tracer .= (string) adodb_backtrace(false); 
    120116                 
     
    166162                        $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)"; 
    167163                } 
    168                 $ok = $conn->Execute($isql,$arr); 
     164                 
     165                global $ADODB_PERF_MIN; 
     166                if ($errN != 0 || $time >= $ADODB_PERF_MIN) { 
     167                        $ok = $conn->Execute($isql,$arr); 
     168                } else 
     169                        $ok = true; 
     170                 
    169171                $conn->debug = $saved; 
    170172                 
     
    174176                        $err2 = $conn->ErrorMsg(); 
    175177                        $conn->_logsql = true; // enable logsql error simulation 
    176                         $perf =& NewPerfMonitor($conn); 
     178                        $perf = NewPerfMonitor($conn); 
    177179                        if ($perf) { 
    178180                                if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr); 
     
    228230         
    229231    // Sets the tablename to be used             
    230     function table($newtable = false) 
     232    static function table($newtable = false) 
    231233    { 
    232234        static $_table; 
     
    255257*/ 
    256258                // Algorithm is taken from 
    257                 // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp 
     259                // http://social.technet.microsoft.com/Forums/en-US/winservergen/thread/414b0e1b-499c-411e-8a02-6a12e339c0f1/ 
    258260                if (strncmp(PHP_OS,'WIN',3)==0) { 
    259261                        if (PHP_VERSION == '5.0.0') return false; 
     
    263265                        if (PHP_VERSION == '4.3.10') return false; # see http://bugs.php.net/bug.php?id=31737 
    264266                         
    265                         @$c = new COM("WinMgmts:{impersonationLevel=impersonate}!Win32_PerfRawData_PerfOS_Processor.Name='_Total'"); 
    266                         if (!$c) return false; 
    267                          
    268                         $info[0] = $c->PercentProcessorTime; 
    269                         $info[1] = 0; 
    270                         $info[2] = 0; 
    271                         $info[3] = $c->TimeStamp_Sys100NS; 
    272                         //print_r($info); 
     267                        static $FAIL = false; 
     268                        if ($FAIL) return false; 
     269                         
     270                        $objName = "winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\CIMV2";       
     271                        $myQuery = "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name = '_Total'"; 
     272                         
     273                        try { 
     274                                @$objWMIService = new COM($objName); 
     275                                if (!$objWMIService) { 
     276                                        $FAIL = true; 
     277                                        return false; 
     278                                } 
     279                 
     280                                $info[0] = -1; 
     281                                $info[1] = 0; 
     282                                $info[2] = 0; 
     283                                $info[3] = 0; 
     284                                foreach($objWMIService->ExecQuery($myQuery) as $objItem)  { 
     285                                                $info[0] = $objItem->PercentProcessorTime(); 
     286                                } 
     287                         
     288                        } catch(Exception $e) { 
     289                                $FAIL = true; 
     290                                echo $e->getMessage(); 
     291                                return false; 
     292                        } 
     293                         
    273294                        return $info; 
    274295                } 
     
    333354                $info = $this->_CPULoad(); 
    334355                if (!$info) return false; 
    335                          
    336                 if (empty($this->_lastLoad)) { 
    337                         sleep(1); 
     356                 
     357                if (strncmp(PHP_OS,'WIN',3)==0) { 
     358                        return (integer) $info[0]; 
     359                }else { 
     360                        if (empty($this->_lastLoad)) { 
     361                                sleep(1); 
     362                                $this->_lastLoad = $info; 
     363                                $info = $this->_CPULoad(); 
     364                        } 
     365                         
     366                        $last = $this->_lastLoad; 
    338367                        $this->_lastLoad = $info; 
    339                         $info = $this->_CPULoad(); 
    340                 } 
    341                  
    342                 $last = $this->_lastLoad; 
    343                 $this->_lastLoad = $info; 
    344                  
    345                 $d_user = $info[0] - $last[0]; 
    346                 $d_nice = $info[1] - $last[1]; 
    347                 $d_system = $info[2] - $last[2]; 
    348                 $d_idle = $info[3] - $last[3]; 
    349                  
    350                 //printf("Delta - User: %f  Nice: %f  System: %f  Idle: %f<br>",$d_user,$d_nice,$d_system,$d_idle); 
    351  
    352                 if (strncmp(PHP_OS,'WIN',3)==0) { 
    353                         if ($d_idle < 1) $d_idle = 1; 
    354                         return 100*(1-$d_user/$d_idle); 
    355                 }else { 
     368                         
     369                        $d_user = $info[0] - $last[0]; 
     370                        $d_nice = $info[1] - $last[1]; 
     371                        $d_system = $info[2] - $last[2]; 
     372                        $d_idle = $info[3] - $last[3]; 
     373                         
     374                        //printf("Delta - User: %f  Nice: %f  System: %f  Idle: %f<br>",$d_user,$d_nice,$d_system,$d_idle); 
     375                 
    356376                        $total=$d_user+$d_nice+$d_system+$d_idle; 
    357377                        if ($total<1) $total=1; 
     
    409429                $this->conn->fnExecute = false; 
    410430        $perf_table = adodb_perf::table(); 
    411                 $rs =& $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql); 
     431                $rs = $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql); 
    412432                $this->conn->fnExecute = $saveE; 
    413433                if ($rs) { 
     
    443463                        if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); 
    444464                        //$this->conn->debug=1; 
    445                         $rs =& $this->conn->SelectLimit( 
     465                        $rs = $this->conn->SelectLimit( 
    446466                        "select avg(timer) as avg_timer,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer 
    447467                                from $perf_table 
     
    522542                        if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); 
    523543                         
    524                         $rs =& $this->conn->SelectLimit( 
     544                        $rs = $this->conn->SelectLimit( 
    525545                        "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer 
    526546                                from $perf_table 
     
    571591                Raw function returning array of poll paramters 
    572592        */ 
    573         function &PollParameters() 
     593        function PollParameters() 
    574594        { 
    575595                $arr[0] = (float)$this->DBParameter('data cache hit ratio'); 
     
    641661        } 
    642662         
     663        function clearsql() 
     664        { 
     665                $perf_table = adodb_perf::table(); 
     666                $this->conn->Execute("delete from $perf_table where created<".$this->conn->sysTimeStamp); 
     667        } 
    643668        /***********************************************************************************************/ 
    644669        //                                    HIGH LEVEL UI FUNCTIONS 
     
    648673        function UI($pollsecs=5) 
    649674        { 
     675        global $ADODB_LOG_CONN; 
    650676         
    651677    $perf_table = adodb_perf::table(); 
     
    660686        $info = $conn->ServerInfo(); 
    661687        if (isset($_GET['clearsql'])) { 
    662                 $this->conn->Execute("delete from $perf_table"); 
     688                $this->clearsql(); 
    663689        } 
    664690        $this->conn->LogSQL($savelog); 
     
    689715         
    690716        $allowsql = !defined('ADODB_PERF_NO_RUN_SQL'); 
     717        global $ADODB_PERF_MIN; 
     718        $app .= " (Min sql timing \$ADODB_PERF_MIN=$ADODB_PERF_MIN secs)"; 
    691719         
    692720        if  (empty($_GET['hidem'])) 
     
    703731                default: 
    704732                case 'stats': 
     733                        if (empty($ADODB_LOG_CONN)) 
     734                                echo "<p>&nbsp; <a href=\"?do=viewsql&clearsql=1\">Clear SQL Log</a><br>"; 
    705735                        echo $this->HealthCheck(); 
    706736                        //$this->conn->debug=1; 
    707                         echo $this->CheckMemory(); 
     737                        echo $this->CheckMemory();               
    708738                        break; 
    709739                case 'poll': 
     740                        $self = htmlspecialchars($_SERVER['PHP_SELF']); 
    710741                        echo "<iframe width=720 height=80%  
    711                                 src=\"{$_SERVER['PHP_SELF']}?do=poll2&hidem=1\"></iframe>"; 
     742                                src=\"{$self}?do=poll2&hidem=1\"></iframe>"; 
    712743                        break; 
    713744                case 'poll2': 
     
    744775                if ($secs <= 1) $secs = 1; 
    745776                echo "Accumulating statistics, every $secs seconds...\n";flush(); 
    746                 $arro =& $this->PollParameters(); 
     777                $arro = $this->PollParameters(); 
    747778                $cnt = 0; 
    748779                set_time_limit(0); 
     
    750781                while (1) { 
    751782 
    752                         $arr =& $this->PollParameters(); 
     783                        $arr = $this->PollParameters(); 
    753784                         
    754785                        $hits   = sprintf('%2.2f',$arr[0]); 
     
    886917         
    887918                 
    888                 $PHP_SELF = $_SERVER['PHP_SELF']; 
     919                $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); 
    889920                $sql = isset($_REQUEST['sql']) ? $_REQUEST['sql'] : ''; 
    890921 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-php4.inc.php

    r34 r8222  
    22 
    33/* 
    4   V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     4  V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    55  Released under both BSD license and Lesser GPL library license.  
    66  Whenever there is any discrepancy between the two licenses,  
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-time.inc.php

    r34 r8222  
    7474FUNCTION DESCRIPTIONS 
    7575 
     76** FUNCTION adodb_time() 
     77 
     78Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) as an unsigned integer. 
    7679 
    7780** FUNCTION adodb_getdate($date=false) 
     
    242245 
    243246CHANGELOG 
     247- 16 Jan 2011 0.36 
     248Added adodb_time() which returns current time. If > 2038, will return as float 
     249 
     250- 7 Feb 2011 0.35 
     251Changed adodb_date to be symmetric with adodb_mktime. See $jan1_71. fix for bc.  
     252 
     253- 13 July 2010 0.34 
     254Changed adodb_get_gm_diff to use DateTimeZone(). 
     255 
     256- 11 Feb 2008 0.33 
     257* Bug in 0.32 fix for hour handling. Fixed. 
     258 
     259- 1 Feb 2008 0.32 
     260* Now adodb_mktime(0,0,0,12+$m,20,2040) works properly.  
     261 
     262- 10 Jan 2008 0.31 
     263* Now adodb_mktime(0,0,0,24,1,2037) works correctly. 
     264 
     265- 15 July 2007 0.30 
     266Added PHP 5.2.0 compatability fixes.  
     267 * gmtime behaviour for 1970 has changed. We use the actual date if it is between 1970 to 2038 to get the 
     268 * timezone, otherwise we use the current year as the baseline to retrieve the timezone. 
     269 * Also the timezone's in php 5.2.* support historical data better, eg. if timezone today was +8, but  
     270   in 1970 it was +7:30, then php 5.2 return +7:30, while this library will use +8. 
     271 *  
     272  
    244273- 19 March 2006 0.24 
    245274Changed strftime() locale detection, because some locales prepend the day of week to the date when %c is used. 
     
    369398        Version Number 
    370399*/ 
    371 define('ADODB_DATE_VERSION',0.24); 
     400define('ADODB_DATE_VERSION',0.35); 
     401 
     402$ADODB_DATETIME_CLASS = (PHP_VERSION >= 5.2); 
    372403 
    373404/* 
     
    388419function adodb_date_test_date($y1,$m,$d=13) 
    389420{ 
    390         $t = adodb_mktime(0,0,0,$m,$d,$y1); 
     421        $h = round(rand()% 24); 
     422        $t = adodb_mktime($h,0,0,$m,$d,$y1); 
    391423        $rez = adodb_date('Y-n-j H:i:s',$t); 
    392         if ("$y1-$m-$d 00:00:00" != $rez) { 
    393                 print "<b>$y1 error, expected=$y1-$m-$d 00:00:00, adodb=$rez</b><br>"; 
     424        if ($h == 0) $h = '00'; 
     425        else if ($h < 10) $h = '0'.$h; 
     426        if ("$y1-$m-$d $h:00:00" != $rez) { 
     427                print "<b>$y1 error, expected=$y1-$m-$d $h:00:00, adodb=$rez</b><br>"; 
    394428                return false; 
    395429        } 
     
    404438        if ($s1 == $s2) return true; 
    405439         
    406         echo "error for $fmt,  strftime=$s1, $adodb=$s2<br>"; 
     440        echo "error for $fmt,  strftime=$s1, adodb=$s2<br>"; 
    407441        return false; 
    408442} 
     
    410444/** 
    411445         Test Suite 
    412 */ 
     446*/       
    413447function adodb_date_test() 
    414448{ 
     449         
     450        for ($m=-24; $m<=24; $m++) 
     451                echo "$m :",adodb_date('d-m-Y',adodb_mktime(0,0,0,1+$m,20,2040)),"<br>"; 
    415452         
    416453        error_reporting(E_ALL); 
     
    421458        // This flag disables calling of PHP native functions, so we can properly test the code 
    422459        if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1); 
     460         
     461        $t = time(); 
     462         
     463         
     464        $fmt = 'Y-m-d H:i:s'; 
     465        echo '<pre>'; 
     466        echo 'adodb: ',adodb_date($fmt,$t),'<br>'; 
     467        echo 'php  : ',date($fmt,$t),'<br>'; 
     468        echo '</pre>'; 
    423469         
    424470        adodb_date_test_strftime('%Y %m %x %X'); 
     
    481527        // Test string formating 
    482528        print "<p>Testing date formating</p>"; 
     529         
    483530        $fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003'; 
    484531        $s1 = date($fmt,0); 
     
    566613} 
    567614 
     615function adodb_time() 
     616{ 
     617        $d = new DateTime(); 
     618        return $d->format('U'); 
     619} 
     620 
    568621/** 
    569622        Returns day of week, 0 = Sunday,... 6=Saturday.  
     
    658711} 
    659712 
     713function adodb_get_gmt_diff_ts($ts)  
     714{ 
     715        if (0 <= $ts && $ts <= 0x7FFFFFFF) { // check if number in 32-bit signed range) { 
     716                $arr = getdate($ts); 
     717                $y = $arr['year']; 
     718                $m = $arr['mon']; 
     719                $d = $arr['mday']; 
     720                return adodb_get_gmt_diff($y,$m,$d);     
     721        } else { 
     722                return adodb_get_gmt_diff(false,false,false); 
     723        } 
     724         
     725} 
     726 
    660727/** 
    661  get local time zone offset from GMT 
     728 get local time zone offset from GMT. Does not handle historical timezones before 1970. 
    662729*/ 
    663 function adodb_get_gmt_diff()  
    664 { 
    665 static $TZ; 
    666         if (isset($TZ)) return $TZ; 
    667          
    668         $TZ = mktime(0,0,0,1,2,1970,0) - gmmktime(0,0,0,1,2,1970,0); 
     730function adodb_get_gmt_diff($y,$m,$d)  
     731{ 
     732static $TZ,$tzo; 
     733global $ADODB_DATETIME_CLASS; 
     734 
     735        if (!defined('ADODB_TEST_DATES')) $y = false; 
     736        else if ($y < 1970 || $y >= 2038) $y = false; 
     737 
     738        if ($ADODB_DATETIME_CLASS && $y !== false) { 
     739                $dt = new DateTime(); 
     740                $dt->setISODate($y,$m,$d); 
     741                if (empty($tzo)) { 
     742                        $tzo = new DateTimeZone(date_default_timezone_get()); 
     743                #       $tzt = timezone_transitions_get( $tzo ); 
     744                } 
     745                return -$tzo->getOffset($dt); 
     746        } else { 
     747                if (isset($TZ)) return $TZ; 
     748                $y = date('Y'); 
     749                /* 
     750                if (function_exists('date_default_timezone_get') && function_exists('timezone_offset_get')) { 
     751                        $tzonename = date_default_timezone_get(); 
     752                        if ($tzonename) { 
     753                                $tobj = new DateTimeZone($tzonename); 
     754                                $TZ = -timezone_offset_get($tobj,new DateTime("now",$tzo)); 
     755                        } 
     756                }  
     757                */ 
     758                if (empty($TZ)) $TZ = mktime(0,0,0,12,2,$y) - gmmktime(0,0,0,12,2,$y); 
     759        } 
    669760        return $TZ; 
    670761} 
     
    713804global $_month_table_normal,$_month_table_leaf; 
    714805 
    715         if (_adodb_is_leap_year($y)) $marr =& $_month_table_leaf; 
    716         else $marr =& $_month_table_normal; 
     806        if (_adodb_is_leap_year($y)) $marr = $_month_table_leaf; 
     807        else $marr = $_month_table_normal; 
    717808         
    718809        if ($m > 12 || $m < 1) return false; 
     
    737828global $_month_table_normal,$_month_table_leaf; 
    738829 
    739         $d =  $origd - ($is_gmt ? 0 : adodb_get_gmt_diff()); 
    740          
     830        $d =  $origd - ($is_gmt ? 0 : adodb_get_gmt_diff_ts($origd)); 
    741831        $_day_power = 86400; 
    742832        $_hour_power = 3600; 
     
    9281018        ); 
    9291019} 
     1020/* 
     1021                if ($isphp5) 
     1022                                $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);  
     1023                        else 
     1024                                $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36);  
     1025                        break;*/ 
     1026function adodb_tz_offset($gmt,$isphp5) 
     1027{ 
     1028        $zhrs = abs($gmt)/3600; 
     1029        $hrs = floor($zhrs); 
     1030        if ($isphp5)  
     1031                return sprintf('%s%02d%02d',($gmt<=0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60);  
     1032        else 
     1033                return sprintf('%s%02d%02d',($gmt<0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60);  
     1034} 
     1035 
    9301036 
    9311037function adodb_gmdate($fmt,$d=false) 
     
    9591065{ 
    9601066static $daylight; 
    961  
     1067global $ADODB_DATETIME_CLASS; 
     1068static $jan1_1971; 
     1069 
     1070 
     1071        if (!isset($daylight)) { 
     1072                $daylight = function_exists('adodb_daylight_sv'); 
     1073                if (empty($jan1_1971)) $jan1_1971 = mktime(0,0,0,1,1,1971); // we only use date() when > 1970 as adodb_mktime() only uses mktime() when > 1970 
     1074        } 
     1075         
    9621076        if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt); 
    9631077        if (!defined('ADODB_TEST_DATES')) { 
    9641078                if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range 
    965                         if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer 
     1079                 
     1080                        if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= $jan1_1971) // if windows, must be +ve integer 
    9661081                                return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d); 
    9671082 
     
    9721087        $arr = _adodb_getdate($d,true,$is_gmt); 
    9731088         
    974         if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv'); 
    9751089        if ($daylight) adodb_daylight_sv($arr, $is_gmt); 
    9761090         
     
    9931107        for ($i=0; $i < $max; $i++) { 
    9941108                switch($fmt[$i]) { 
    995                 case 'T': $dates .= date('T');break; 
     1109                case 'e': 
     1110                        $dates .= date('e'); 
     1111                        break; 
     1112                case 'T':  
     1113                        if ($ADODB_DATETIME_CLASS) { 
     1114                                $dt = new DateTime(); 
     1115                                $dt->SetDate($year,$month,$day); 
     1116                                $dates .= $dt->Format('T'); 
     1117                        } else 
     1118                                $dates .= date('T'); 
     1119                        break; 
    9961120                // YEAR 
    9971121                case 'L': $dates .= $arr['leap'] ? '1' : '0'; break; 
     
    10091133                        if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs; 
    10101134                         
    1011                         $gmt = adodb_get_gmt_diff(); 
    1012                         if ($isphp5)  
    1013                                 $dates .= sprintf(' %s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);  
    1014                         else 
    1015                                 $dates .= sprintf(' %s%04d',($gmt<0)?'+':'-',abs($gmt)/36);  
     1135                        $gmt = adodb_get_gmt_diff($year,$month,$day); 
     1136                         
     1137                        $dates .= ' '.adodb_tz_offset($gmt,$isphp5); 
    10161138                        break; 
    1017                                  
     1139                         
    10181140                case 'Y': $dates .= $year; break; 
    10191141                case 'y': $dates .= substr($year,strlen($year)-2,2); break; 
     
    10421164                // HOUR 
    10431165                case 'Z': 
    1044                         $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff(); break; 
     1166                        $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff($year,$month,$day); break; 
    10451167                case 'O':  
    1046                         $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff(); 
    1047                          
    1048                         if ($isphp5) 
    1049                                 $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);  
    1050                         else 
    1051                                 $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36);  
     1168                        $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$month,$day); 
     1169                         
     1170                        $dates .= adodb_tz_offset($gmt,$isphp5); 
    10521171                        break; 
    10531172                         
     
    11311250                // for windows, we don't check 1970 because with timezone differences,  
    11321251                // 1 Jan 1970 could generate negative timestamp, which is illegal 
    1133                 if (1971 < $year && $year < 2038 
     1252                $usephpfns = (1970 < $year && $year < 2038 
    11341253                        || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038) 
    1135                         ) { 
     1254                        );  
     1255                         
     1256                 
     1257                if ($usephpfns && ($year + $mon/12+$day/365.25+$hr/(24*365.25) >= 2038)) $usephpfns = false; 
     1258                         
     1259                if ($usephpfns) { 
    11361260                                return $is_gmt ? 
    11371261                                        @gmmktime($hr,$min,$sec,$mon,$day,$year): 
    11381262                                        @mktime($hr,$min,$sec,$mon,$day,$year); 
    1139                         } 
    1140         } 
    1141          
    1142         $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff(); 
     1263                } 
     1264        } 
     1265         
     1266        $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$mon,$day); 
    11431267 
    11441268        /* 
     
    11571281 
    11581282        if ($mon > 12) { 
    1159                 $y = floor($mon / 12); 
     1283                $y = floor(($mon-1)/ 12); 
    11601284                $year += $y; 
    11611285                $mon -= $y*12; 
     
    13331457        return $ret; 
    13341458} 
    1335  
    1336  
    13371459?> 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-xmlschema.inc.php

    r34 r8222  
    1111 * XML schema. 
    1212 * 
    13  * Last Editor: $Author$ 
     13 * Last Editor: $Author: jlim $ 
    1414 * @author Richard Tango-Lowy & Dan Cech 
    15  * @version $Revision$ 
     15 * @version $Revision: 1.12 $ 
    1616 * 
    1717 * @package axmls 
     
    120120        */ 
    121121        function dbObject( &$parent, $attributes = NULL ) { 
    122                 $this->parent =& $parent; 
     122                $this->parent = $parent; 
    123123        } 
    124124         
     
    150150        } 
    151151         
    152         function create() { 
     152        function create(&$xmls) { 
    153153                return array(); 
    154154        } 
     
    250250        */ 
    251251        function dbTable( &$parent, $attributes = NULL ) { 
    252                 $this->parent =& $parent; 
     252                $this->parent = $parent; 
    253253                $this->name = $this->prefix($attributes['NAME']); 
    254254        } 
     
    363363        * @return object dbIndex object 
    364364        */ 
    365         function &addIndex( $attributes ) { 
     365        function addIndex( $attributes ) { 
    366366                $name = strtoupper( $attributes['NAME'] ); 
    367                 $this->indexes[$name] =& new dbIndex( $this, $attributes ); 
     367                $this->indexes[$name] = new dbIndex( $this, $attributes ); 
    368368                return $this->indexes[$name]; 
    369369        } 
     
    375375        * @return object dbData object 
    376376        */ 
    377         function &addData( $attributes ) { 
     377        function addData( $attributes ) { 
    378378                if( !isset( $this->data ) ) { 
    379                         $this->data =& new dbData( $this, $attributes ); 
     379                        $this->data = new dbData( $this, $attributes ); 
    380380                } 
    381381                return $this->data; 
     
    464464        */ 
    465465        function addTableOpt( $opt ) { 
    466                 $this->opts[] = $opt; 
    467                  
     466                if(isset($this->currentPlatform)) { 
     467                        $this->opts[$this->parent->db->databaseType] = $opt; 
     468                } 
    468469                return $this->opts; 
    469470        } 
     471 
    470472         
    471473        /** 
     
    642644        */ 
    643645        function dbIndex( &$parent, $attributes = NULL ) { 
    644                 $this->parent =& $parent; 
     646                $this->parent = $parent; 
    645647                 
    646648                $this->name = $this->prefix ($attributes['NAME']); 
     
    786788        */ 
    787789        function dbData( &$parent, $attributes = NULL ) { 
    788                 $this->parent =& $parent; 
     790                $this->parent = $parent; 
    789791        } 
    790792         
     
    985987        */ 
    986988        function dbQuerySet( &$parent, $attributes = NULL ) { 
    987                 $this->parent =& $parent; 
     989                $this->parent = $parent; 
    988990                         
    989991                // Overrides the manual prefix key 
     
    12101212* 
    12111213* @author Richard Tango-Lowy & Dan Cech 
    1212 * @version $Revision$ 
     1214* @version $Revision: 1.12 $ 
    12131215* 
    12141216* @package axmls 
     
    13001302        * @param object $db ADOdb database connection object. 
    13011303        */ 
    1302         function adoSchema( &$db ) { 
     1304        function adoSchema( $db ) { 
    13031305                // Initialize the environment 
    13041306                $this->mgq = get_magic_quotes_runtime(); 
    1305                 set_magic_quotes_runtime(0); 
    1306                  
    1307                 $this->db =& $db; 
     1307                ini_set("magic_quotes_runtime", 0); 
     1308                #set_magic_quotes_runtime(0); 
     1309                 
     1310                $this->db = $db; 
    13081311                $this->debug = $this->db->debug; 
    13091312                $this->dict = NewDataDictionary( $this->db ); 
     
    16281631        * @access private 
    16291632        */ 
    1630         function &create_parser() { 
     1633        function create_parser() { 
    16311634                // Create the parser 
    16321635                $xmlParser = xml_parser_create(); 
     
    21922195        */ 
    21932196        function Destroy() { 
    2194                 set_magic_quotes_runtime( $this->mgq ); 
     2197                ini_set("magic_quotes_runtime", $this->mgq ); 
     2198                #set_magic_quotes_runtime( $this->mgq ); 
    21952199                unset( $this ); 
    21962200        } 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-xmlschema03.inc.php

    r34 r8222  
    1111 * XML schema. 
    1212 * 
    13  * Last Editor: $Author$ 
     13 * Last Editor: $Author: jlim $ 
    1414 * @author Richard Tango-Lowy & Dan Cech 
    15  * @version $Revision$ 
     15 * @version $Revision: 1.62 $ 
    1616 * 
    1717 * @package axmls 
     
    138138        */ 
    139139        function dbObject( &$parent, $attributes = NULL ) { 
    140                 $this->parent =& $parent; 
     140                $this->parent = $parent; 
    141141        } 
    142142         
     
    168168        } 
    169169         
    170         function create() { 
     170        function create(&$xmls) { 
    171171                return array(); 
    172172        } 
     
    275275        */ 
    276276        function dbTable( &$parent, $attributes = NULL ) { 
    277                 $this->parent =& $parent; 
     277                $this->parent = $parent; 
    278278                $this->name = $this->prefix($attributes['NAME']); 
    279279        } 
     
    400400        * @return object dbIndex object 
    401401        */ 
    402         function &addIndex( $attributes ) { 
     402        function addIndex( $attributes ) { 
    403403                $name = strtoupper( $attributes['NAME'] ); 
    404                 $this->indexes[$name] =& new dbIndex( $this, $attributes ); 
     404                $this->indexes[$name] = new dbIndex( $this, $attributes ); 
    405405                return $this->indexes[$name]; 
    406406        } 
     
    412412        * @return object dbData object 
    413413        */ 
    414         function &addData( $attributes ) { 
     414        function addData( $attributes ) { 
    415415                if( !isset( $this->data ) ) { 
    416                         $this->data =& new dbData( $this, $attributes ); 
     416                        $this->data = new dbData( $this, $attributes ); 
    417417                } 
    418418                return $this->data; 
     
    505505        */ 
    506506        function addTableOpt( $opt ) { 
    507                 if( $this->currentPlatform ) { 
    508                 $this->opts[] = $opt; 
     507                if(isset($this->currentPlatform)) { 
     508                        $this->opts[$this->parent->db->databaseType] = $opt; 
    509509                } 
    510510                return $this->opts; 
    511511        } 
     512 
    512513         
    513514        /** 
     
    684685        */ 
    685686        function dbIndex( &$parent, $attributes = NULL ) { 
    686                 $this->parent =& $parent; 
     687                $this->parent = $parent; 
    687688                 
    688689                $this->name = $this->prefix ($attributes['NAME']); 
     
    829830        */ 
    830831        function dbData( &$parent, $attributes = NULL ) { 
    831                 $this->parent =& $parent; 
     832                $this->parent = $parent; 
    832833        } 
    833834         
     
    10851086        */ 
    10861087        function dbQuerySet( &$parent, $attributes = NULL ) { 
    1087                 $this->parent =& $parent; 
     1088                $this->parent = $parent; 
    10881089                         
    10891090                // Overrides the manual prefix key 
     
    13101311* 
    13111312* @author Richard Tango-Lowy & Dan Cech 
    1312 * @version $Revision$ 
     1313* @version $Revision: 1.62 $ 
    13131314* 
    13141315* @package axmls 
     
    14051406        * @param object $db ADOdb database connection object. 
    14061407        */ 
    1407         function adoSchema( &$db ) { 
     1408        function adoSchema( $db ) { 
    14081409                // Initialize the environment 
    14091410                $this->mgq = get_magic_quotes_runtime(); 
    1410                 set_magic_quotes_runtime(0); 
    1411                  
    1412                 $this->db =& $db; 
     1411                #set_magic_quotes_runtime(0); 
     1412                ini_set("magic_quotes_runtime", 0); 
     1413                 
     1414                $this->db = $db; 
    14131415                $this->debug = $this->db->debug; 
    14141416                $this->dict = NewDataDictionary( $this->db ); 
     
    14981500                                        break; 
    14991501                                default: 
    1500                                         $mode = XMLS_EXISITNG_DATA; 
     1502                                        $mode = XMLS_EXISTING_DATA; 
    15011503                                        break; 
    15021504                        } 
     
    17861788        * @access private 
    17871789        */ 
    1788         function &create_parser() { 
     1790        function create_parser() { 
    17891791                // Create the parser 
    17901792                $xmlParser = xml_parser_create(); 
     
    23742376        */ 
    23752377        function Destroy() { 
    2376                 set_magic_quotes_runtime( $this->mgq ); 
     2378                ini_set("magic_quotes_runtime", $this->mgq ); 
     2379                #set_magic_quotes_runtime( $this->mgq ); 
    23772380                unset( $this ); 
    23782381        } 
  • sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb.inc.php

    r34 r8222  
    33 * Set tabs to 4 for best viewing. 
    44 *  
    5  * Latest version is available at http://adodb.sourceforge.net/ 
     5 * Latest version is available at http://adodb.sourceforge.net 
    66 *  
    77 * This is the main include file for ADOdb. 
     
    1313 
    1414/** 
    15         \mainpage        
    16          
    17          @version V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. 
     15        \mainpage 
     16         
     17         @version V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 
    1818 
    1919        Released under both BSD license and Lesser GPL library license. You can choose which license 
     
    5555                $ADODB_COUNTRECS,       // count number of records returned - slows down query 
    5656                $ADODB_CACHE_DIR,       // directory to cache recordsets 
     57                $ADODB_CACHE, 
     58                $ADODB_CACHE_CLASS, 
    5759                $ADODB_EXTENSION,   // ADODB extension installed 
    5860                $ADODB_COMPAT_FETCH, // If $ADODB_COUNTRECS and this is true, $rs->fields is available on EOF 
    5961                $ADODB_FETCH_MODE,      // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default... 
     62                $ADODB_GETONE_EOF, 
    6063                $ADODB_QUOTE_FIELDNAMES; // Allows you to force quotes (backticks) around field names in queries generated by getinsertsql and getupdatesql.     
    6164         
     
    116119                } else if ($_adodb_ver >= 5.0) { 
    117120                        define('ADODB_PHPVER',0x5000); 
    118                 } else if ($_adodb_ver > 4.299999) { # 4.3 
    119                         define('ADODB_PHPVER',0x4300); 
    120                 } else if ($_adodb_ver > 4.199999) { # 4.2 
    121                         define('ADODB_PHPVER',0x4200); 
    122                 } else if (strnatcmp(PHP_VERSION,'4.0.5')>=0) { 
    123                         define('ADODB_PHPVER',0x4050); 
    124                 } else { 
    125                         define('ADODB_PHPVER',0x4000); 
    126                 } 
    127         } 
     121                } else  
     122                        die("PHP5 or later required. You are running ".PHP_VERSION); 
     123        } 
     124         
    128125         
    129126        //if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); 
     
    154151                $ADODB_CACHE_DIR,       // directory to cache recordsets 
    155152                $ADODB_FETCH_MODE, 
     153                $ADODB_CACHE, 
     154                $ADODB_CACHE_CLASS, 
    156155                $ADODB_FORCE_TYPE, 
     156                $ADODB_GETONE_EOF, 
    157157                $ADODB_QUOTE_FIELDNAMES; 
    158158                 
     159                if (empty($ADODB_CACHE_CLASS)) $ADODB_CACHE_CLASS =  'ADODB_Cache_File' ; 
    159160                $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT; 
    160161                $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE; 
    161  
     162                $ADODB_GETONE_EOF = null; 
    162163 
    163164                if (!isset($ADODB_CACHE_DIR)) { 
     
    177178                 * ADODB version as a string. 
    178179                 */ 
    179                 $ADODB_vers = 'V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. Released BSD & LGPL.'; 
     180                $ADODB_vers = 'V5.18 3 Sep 2012  (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. Released BSD & LGPL.'; 
    180181         
    181182                /** 
     
    216217        } 
    217218         
    218  
     219         
     220        function _adodb_safedate($s) 
     221        { 
     222                return str_replace(array("'", '\\'), '', $s); 
     223        } 
     224 
     225        // parse date string to prevent injection attack 
     226        // date string will have one quote at beginning e.g. '3434343' 
     227        function _adodb_safedateq($s) 
     228        { 
     229                $len = strlen($s); 
     230                if ($s[0] !== "'") $s2 = "'".$s[0]; 
     231                else $s2 = "'"; 
     232                for($i=1; $i<$len; $i++) { 
     233                        $ch = $s[$i]; 
     234                        if ($ch === '\\') { 
     235                                $s2 .= "'"; 
     236                                break; 
     237                        } elseif ($ch === "'") { 
     238                                $s2 .= $ch; 
     239                                break; 
     240                        } 
     241                         
     242                        $s2 .= $ch; 
     243                } 
     244                 
     245                return strlen($s2) == 0 ? 'null' : $s2; 
     246        } 
     247 
     248         
     249        // for transaction handling 
    219250         
    220251        function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection) 
     
    225256                        $fn = $thisConnection->_oldRaiseFn; 
    226257                        $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection); 
     258                } 
     259        } 
     260         
     261        //------------------ 
     262        // class for caching 
     263        class ADODB_Cache_File { 
     264         
     265                var $createdir = true; // requires creation of temp dirs 
     266                 
     267                function ADODB_Cache_File() 
     268                { 
     269                global $ADODB_INCLUDED_CSV; 
     270                        if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php'); 
     271                } 
     272                 
     273                // write serialised recordset to cache item/file 
     274                function writecache($filename, $contents,  $debug, $secs2cache) 
     275                { 
     276                        return adodb_write_file($filename, $contents,$debug); 
     277                } 
     278                 
     279                // load serialised recordset and unserialise it 
     280                function &readcache($filename, &$err, $secs2cache, $rsClass) 
     281                { 
     282                        $rs = csv2rs($filename,$err,$secs2cache,$rsClass); 
     283                        return $rs; 
     284                } 
     285                 
     286                // flush all items in cache 
     287                function flushall($debug=false) 
     288                { 
     289                global $ADODB_CACHE_DIR; 
     290 
     291                $rez = false; 
     292                 
     293                        if (strlen($ADODB_CACHE_DIR) > 1) { 
     294                                $rez = $this->_dirFlush($ADODB_CACHE_DIR); 
     295                        if ($debug) ADOConnection::outp( "flushall: $dir<br><pre>\n". $rez."</pre>"); 
     296                        } 
     297                        return $rez; 
     298                } 
     299                 
     300                // flush one file in cache 
     301                function flushcache($f, $debug=false) 
     302                { 
     303                        if (!@unlink($f)) { 
     304                                if ($debug) ADOConnection::outp( "flushcache: failed for $f"); 
     305                        } 
     306                } 
     307                 
     308                function getdirname($hash) 
     309                { 
     310                global $ADODB_CACHE_DIR; 
     311                        if (!isset($this->notSafeMode)) $this->notSafeMode = !ini_get('safe_mode'); 
     312                        return ($this->notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($hash,0,2) : $ADODB_CACHE_DIR; 
     313                } 
     314                 
     315                // create temp directories 
     316                function createdir($hash, $debug) 
     317                { 
     318                global $ADODB_CACHE_PERMS; 
     319                 
     320                        $dir = $this->getdirname($hash); 
     321                        if ($this->notSafeMode && !file_exists($dir)) { 
     322                                $oldu = umask(0); 
     323                                if (!@mkdir($dir, empty($ADODB_CACHE_PERMS) ? 0771 : $ADODB_CACHE_PERMS)) if(!is_dir($dir) && $debug) ADOConnection::outp("Cannot create $dir"); 
     324                                umask($oldu); 
     325                        } 
     326                 
     327                        return $dir; 
     328                } 
     329                 
     330                /** 
     331                * Private function to erase all of the files and subdirectories in a directory. 
     332                * 
     333                * Just specify the directory, and tell it if you want to delete the directory or just clear it out. 
     334                * Note: $kill_top_level is used internally in the function to flush subdirectories. 
     335                */ 
     336                function _dirFlush($dir, $kill_top_level = false)  
     337                { 
     338                   if(!$dh = @opendir($dir)) return; 
     339                    
     340                   while (($obj = readdir($dh))) { 
     341                                if($obj=='.' || $obj=='..') continue; 
     342                                $f = $dir.'/'.$obj; 
     343                 
     344                                if (strpos($obj,'.cache')) @unlink($f); 
     345                                if (is_dir($f)) $this->_dirFlush($f, true); 
     346                   } 
     347                   if ($kill_top_level === true) @rmdir($dir); 
     348                   return true; 
    227349                } 
    228350        } 
     
    288410        var $sysDate = false; /// name of function that returns the current date 
    289411        var $sysTimeStamp = false; /// name of function that returns the current timestamp 
     412        var $sysUTimeStamp = false; // name of function that returns the current timestamp accurate to the microsecond or nearest fraction 
    290413        var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets 
    291414         
     
    313436         
    314437        var $null2null = 'null'; // in autoexecute/getinsertsql/getupdatesql, this value will be converted to a null 
     438        var $bulkBind = false; // enable 2D Execute array 
    315439         // 
    316440         // PRIVATE VARS 
     
    341465        } 
    342466         
    343         function Version() 
     467        static function Version() 
    344468        { 
    345469        global $ADODB_vers; 
    346470         
    347                 return (float) substr($ADODB_vers,1); 
     471                $ok = preg_match( '/^[Vv]([0-9\.]+)/', $ADODB_vers, $matches ); 
     472                if (!$ok) return (float) substr($ADODB_vers,1); 
     473                else return $matches[1]; 
    348474        } 
    349475         
     
    374500        * You can define your own handler by defining the function name in ADODB_OUTP. 
    375501        */ 
    376         function outp($msg,$newline=true) 
     502        static function outp($msg,$newline=true) 
    377503        { 
    378504        global $ADODB_FLUSH,$ADODB_OUTP; 
     
    400526        function Time() 
    401527        { 
    402                 $rs =& $this->_Execute("select $this->sysTimeStamp"); 
     528                $rs = $this->_Execute("select $this->sysTimeStamp"); 
    403529                if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); 
    404530                 
     
    421547                if ($argHostname != "") $this->host = $argHostname; 
    422548                if ($argUsername != "") $this->user = $argUsername; 
    423                 if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons 
     549                if ($argPassword != "") $this->password = 'not stored'; // not stored for security reasons 
    424550                if ($argDatabaseName != "") $this->database = $argDatabaseName;          
    425551                 
    426552                $this->_isPersistentConnection = false;  
     553                         
    427554                if ($forceNew) { 
    428                         if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true; 
     555                        if ($rez=$this->_nconnect($this->host, $this->user, $argPassword, $this->database)) return true; 
    429556                } else { 
    430                          if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true; 
     557                         if ($rez=$this->_connect($this->host, $this->user, $argPassword, $this->database)) return true; 
    431558                } 
    432559                if (isset($rez)) { 
     
    480607        function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") 
    481608        { 
     609                 
    482610                if (defined('ADODB_NEVER_PERSIST'))  
    483611                        return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName); 
     
    485613                if ($argHostname != "") $this->host = $argHostname; 
    486614                if ($argUsername != "") $this->user = $argUsername; 
    487                 if ($argPassword != "") $this->password = $argPassword; 
     615                if ($argPassword != "") $this->password = 'not stored'; 
    488616                if ($argDatabaseName != "") $this->database = $argDatabaseName;          
    489617                         
    490618                $this->_isPersistentConnection = true;   
    491                 if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true; 
     619                 
     620                if ($rez = $this->_pconnect($this->host, $this->user, $argPassword, $this->database)) return true; 
    492621                if (isset($rez)) { 
    493622                        $err = $this->ErrorMsg(); 
     
    507636        } 
    508637 
     638        function outp_throw($msg,$src='WARN',$sql='') 
     639        { 
     640                if (defined('ADODB_ERROR_HANDLER') &&  ADODB_ERROR_HANDLER == 'adodb_throw') { 
     641                        adodb_throw($this->databaseType,$src,-9999,$msg,$sql,false,$this); 
     642                        return; 
     643                }  
     644                ADOConnection::outp($msg); 
     645        } 
     646         
     647        // create cache class. Code is backward compat with old memcache implementation 
     648        function _CreateCache() 
     649        { 
     650        global $ADODB_CACHE, $ADODB_CACHE_CLASS; 
     651         
     652                if ($this->memCache) { 
     653                global $ADODB_INCLUDED_MEMCACHE; 
     654                 
     655                        if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); 
     656                                $ADODB_CACHE = new ADODB_Cache_MemCache($this); 
     657                } else 
     658                                $ADODB_CACHE = new $ADODB_CACHE_CLASS($this); 
     659                 
     660        } 
     661         
    509662        // Format date column in sql string given an input format that understands Y M D 
    510663        function SQLDate($fmt, $col=false) 
     
    533686                return $sql; 
    534687        } 
    535          
     688 
    536689        /** 
    537690         * Some databases, eg. mssql require a different function for preparing 
     
    552705                return $this->Prepare($sql,$param); 
    553706        } 
    554          
     707 
    555708        /** 
    556709        * PEAR DB Compat 
     
    599752        *  @param $where        where clause to use, eg: "WHERE row=12". If left empty, will escalate to table lock 
    600753        */ 
    601         function RowLock($table,$where) 
     754        function RowLock($table,$where,$col='1 as adodbignore') 
    602755        { 
    603756                return false; 
     
    639792        * PEAR DB Compat - do not use internally.  
    640793        */ 
    641         function &Query($sql, $inputarr=false) 
    642         { 
    643                 $rs = &$this->Execute($sql, $inputarr); 
     794        function Query($sql, $inputarr=false) 
     795        { 
     796                $rs = $this->Execute($sql, $inputarr); 
    644797                if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); 
    645798                return $rs; 
     
    650803        * PEAR DB Compat - do not use internally 
    651804        */ 
    652         function &LimitQuery($sql, $offset, $count, $params=false) 
    653         { 
    654                 $rs = &$this->SelectLimit($sql, $count, $offset, $params);  
     805        function LimitQuery($sql, $offset, $count, $params=false) 
     806        { 
     807                $rs = $this->SelectLimit($sql, $count, $offset, $params);  
    655808                if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); 
    656809                return $rs; 
     
    744897                if ($this->transOff > 0) { 
    745898                        $this->transOff += 1; 
    746                         return; 
     899                        return true; 
    747900                } 
    748901                 
     
    752905                 
    753906                if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans"); 
    754                 $this->BeginTrans(); 
     907                $ok = $this->BeginTrans(); 
    755908                $this->transOff = 1; 
     909                return $ok; 
    756910        } 
    757911         
     
    820974         * @return              RecordSet or false 
    821975         */ 
    822         function &Execute($sql,$inputarr=false)  
     976        function Execute($sql,$inputarr=false)  
    823977        { 
    824978                if ($this->fnExecute) { 
    825979                        $fn = $this->fnExecute; 
    826                         $ret =& $fn($this,$sql,$inputarr); 
     980                        $ret = $fn($this,$sql,$inputarr); 
    827981                        if (isset($ret)) return $ret; 
    828982                } 
     
    832986                        $element0 = reset($inputarr); 
    833987                        # is_object check because oci8 descriptors can be passed in 
    834                         $array_2d = is_array($element0) && !is_object(reset($element0)); 
     988                        $array_2d = $this->bulkBind && is_array($element0) && !is_object(reset($element0)); 
     989                 
    835990                        //remove extra memory copy of input -mikefedyk 
    836991                        unset($element0); 
     
    838993                        if (!is_array($sql) && !$this->_bindInputArray) { 
    839994                                $sqlarr = explode('?',$sql); 
    840                                          
     995                                $nparams = sizeof($sqlarr)-1; 
    841996                                if (!$array_2d) $inputarr = array($inputarr); 
     997         
    842998                                foreach($inputarr as $arr) { 
    843999                                        $sql = ''; $i = 0; 
     
    8631019                                                        $sql .= $v; 
    8641020                                                $i += 1; 
    865                                         } 
     1021                                                 
     1022                                                if ($i == $nparams) break; 
     1023                                        } // while 
    8661024                                        if (isset($sqlarr[$i])) { 
    8671025                                                $sql .= $sqlarr[$i]; 
    868                                                 if ($i+1 != sizeof($sqlarr)) ADOConnection::outp( "Input Array does not match ?: ".htmlspecialchars($sql)); 
     1026                                                if ($i+1 != sizeof($sqlarr)) $this->outp_throw( "Input Array does not match ?: ".htmlspecialchars($sql),'Execute'); 
    8691027                                        } else if ($i != sizeof($sqlarr))        
    870                                                 ADOConnection::outp( "Input array does not match ?: ".htmlspecialchars($sql)); 
    871                  
    872                                         $ret =& $this->_Execute($sql); 
     1028                                                $this->outp_throw( "Input array does not match ?: ".htmlspecialchars($sql),'Execute'); 
     1029                 
     1030                                        $ret = $this->_Execute($sql); 
    8731031                                        if (!$ret) return $ret; 
    8741032                                }        
     
    8791037                                        else 
    8801038                                                $stmt = $sql; 
    881                                                  
     1039                                         
    8821040                                        foreach($inputarr as $arr) { 
    883                                                 $ret =& $this->_Execute($stmt,$arr); 
     1041                                                $ret = $this->_Execute($stmt,$arr); 
    8841042                                                if (!$ret) return $ret; 
    8851043                                        } 
    8861044                                } else { 
    887                                         $ret =& $this->_Execute($sql,$inputarr); 
     1045                                        $ret = $this->_Execute($sql,$inputarr); 
    8881046                                } 
    8891047                        } 
    8901048                } else { 
    891                         $ret =& $this->_Execute($sql,false); 
     1049                        $ret = $this->_Execute($sql,false); 
    8921050                } 
    8931051 
     
    8961054         
    8971055         
    898         function &_Execute($sql,$inputarr=false) 
     1056        function _Execute($sql,$inputarr=false) 
    8991057        { 
    9001058                if ($this->debug) { 
     
    9211079                 
    9221080                if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead 
    923                         $rs = new ADORecordSet_empty(); 
     1081                        $rsclass = $this->rsPrefix.'empty'; 
     1082                        $rs = (class_exists($rsclass)) ? new $rsclass():  new ADORecordSet_empty(); 
     1083                         
    9241084                        return $rs; 
    9251085                } 
     
    9281088                $rsclass = $this->rsPrefix.$this->databaseType; 
    9291089                $rs = new $rsclass($this->_queryID,$this->fetchMode); 
    930                 $rs->connection = &$this; // Pablo suggestion 
     1090                $rs->connection = $this; // Pablo suggestion 
    9311091                $rs->Init(); 
    9321092                if (is_array($sql)) $rs->sql = $sql[0]; 
     
    9361096                        if ($ADODB_COUNTRECS) { 
    9371097                                if (!$rs->EOF) {  
    938                                         $rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql)); 
     1098                                        $rs = $this->_rs2rs($rs,-1,-1,!is_array($sql)); 
    9391099                                        $rs->_queryID = $this->_queryID; 
    9401100                                } else 
     
    10811241        // owner not used in base class - see oci8 
    10821242                $p = array(); 
    1083                 $objs =& $this->MetaColumns($table); 
     1243                $objs = $this->MetaColumns($table); 
    10841244                if ($objs) { 
    10851245                        foreach($objs as $v) { 
     
    11301290        * @return               the recordset ($rs->databaseType == 'array') 
    11311291        */ 
    1132         function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) 
     1292        function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) 
    11331293        { 
    11341294                if ($this->hasTop && $nrows > 0) { 
     
    11471307 
    11481308                                                if ($secs2cache != 0) { 
    1149                                                         $ret =& $this->CacheExecute($secs2cache, $sql,$inputarr); 
     1309                                                        $ret = $this->CacheExecute($secs2cache, $sql,$inputarr); 
    11501310                                                } else { 
    1151                                                         $ret =& $this->Execute($sql,$inputarr); 
     1311                                                        $ret = $this->Execute($sql,$inputarr); 
    11521312                                                } 
    11531313                                                return $ret; // PHP5 fix 
     
    11781338                $ADODB_COUNTRECS = false; 
    11791339                         
    1180                 if ($offset>0){ 
    1181                         if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr); 
    1182                         else $rs = &$this->Execute($sql,$inputarr); 
    1183                 } else { 
    1184                         if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr); 
    1185                         else $rs = &$this->Execute($sql,$inputarr); 
    1186                 } 
     1340 
     1341                if ($secs2cache != 0) $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); 
     1342                else $rs = $this->Execute($sql,$inputarr); 
     1343                 
    11871344                $ADODB_COUNTRECS = $savec; 
    11881345                if ($rs && !$rs->EOF) { 
    1189                         $rs =& $this->_rs2rs($rs,$nrows,$offset); 
     1346                        $rs = $this->_rs2rs($rs,$nrows,$offset); 
    11901347                } 
    11911348                //print_r($rs); 
     
    11981355        * @param rs                     the recordset to serialize 
    11991356        */ 
    1200         function &SerializableRS(&$rs) 
    1201         { 
    1202                 $rs2 =& $this->_rs2rs($rs); 
     1357        function SerializableRS(&$rs) 
     1358        { 
     1359                $rs2 = $this->_rs2rs($rs); 
    12031360                $ignore = false; 
    1204                 $rs2->connection =& $ignore; 
     1361                $rs2->connection = $ignore; 
    12051362                 
    12061363                return $rs2; 
     
    12251382                $dbtype = $rs->databaseType; 
    12261383                if (!$dbtype) { 
    1227                         $rs = &$rs;  // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ? 
     1384                        $rs = $rs;  // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ? 
    12281385                        return $rs; 
    12291386                } 
    12301387                if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) { 
    12311388                        $rs->MoveFirst(); 
    1232                         $rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ? 
     1389                        $rs = $rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ? 
    12331390                        return $rs; 
    12341391                } 
     
    12381395                } 
    12391396 
    1240                 $arr =& $rs->GetArrayLimit($nrows,$offset); 
     1397                $arr = $rs->GetArrayLimit($nrows,$offset); 
    12411398                //print_r($arr); 
    12421399                if ($close) $rs->Close(); 
     
    12451402                 
    12461403                $rs2 = new $arrayClass(); 
    1247                 $rs2->connection = &$this; 
     1404                $rs2->connection = $this; 
    12481405                $rs2->sql = $rs->sql; 
    12491406                $rs2->dataProvider = $this->dataProvider; 
     
    12561413        * Return all rows. Compat with PEAR DB 
    12571414        */ 
    1258         function &GetAll($sql, $inputarr=false) 
    1259         { 
    1260                 $arr =& $this->GetArray($sql,$inputarr); 
     1415        function GetAll($sql, $inputarr=false) 
     1416        { 
     1417                $arr = $this->GetArray($sql,$inputarr); 
    12611418                return $arr; 
    12621419        } 
    12631420         
    1264         function &GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false) 
    1265         { 
    1266                 $rs =& $this->Execute($sql, $inputarr); 
     1421        function GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false) 
     1422        { 
     1423                $rs = $this->Execute($sql, $inputarr); 
    12671424                if (!$rs) { 
    12681425                        $false = false; 
    12691426                        return $false; 
    12701427                } 
    1271                 $arr =& $rs->GetAssoc($force_array,$first2cols); 
     1428                $arr = $rs->GetAssoc($force_array,$first2cols); 
    12721429                return $arr; 
    12731430        } 
    12741431         
    1275         function &CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false) 
     1432        function CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false) 
    12761433        { 
    12771434                if (!is_numeric($secs2cache)) { 
     
    12791436                        $force_array = $inputarr; 
    12801437                } 
    1281                 $rs =& $this->CacheExecute($secs2cache, $sql, $inputarr); 
     1438                $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); 
    12821439                if (!$rs) { 
    12831440                        $false = false; 
    12841441                        return $false; 
    12851442                } 
    1286                 $arr =& $rs->GetAssoc($force_array,$first2cols); 
     1443                $arr = $rs->GetAssoc($force_array,$first2cols); 
    12871444                return $arr; 
    12881445        } 
     
    12971454        function GetOne($sql,$inputarr=false) 
    12981455        { 
    1299         global $ADODB_COUNTRECS; 
     1456        global $ADODB_COUNTRECS,$ADODB_GETONE_EOF; 
    13001457                $crecs = $ADODB_COUNTRECS; 
    13011458                $ADODB_COUNTRECS = false; 
    13021459                 
    13031460                $ret = false; 
    1304                 $rs = &$this->Execute($sql,$inputarr); 
     1461                $rs = $this->Execute($sql,$inputarr); 
    13051462                if ($rs) {       
    1306                         if (!$rs->EOF) $ret = reset($rs->fields); 
     1463                        if ($rs->EOF) $ret = $ADODB_GETONE_EOF; 
     1464                        else $ret = reset($rs->fields); 
     1465                         
    13071466                        $rs->Close(); 
    13081467                } 
     
    13111470        } 
    13121471         
     1472        // $where should include 'WHERE fld=value' 
     1473        function GetMedian($table, $field,$where = '') 
     1474        { 
     1475                $total = $this->GetOne("select count(*) from $table $where"); 
     1476                if (!$total) return false; 
     1477         
     1478                $midrow = (integer) ($total/2); 
     1479                $rs = $this->SelectLimit("select $field from $table $where order by 1",1,$midrow); 
     1480                if ($rs && !$rs->EOF) return reset($rs->fields); 
     1481                return false; 
     1482        } 
     1483         
     1484         
    13131485        function CacheGetOne($secs2cache,$sql=false,$inputarr=false) 
    13141486        { 
     1487        global $ADODB_GETONE_EOF; 
    13151488                $ret = false; 
    1316                 $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr); 
    1317                 if ($rs) {               
    1318                         if (!$rs->EOF) $ret = reset($rs->fields); 
     1489                $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); 
     1490                if ($rs) { 
     1491                        if ($rs->EOF) $ret = $ADODB_GETONE_EOF; 
     1492                        else $ret = reset($rs->fields); 
    13191493                        $rs->Close(); 
    13201494                }  
     
    13251499        function GetCol($sql, $inputarr = false, $trim = false) 
    13261500        { 
    1327                 $rv = false; 
    1328                 $rs = &$this->Execute($sql, $inputarr); 
     1501                 
     1502                $rs = $this->Execute($sql, $inputarr); 
    13291503                if ($rs) { 
    13301504                        $rv = array(); 
     
    13411515                        } 
    13421516                        $rs->Close(); 
    1343                 } 
     1517                } else 
     1518                        $rv = false; 
    13441519                return $rv; 
    13451520        } 
     
    13471522        function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false) 
    13481523        { 
    1349                 $rv = false; 
    1350                 $rs = &$this->CacheExecute($secs, $sql, $inputarr); 
     1524                $rs = $this->CacheExecute($secs, $sql, $inputarr); 
    13511525                if ($rs) { 
     1526                        $rv = array(); 
    13521527                        if ($trim) { 
    13531528                                while (!$rs->EOF) { 
     
    13621537                        } 
    13631538                        $rs->Close(); 
    1364                 } 
     1539                } else 
     1540                        $rv = false; 
     1541                         
    13651542                return $rv; 
    13661543        } 
    13671544         
    1368         function &Transpose(&$rs,$addfieldnames=true) 
    1369         { 
    1370                 $rs2 =& $this->_rs2rs($rs); 
     1545        function Transpose(&$rs,$addfieldnames=true) 
     1546        { 
     1547                $rs2 = $this->_rs2rs($rs); 
    13711548                $false = false; 
    13721549                if (!$rs2) return $false; 
     
    13951572        * @param [inputarr]             input bind array 
    13961573        */ 
    1397         function &GetArray($sql,$inputarr=false) 
     1574        function GetArray($sql,$inputarr=false) 
    13981575        { 
    13991576        global $ADODB_COUNTRECS; 
     
    14011578                $savec = $ADODB_COUNTRECS; 
    14021579                $ADODB_COUNTRECS = false; 
    1403                 $rs =& $this->Execute($sql,$inputarr); 
     1580                $rs = $this->Execute($sql,$inputarr); 
    14041581                $ADODB_COUNTRECS = $savec; 
    14051582                if (!$rs)  
     
    14111588                                return $false; 
    14121589                        } 
    1413                 $arr =& $rs->GetArray(); 
     1590                $arr = $rs->GetArray(); 
    14141591                $rs->Close(); 
    14151592                return $arr; 
    14161593        } 
    14171594         
    1418         function &CacheGetAll($secs2cache,$sql=false,$inputarr=false) 
    1419         { 
    1420                 $arr =& $this->CacheGetArray($secs2cache,$sql,$inputarr); 
     1595        function CacheGetAll($secs2cache,$sql=false,$inputarr=false) 
     1596        { 
     1597                $arr = $this->CacheGetArray($secs2cache,$sql,$inputarr); 
    14211598                return $arr; 
    14221599        } 
    14231600         
    1424         function &CacheGetArray($secs2cache,$sql=false,$inputarr=false) 
     1601        function CacheGetArray($secs2cache,$sql=false,$inputarr=false) 
    14251602        { 
    14261603        global $ADODB_COUNTRECS; 
     
    14281605                $savec = $ADODB_COUNTRECS; 
    14291606                $ADODB_COUNTRECS = false; 
    1430                 $rs =& $this->CacheExecute($secs2cache,$sql,$inputarr); 
     1607                $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); 
    14311608                $ADODB_COUNTRECS = $savec; 
    14321609                 
     
    14391616                                return $false; 
    14401617                        } 
    1441                 $arr =& $rs->GetArray(); 
     1618                $arr = $rs->GetArray(); 
    14421619                $rs->Close(); 
    14431620                return $arr; 
    14441621        } 
    14451622         
    1446          
    1447          
    1448         /** 
    1449         * Return one row of sql statement. Recordset is disposed for you. 
     1623        function GetRandRow($sql, $arr= false) 
     1624        { 
     1625                $rezarr = $this->GetAll($sql, $arr); 
     1626                $sz = sizeof($rezarr); 
     1627                return $rezarr[abs(rand()) % $sz]; 
     1628        } 
     1629         
     1630        /** 
     1631        * Return one row of sql statement. Recordset is disposed for you.  
     1632        * Note that SelectLimit should not be called. 
    14501633        * 
    14511634        * @param sql                    SQL statement 
    14521635        * @param [inputarr]             input bind array 
    14531636        */ 
    1454         function &GetRow($sql,$inputarr=false) 
     1637        function GetRow($sql,$inputarr=false) 
    14551638        { 
    14561639        global $ADODB_COUNTRECS; 
     
    14581641                $ADODB_COUNTRECS = false; 
    14591642                 
    1460                 $rs =& $this->Execute($sql,$inputarr); 
     1643                $rs = $this->Execute($sql,$inputarr); 
    14611644                 
    14621645                $ADODB_COUNTRECS = $crecs; 
     
    14721655        } 
    14731656         
    1474         function &CacheGetRow($secs2cache,$sql=false,$inputarr=false) 
    1475         { 
    1476                 $rs =& $this->CacheExecute($secs2cache,$sql,$inputarr); 
     1657        function CacheGetRow($secs2cache,$sql=false,$inputarr=false) 
     1658        { 
     1659                $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); 
    14771660                if ($rs) { 
    1478                         $arr = false; 
    14791661                        if (!$rs->EOF) $arr = $rs->fields; 
     1662                        else $arr = array(); 
     1663                         
    14801664                        $rs->Close(); 
    14811665                        return $arr; 
     
    15321716        * @return               the recordset ($rs->databaseType == 'array') 
    15331717        */ 
    1534         function &CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false) 
     1718        function CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false) 
    15351719        {        
    15361720                if (!is_numeric($secs2cache)) { 
     
    15381722                        if ($offset == -1) $offset = false; 
    15391723                                                                          // sql,       nrows, offset,inputarr 
    1540                         $rs =& $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs); 
     1724                        $rs = $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs); 
    15411725                } else { 
    1542                         if ($sql === false) ADOConnection::outp( "Warning: \$sql missing from CacheSelectLimit()"); 
    1543                         $rs =& $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); 
     1726                        if ($sql === false) $this->outp_throw("Warning: \$sql missing from CacheSelectLimit()",'CacheSelectLimit'); 
     1727                        $rs = $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); 
    15441728                } 
    15451729                return $rs; 
     
    15581742        function CacheFlush($sql=false,$inputarr=false) 
    15591743        { 
    1560         global $ADODB_CACHE_DIR; 
    1561          
    1562                 if ($this->memCache) { 
    1563                 global $ADODB_INCLUDED_MEMCACHE; 
    1564                  
    1565                         $key = false; 
    1566                         if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); 
    1567                         if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true); 
    1568                         FlushMemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug); 
    1569                         return; 
    1570                 } 
    1571          
    1572                 if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) { 
    1573          /*if (strncmp(PHP_OS,'WIN',3) === 0) 
    1574             $dir = str_replace('/', '\\', $ADODB_CACHE_DIR); 
    1575          else */ 
    1576             $dir = $ADODB_CACHE_DIR; 
    1577              
    1578          if ($this->debug) { 
    1579             ADOConnection::outp( "CacheFlush: $dir<br><pre>\n". $this->_dirFlush($dir)."</pre>"); 
    1580          } else { 
    1581             $this->_dirFlush($dir); 
    1582          } 
    1583          return; 
    1584       }  
    1585        
    1586       global $ADODB_INCLUDED_CSV; 
    1587       if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); 
    1588        
    1589       $f = $this->_gencachename($sql.serialize($inputarr),false); 
    1590       adodb_write_file($f,''); // is adodb_write_file needed? 
    1591       if (!@unlink($f)) { 
    1592          if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f"); 
    1593       } 
    1594    } 
     1744        global $ADODB_CACHE_DIR, $ADODB_CACHE; 
     1745                 
     1746                if (empty($ADODB_CACHE)) return false; 
     1747                 
     1748                if (!$sql) { 
     1749                         $ADODB_CACHE->flushall($this->debug); 
     1750                 return; 
     1751            } 
     1752                 
     1753                $f = $this->_gencachename($sql.serialize($inputarr),false); 
     1754                return $ADODB_CACHE->flushcache($f, $this->debug); 
     1755        } 
    15951756    
    1596    /** 
    1597    * Private function to erase all of the files and subdirectories in a directory. 
    1598    * 
    1599    * Just specify the directory, and tell it if you want to delete the directory or just clear it out. 
    1600    * Note: $kill_top_level is used internally in the function to flush subdirectories. 
    1601    */ 
    1602    function _dirFlush($dir, $kill_top_level = false)  
    1603    { 
    1604       if(!$dh = @opendir($dir)) return; 
    1605        
    1606       while (($obj = readdir($dh))) { 
    1607          if($obj=='.' || $obj=='..') continue; 
    1608                 $f = $dir.'/'.$obj; 
    1609                  
    1610                 if (strpos($obj,'.cache')) @unlink($f); 
    1611                 if (is_dir($f)) $this->_dirFlush($f, true); 
    1612       } 
    1613       if ($kill_top_level === true) @rmdir($dir); 
    1614       return true; 
    1615    } 
    1616     
    1617     
    1618         function xCacheFlush($sql=false,$inputarr=false) 
    1619         { 
    1620         global $ADODB_CACHE_DIR; 
    1621          
    1622                 if ($this->memCache) { 
    1623                         global $ADODB_INCLUDED_MEMCACHE; 
    1624                         $key = false; 
    1625                         if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); 
    1626                         if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true); 
    1627                         flushmemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug); 
    1628                         return; 
    1629                 } 
    1630  
    1631                 if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) { 
    1632                         if (strncmp(PHP_OS,'WIN',3) === 0) { 
    1633                                 $cmd = 'del /s '.str_replace('/','\\',$ADODB_CACHE_DIR).'\adodb_*.cache'; 
    1634                         } else { 
    1635                                 //$cmd = 'find "'.$ADODB_CACHE_DIR.'" -type f -maxdepth 1 -print0 | xargs -0 rm -f'; 
    1636                                 $cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/';  
    1637                                 // old version 'rm -f `find '.$ADODB_CACHE_DIR.' -name adodb_*.cache`'; 
    1638                         } 
    1639                         if ($this->debug) { 
    1640                                 ADOConnection::outp( "CacheFlush: $cmd<br><pre>\n", system($cmd),"</pre>"); 
    1641                         } else { 
    1642                                 exec($cmd); 
    1643                         } 
    1644                         return; 
    1645                 }  
    1646                  
    1647                 global $ADODB_INCLUDED_CSV; 
    1648                 if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); 
    1649                  
    1650                 $f = $this->_gencachename($sql.serialize($inputarr),false); 
    1651                 adodb_write_file($f,''); // is adodb_write_file needed? 
    1652                 if (!@unlink($f)) { 
    1653                         if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f"); 
    1654                 } 
    1655         } 
    16561757         
    16571758        /** 
     
    16691770        * then we can scale to 12.8 million unique cached recordsets. Wow! 
    16701771        */ 
    1671         function _gencachename($sql,$createdir,$memcache=false) 
    1672         { 
    1673         global $ADODB_CACHE_DIR; 
    1674         static $notSafeMode; 
     1772        function _gencachename($sql,$createdir) 
     1773        { 
     1774        global $ADODB_CACHE, $ADODB_CACHE_DIR; 
    16751775                 
    16761776                if ($this->fetchMode === false) {  
     
    16811781                } 
    16821782                $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode); 
    1683                 if ($memcache) return $m; 
    1684                  
    1685                 if (!isset($notSafeMode)) $notSafeMode = !ini_get('safe_mode'); 
    1686                 $dir = ($notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($m,0,2) : $ADODB_CACHE_DIR; 
    1687                          
    1688                 if ($createdir && $notSafeMode && !file_exists($dir)) { 
    1689                         $oldu = umask(0); 
    1690                         if (!mkdir($dir,0771))  
    1691                                 if ($this->debug) ADOConnection::outp( "Unable to mkdir $dir for $sql"); 
    1692                         umask($oldu); 
    1693                 } 
     1783                if (!$ADODB_CACHE->createdir) return $m; 
     1784                if (!$createdir) $dir = $ADODB_CACHE->getdirname($m); 
     1785                else $dir = $ADODB_CACHE->createdir($m, $this->debug); 
     1786                 
    16941787                return $dir.'/adodb_'.$m.'.cache'; 
    16951788        } 
     
    17051798         * @return              RecordSet or false 
    17061799         */ 
    1707         function &CacheExecute($secs2cache,$sql=false,$inputarr=false) 
    1708         { 
    1709  
    1710                          
     1800        function CacheExecute($secs2cache,$sql=false,$inputarr=false) 
     1801        { 
     1802        global $ADODB_CACHE; 
     1803         
     1804                if (empty($ADODB_CACHE)) $this->_CreateCache(); 
     1805                 
    17111806                if (!is_numeric($secs2cache)) { 
    17121807                        $inputarr = $sql; 
     
    17211816                        $sqlparam = $sql; 
    17221817                         
    1723                 if ($this->memCache) { 
    1724                         global $ADODB_INCLUDED_MEMCACHE; 
    1725                         if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); 
    1726                         $md5file = $this->_gencachename($sql.serialize($inputarr),false,true); 
    1727                 } else { 
    1728                 global $ADODB_INCLUDED_CSV; 
    1729                         if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); 
    1730                         $md5file = $this->_gencachename($sql.serialize($inputarr),true); 
    1731                 } 
    1732  
     1818                 
     1819                $md5file = $this->_gencachename($sql.serialize($inputarr),true); 
    17331820                $err = ''; 
    17341821                 
    17351822                if ($secs2cache > 0){ 
    1736                         if ($this->memCache) 
    1737                                 $rs = &getmemCache($md5file,$err,$secs2cache, $this->memCacheHost, $this->memCachePort); 
    1738                         else 
    1739                                 $rs = &csv2rs($md5file,$err,$secs2cache,$this->arrayClass); 
     1823                        $rs = $ADODB_CACHE->readcache($md5file,$err,$secs2cache,$this->arrayClass); 
    17401824                        $this->numCacheHits += 1; 
    17411825                } else { 
     
    17441828                        $this->numCacheMisses += 1; 
    17451829                } 
     1830                 
    17461831                if (!$rs) { 
    17471832                // no cached rs found 
     
    17501835                                        ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :("); 
    17511836                                } 
    1752                                 if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)"); 
    1753                         } 
    1754                          
    1755                         $rs = &$this->Execute($sqlparam,$inputarr); 
    1756  
    1757                         if ($rs && $this->memCache) { 
    1758                                 $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately 
    1759                                 if(!putmemCache($md5file, $rs, $this->memCacheHost, $this->memCachePort, $this->memCacheCompress, $this->debug)) { 
    1760                                         if ($fn = $this->raiseErrorFn) 
    1761                                                 $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this); 
    1762                                         if ($this->debug) ADOConnection::outp( " Cache write error"); 
    1763                                 } 
    1764                         } else 
     1837                                if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (this is a notice and not an error)"); 
     1838                        } 
     1839                         
     1840                        $rs = $this->Execute($sqlparam,$inputarr); 
     1841 
    17651842                        if ($rs) { 
     1843 
    17661844                                $eof = $rs->EOF; 
    1767                                 $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately 
     1845                                $rs = $this->_rs2rs($rs); // read entire recordset into memory immediately 
     1846                                $rs->timeCreated = time(); // used by caching 
    17681847                                $txt = _rs2serialize($rs,false,$sql); // serialize 
    1769                  
    1770                                 if (!adodb_write_file($md5file,$txt,$this->debug)) { 
    1771                                         if ($fn = $this->raiseErrorFn) { 
    1772                                                 $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this); 
     1848         
     1849                                $ok = $ADODB_CACHE->writecache($md5file,$txt,$this->debug, $secs2cache); 
     1850                                if (!$ok) { 
     1851                                        if ($ok === false) { 
     1852                                                $em = 'Cache write error'; 
     1853                                                $en = -32000; 
     1854                                                 
     1855                                                if ($fn = $this->raiseErrorFn) { 
     1856                                                        $fn($this->databaseType,'CacheExecute', $en, $em, $md5file,$sql,$this); 
     1857                                                } 
     1858                                        } else { 
     1859                                                $em = 'Cache file locked warning'; 
     1860                                                $en = -32001; 
     1861                                                // do not call error handling for just a warning 
    17731862                                        } 
    1774                                         if ($this->debug) ADOConnection::outp( " Cache write error"); 
     1863                                         
     1864                                        if ($this->debug) ADOConnection::outp( " ".$em); 
    17751865                                } 
    17761866                                if ($rs->EOF && !$eof) { 
    17771867                                        $rs->MoveFirst(); 
    1778                                         //$rs = &csv2rs($md5file,$err);          
    1779                                         $rs->connection = &$this; // Pablo suggestion 
     1868                                        //$rs = csv2rs($md5file,$err);           
     1869                                        $rs->connection = $this; // Pablo suggestion 
    17801870                                }   
    17811871                                 
    1782                         } else 
    1783                         if (!$this->memCache) 
    1784                                 @unlink($md5file); 
     1872                        } else if (!$this->memCache) 
     1873                                $ADODB_CACHE->flushcache($md5file); 
    17851874                } else { 
    17861875                        $this->_errorMsg = ''; 
     
    17921881                        } 
    17931882                // ok, set cached object found 
    1794                         $rs->connection = &$this; // Pablo suggestion 
    1795                         if ($this->debug){  
    1796                                          
     1883                        $rs->connection = $this; // Pablo suggestion 
     1884                        if ($this->debug){                       
     1885                                if ($this->debug == 99) adodb_backtrace(); 
    17971886                                $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); 
    17981887                                $ttl = $rs->timeCreated + $secs2cache - time(); 
     
    18141903                $forceUpdate means that even if the data has not changed, perform update. 
    18151904         */ 
    1816         function& AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false)  
     1905        function AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false)  
    18171906        { 
    18181907                $false = false; 
     
    18201909                if ($where!==FALSE) $sql .= ' WHERE '.$where; 
    18211910                else if ($mode == 'UPDATE' || $mode == 2 /* DB_AUTOQUERY_UPDATE */) { 
    1822                         ADOConnection::outp('AutoExecute: Illegal mode=UPDATE with empty WHERE clause'); 
     1911                        $this->outp_throw('AutoExecute: Illegal mode=UPDATE with empty WHERE clause','AutoExecute'); 
    18231912                        return $false; 
    18241913                } 
    18251914 
    1826                 $rs =& $this->SelectLimit($sql,1); 
     1915                $rs = $this->SelectLimit($sql,1); 
    18271916                if (!$rs) return $false; // table does not exist 
    18281917                $rs->tableName = $table; 
     1918                $rs->sql = $sql; 
    18291919                 
    18301920                switch((string) $mode) { 
     
    18381928                        break; 
    18391929                default: 
    1840                         ADOConnection::outp("AutoExecute: Unknown mode=$mode"); 
     1930                        $this->outp_throw("AutoExecute: Unknown mode=$mode",'AutoExecute'); 
    18411931                        return $false; 
    18421932                } 
     
    19972087                        $rsclass = $this->rsPrefix.$this->databaseType; 
    19982088                        $this->_metars = new $rsclass(false,$this->fetchMode);  
    1999                         $this->_metars->connection =& $this; 
     2089                        $this->_metars->connection = $this; 
    20002090                } 
    20012091                return $this->_metars->MetaType($t,$len,$fieldobj); 
     
    20432133        } 
    20442134 
    2045         function &GetActiveRecordsClass($class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false) 
     2135        /** 
     2136         * GetActiveRecordsClass Performs an 'ALL' query  
     2137         *  
     2138         * @param mixed $class This string represents the class of the current active record 
     2139         * @param mixed $table Table used by the active record object 
     2140         * @param mixed $whereOrderBy Where, order, by clauses 
     2141         * @param mixed $bindarr  
     2142         * @param mixed $primkeyArr  
     2143         * @param array $extra Query extras: limit, offset... 
     2144         * @param mixed $relations Associative array: table's foreign name, "hasMany", "belongsTo" 
     2145         * @access public 
     2146         * @return void 
     2147         */ 
     2148        function GetActiveRecordsClass( 
     2149                        $class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false, 
     2150                        $extra=array(), 
     2151                        $relations=array()) 
    20462152        { 
    20472153        global $_ADODB_ACTIVE_DBS; 
    2048          
    2049                 $save = $this->SetFetchMode(ADODB_FETCH_NUM); 
    2050                 if (empty($whereOrderBy)) $whereOrderBy = '1=1'; 
    2051                 $rows = $this->GetAll("select * from ".$table.' WHERE '.$whereOrderBy,$bindarr); 
    2052                 $this->SetFetchMode($save); 
    2053                  
    2054                 $false = false; 
    2055                  
    2056                 if ($rows === false) {   
    2057                         return $false; 
    2058                 } 
    2059                  
    2060                  
    2061                 if (!isset($_ADODB_ACTIVE_DBS)) { 
    2062                         include(ADODB_DIR.'/adodb-active-record.inc.php'); 
    2063                 }        
    2064                 if (!class_exists($class)) { 
    2065                         ADOConnection::outp("Unknown class $class in GetActiveRcordsClass()"); 
    2066                         return $false; 
    2067                 } 
    2068                 $arr = array(); 
    2069                 foreach($rows as $row) { 
    2070                  
    2071                         $obj = new $class($table,$primkeyArr,$this); 
    2072                         if ($obj->ErrorMsg()){ 
    2073                                 $this->_errorMsg = $obj->ErrorMsg(); 
    2074                                 return $false; 
    2075                         } 
    2076                         $obj->Set($row); 
    2077                         $arr[] = $obj; 
    2078                 } 
    2079                 return $arr; 
    2080         } 
    2081          
    2082         function &GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false) 
    2083         { 
    2084                 $arr =& $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr); 
     2154                ## reduce overhead of adodb.inc.php -- moved to adodb-active-record.inc.php 
     2155                ## if adodb-active-recordx is loaded -- should be no issue as they will probably use Find() 
     2156                if (!isset($_ADODB_ACTIVE_DBS))include_once(ADODB_DIR.'/adodb-active-record.inc.php'); 
     2157                return adodb_GetActiveRecordsClass($this, $class, $table, $whereOrderBy, $bindarr, $primkeyArr, $extra, $relations); 
     2158        } 
     2159         
     2160        function GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false) 
     2161        { 
     2162                $arr = $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr); 
    20852163                return $arr; 
    20862164        } 
     
    22052283                } 
    22062284         
     2285          /** 
     2286      * List procedures or functions in an array. 
     2287      * @param procedureNamePattern  a procedure name pattern; must match the procedure name as it is stored in the database 
     2288      * @param catalog a catalog name; must match the catalog name as it is stored in the database; 
     2289      * @param schemaPattern a schema name pattern; 
     2290      * 
     2291      * @return array of procedures on current database. 
     2292           
     2293                 Array ( 
     2294                    [name_of_procedure] => Array 
     2295                      ( 
     2296                      [type] => PROCEDURE or FUNCTION 
     2297                      [catalog] => Catalog_name 
     2298                      [schema] => Schema_name 
     2299                      [remarks] => explanatory comment on the procedure  
     2300                      ) 
     2301                 )               
     2302      */ 
     2303     function MetaProcedures($procedureNamePattern = null, $catalog  = null, $schemaPattern  = null) 
     2304     { 
     2305            return false; 
     2306     } 
     2307 
    22072308                 
    22082309        /** 
     
    22162317         * @return  array of tables for current database. 
    22172318         */  
    2218         function &MetaTables($ttype=false,$showSchema=false,$mask=false)  
     2319        function MetaTables($ttype=false,$showSchema=false,$mask=false)  
    22192320        { 
    22202321        global $ADODB_FETCH_MODE; 
     
    22362337                         
    22372338                        if ($rs === false) return $false; 
    2238                         $arr =& $rs->GetArray(); 
     2339                        $arr = $rs->GetArray(); 
    22392340                        $arr2 = array(); 
    22402341                         
     
    22782379         * @return  array of ADOFieldObjects for current table. 
    22792380         */ 
    2280         function &MetaColumns($table,$normalize=true)  
     2381        function MetaColumns($table,$normalize=true)  
    22812382        { 
    22822383        global $ADODB_FETCH_MODE; 
     
    23372438                )                
    23382439      */ 
    2339      function &MetaIndexes($table, $primary = false, $owner = false) 
     2440     function MetaIndexes($table, $primary = false, $owner = false) 
    23402441     { 
    23412442                        $false = false; 
     
    23492450         * @return  array of column names for current table. 
    23502451         */  
    2351         function &MetaColumnNames($table, $numIndexes=false,$useattnum=false /* only for postgres */)  
    2352         { 
    2353                 $objarr =& $this->MetaColumns($table); 
     2452        function MetaColumnNames($table, $numIndexes=false,$useattnum=false /* only for postgres */)  
     2453        { 
     2454                $objarr = $this->MetaColumns($table); 
    23542455                if (!is_array($objarr)) { 
    23552456                        $false = false; 
     
    23952496         * @return  date string in database date format 
    23962497         */ 
    2397         function DBDate($d) 
     2498        function DBDate($d, $isfld=false) 
    23982499        { 
    23992500                if (empty($d) && $d !== 0) return 'null'; 
    2400  
     2501                if ($isfld) return $d; 
     2502                 
     2503                if (is_object($d)) return $d->format($this->fmtDate); 
     2504                 
     2505                 
    24012506                if (is_string($d) && !is_numeric($d)) { 
    2402                         if ($d === 'null' || strncmp($d,"'",1) === 0) return $d; 
     2507                        if ($d === 'null') return $d; 
     2508                        if (strncmp($d,"'",1) === 0) { 
     2509                                $d = _adodb_safedateq($d); 
     2510                                return $d; 
     2511                        } 
    24032512                        if ($this->isoDates) return "'$d'"; 
    24042513                        $d = ADOConnection::UnixDate($d); 
     
    24322541         * @return  timestamp string in database timestamp format 
    24332542         */ 
    2434         function DBTimeStamp($ts) 
     2543        function DBTimeStamp($ts,$isfld=false) 
    24352544        { 
    24362545                if (empty($ts) && $ts !== 0) return 'null'; 
    2437  
     2546                if ($isfld) return $ts; 
     2547                if (is_object($ts)) return $ts->format($this->fmtTimeStamp); 
     2548                 
    24382549                # strlen(14) allows YYYYMMDDHHMMSS format 
    24392550                if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14))  
     
    24412552                 
    24422553                if ($ts === 'null') return $ts; 
    2443                 if ($this->isoDates && strlen($ts) !== 14) return "'$ts'"; 
    2444                  
     2554                if ($this->isoDates && strlen($ts) !== 14) { 
     2555                        $ts = _adodb_safedate($ts); 
     2556                        return "'$ts'"; 
     2557                } 
    24452558                $ts = ADOConnection::UnixTimeStamp($ts); 
    24462559                return adodb_date($this->fmtTimeStamp,$ts); 
     
    24532566         * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format 
    24542567         */ 
    2455         function UnixDate($v) 
     2568        static function UnixDate($v) 
    24562569        { 
    24572570                if (is_object($v)) { 
     
    24772590         * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format 
    24782591         */ 
    2479         function UnixTimeStamp($v) 
     2592        static function UnixTimeStamp($v) 
    24802593        { 
    24812594                if (is_object($v)) { 
     
    25632676                $s = str_replace('\\"','"',$s); 
    25642677                 
    2565                 if ($this->replaceQuote == "\\'")  // ' already quoted, no need to change anything 
     2678                if ($this->replaceQuote == "\\'" || ini_get('magic_quotes_sybase'))  // ' already quoted, no need to change anything 
    25662679                        return $s; 
    25672680                else {// change \' to '' for sybase/mssql 
     
    25972710                $s = str_replace('\\"','"',$s); 
    25982711                 
    2599                 if ($this->replaceQuote == "\\'")  // ' already quoted, no need to change anything 
     2712                if ($this->replaceQuote == "\\'" || ini_get('magic_quotes_sybase'))  // ' already quoted, no need to change anything 
    26002713                        return "'$s'"; 
    26012714                else {// change \' to '' for sybase/mssql 
     
    26232736        * 
    26242737        */ 
    2625         function &PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0)  
     2738        function PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0)  
    26262739        { 
    26272740                global $ADODB_INCLUDED_LIB; 
    26282741                if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); 
    2629                 if ($this->pageExecuteCountRows) $rs =& _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache); 
    2630                 else $rs =& _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache); 
     2742                if ($this->pageExecuteCountRows) $rs = _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache); 
     2743                else $rs = _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache); 
    26312744                return $rs; 
    26322745        } 
     
    26452758        * @return               the recordset ($rs->databaseType == 'array') 
    26462759        */ 
    2647         function &CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false)  
     2760        function CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false)  
    26482761        { 
    26492762                /*switch($this->dataProvider) { 
     
    26532766                default: $secs2cache = 0; break; 
    26542767                }*/ 
    2655                 $rs =& $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache); 
     2768                $rs = $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache); 
    26562769                return $rs; 
    26572770        } 
     
    26752788        //==============================================================================================         
    26762789         
     2790        class ADODB_Iterator_empty implements Iterator { 
     2791         
     2792            private $rs; 
     2793         
     2794            function __construct($rs)  
     2795                { 
     2796                $this->rs = $rs; 
     2797            } 
     2798            function rewind()  
     2799                { 
     2800            } 
     2801         
     2802                function valid()  
     2803                { 
     2804                return !$this->rs->EOF; 
     2805            } 
     2806                 
     2807            function key()  
     2808                { 
     2809                return false; 
     2810            } 
     2811                 
     2812            function current()  
     2813                { 
     2814                return false; 
     2815            } 
     2816                 
     2817            function next()  
     2818                { 
     2819            } 
     2820                 
     2821                function __call($func, $params) 
     2822                { 
     2823                        return call_user_func_array(array($this->rs, $func), $params); 
     2824                } 
     2825                 
     2826                function hasMore() 
     2827                { 
     2828                        return false; 
     2829                } 
     2830         
     2831        } 
     2832 
     2833         
    26772834        /** 
    26782835        * Lightweight recordset when there are no records to be returned 
    26792836        */ 
    2680         class ADORecordSet_empty 
     2837        class ADORecordSet_empty implements IteratorAggregate 
    26812838        { 
    26822839                var $dataProvider = 'empty'; 
     
    26932850                function FieldCount(){ return 0;} 
    26942851                function Init() {} 
     2852                function getIterator() {return new ADODB_Iterator_empty($this);} 
     2853                function GetAssoc() {return array();} 
    26952854        } 
    26962855         
     
    27042863        //==============================================================================================         
    27052864 
    2706         if (PHP_VERSION < 5) include_once(ADODB_DIR.'/adodb-php4.inc.php'); 
    2707         else include_once(ADODB_DIR.'/adodb-iterator.inc.php'); 
     2865        class ADODB_Iterator implements Iterator { 
     2866         
     2867            private $rs; 
     2868         
     2869            function __construct($rs)  
     2870                { 
     2871                $this->rs = $rs; 
     2872            } 
     2873            function rewind()  
     2874                { 
     2875                $this->rs->MoveFirst(); 
     2876            } 
     2877         
     2878                function valid()  
     2879                { 
     2880                return !$this->rs->EOF; 
     2881            } 
     2882                 
     2883            function key()  
     2884                { 
     2885                return $this->rs->_currentRow; 
     2886            } 
     2887                 
     2888            function current()  
     2889                { 
     2890                return $this->rs->fields; 
     2891            } 
     2892                 
     2893            function next()  
     2894                { 
     2895                $this->rs->MoveNext(); 
     2896            } 
     2897                 
     2898                function __call($func, $params) 
     2899                { 
     2900                        return call_user_func_array(array($this->rs, $func), $params); 
     2901                } 
     2902         
     2903                 
     2904                function hasMore() 
     2905                { 
     2906                        return !$this->rs->EOF; 
     2907                } 
     2908         
     2909        } 
     2910 
     2911 
     2912 
    27082913   /** 
    27092914         * RecordSet class that represents the dataset returned by the database. 
     
    27122917         * means recordcount not known). 
    27132918         */ 
    2714         class ADORecordSet extends ADODB_BASE_RS { 
     2919        class ADORecordSet implements IteratorAggregate { 
    27152920        /* 
    27162921         * public variables      
     
    27622967        } 
    27632968         
     2969        function getIterator()  
     2970        { 
     2971        return new ADODB_Iterator($this); 
     2972    } 
     2973         
     2974        /* this is experimental - i don't really know what to return... */ 
     2975        function __toString() 
     2976        { 
     2977                include_once(ADODB_DIR.'/toexport.inc.php'); 
     2978                return _adodb_export($this,',',',',false,true);