source: Dev/trunk/rdfapi/util/adodb/session/adodb-session2.php @ 12

Last change on this file since 12 was 12, checked in by basvannuland, 14 years ago

Added RAP RDF API
Added RDF reader writer for save and load survey

File size: 21.8 KB
Line 
1<?php
2
3
4/*
5V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
6         Contributed by Ross Smith (adodb@netebb.com).
7  Released under both BSD license and Lesser GPL library license.
8  Whenever there is any discrepancy between the two licenses,
9  the BSD license will take precedence.
10          Set tabs to 4 for best viewing.
11         
12
13*/
14
15/*
16
17CREATE Table SCripts
18
19Oracle
20======
21
22CREATE TABLE SESSIONS2
23(
24  SESSKEY    VARCHAR2(48 BYTE)                  NOT NULL,
25  EXPIRY     DATE                               NOT NULL,
26  EXPIREREF  VARCHAR2(200 BYTE),
27  CREATED    DATE                               NOT NULL,
28  MODIFIED   DATE                               NOT NULL,
29  SESSDATA   CLOB,
30  PRIMARY KEY(SESSKEY)
31);
32
33
34CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY);
35CREATE UNIQUE INDEX SESS2_PK ON SESSIONS2(SESSKEY);
36CREATE INDEX SESS2_EXP_REF ON SESSIONS2(EXPIREREF);
37
38
39 
40 MySQL
41 =====
42 
43CREATE TABLE sessions2(
44        sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
45        expiry TIMESTAMP NOT NULL ,
46        expireref VARCHAR( 250 ) DEFAULT '',
47        created TIMESTAMP NOT NULL ,
48        modified TIMESTAMP NOT NULL ,
49        sessdata LONGTEXT DEFAULT '',
50        PRIMARY KEY ( sesskey ) ,
51        INDEX sess2_expiry( expiry ),
52        INDEX sess2_expireref( expireref )
53)
54
55
56*/
57
58if (!defined('_ADODB_LAYER')) {
59        require realpath(dirname(__FILE__) . '/../adodb.inc.php');
60}
61
62if (defined('ADODB_SESSION')) return 1;
63
64define('ADODB_SESSION', dirname(__FILE__));
65define('ADODB_SESSION2', ADODB_SESSION);
66
67/*
68        Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821
69       
70        From Kerr Schere, to unserialize session data stored via ADOdb.
71        1. Pull the session data from the db and loop through it.
72        2. Inside the loop, you will need to urldecode the data column.
73        3. After urldecode, run the serialized string through this function:
74
75*/
76function adodb_unserialize( $serialized_string )
77{
78        $variables = array( );
79        $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
80        for( $i = 0; $i < count( $a ); $i = $i+2 ) {
81                $variables[$a[$i]] = unserialize( $a[$i+1] );
82        }
83        return( $variables );
84}
85
86/*
87        Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
88        Since adodb 4.61.
89*/
90function adodb_session_regenerate_id()
91{
92        $conn =& ADODB_Session::_conn();
93        if (!$conn) return false;
94
95        $old_id = session_id();
96        if (function_exists('session_regenerate_id')) {
97                session_regenerate_id();
98        } else {
99                session_id(md5(uniqid(rand(), true)));
100                $ck = session_get_cookie_params();
101                setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
102                //@session_start();
103        }
104        $new_id = session_id();
105        $ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
106       
107        /* it is possible that the update statement fails due to a collision */
108        if (!$ok) {
109                session_id($old_id);
110                if (empty($ck)) $ck = session_get_cookie_params();
111                setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
112                return false;
113        }
114       
115        return true;
116}
117
118/*
119    Generate database table for session data
120    @see http://phplens.com/lens/lensforum/msgs.php?id=12280
121    @return 0 if failure, 1 if errors, 2 if successful.
122        @author Markus Staab http://www.public-4u.de
123*/
124function adodb_session_create_table($schemaFile=null,$conn = null)
125{
126    // set default values
127    if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml';
128    if ($conn===null) $conn =& ADODB_Session::_conn();
129
130        if (!$conn) return 0;
131
132    $schema = new adoSchema($conn);
133    $schema->ParseSchema($schemaFile);
134    return $schema->ExecuteSchema();
135}
136
137/*!
138        \static
139*/
140class ADODB_Session {
141        /////////////////////
142        // getter/setter methods
143        /////////////////////
144       
145        /*
146       
147        function Lock($lock=null)
148        {
149        static $_lock = false;
150       
151                if (!is_null($lock)) $_lock = $lock;
152                return $lock;
153        }
154        */
155        /*!
156        */
157        function driver($driver = null)
158        {
159                static $_driver = 'mysql';
160                static $set = false;
161
162                if (!is_null($driver)) {
163                        $_driver = trim($driver);
164                        $set = true;
165                } elseif (!$set) {
166                        // backwards compatibility
167                        if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
168                                return $GLOBALS['ADODB_SESSION_DRIVER'];
169                        }
170                }
171
172                return $_driver;
173        }
174
175        /*!
176        */
177        function host($host = null) {
178                static $_host = 'localhost';
179                static $set = false;
180
181                if (!is_null($host)) {
182                        $_host = trim($host);
183                        $set = true;
184                } elseif (!$set) {
185                        // backwards compatibility
186                        if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
187                                return $GLOBALS['ADODB_SESSION_CONNECT'];
188                        }
189                }
190
191                return $_host;
192        }
193
194        /*!
195        */
196        function user($user = null)
197        {
198                static $_user = 'root';
199                static $set = false;
200
201                if (!is_null($user)) {
202                        $_user = trim($user);
203                        $set = true;
204                } elseif (!$set) {
205                        // backwards compatibility
206                        if (isset($GLOBALS['ADODB_SESSION_USER'])) {
207                                return $GLOBALS['ADODB_SESSION_USER'];
208                        }
209                }
210
211                return $_user;
212        }
213
214        /*!
215        */
216        function password($password = null)
217        {
218                static $_password = '';
219                static $set = false;
220
221                if (!is_null($password)) {
222                        $_password = $password;
223                        $set = true;
224                } elseif (!$set) {
225                        // backwards compatibility
226                        if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
227                                return $GLOBALS['ADODB_SESSION_PWD'];
228                        }
229                }
230
231                return $_password;
232        }
233
234        /*!
235        */
236        function database($database = null)
237        {
238                static $_database = '';
239                static $set = false;
240               
241                if (!is_null($database)) {
242                        $_database = trim($database);
243                        $set = true;
244                } elseif (!$set) {
245                        // backwards compatibility
246                        if (isset($GLOBALS['ADODB_SESSION_DB'])) {
247                                return $GLOBALS['ADODB_SESSION_DB'];
248                        }
249                }
250                return $_database;
251        }
252
253        /*!
254        */
255        function persist($persist = null)
256        {
257                static $_persist = true;
258
259                if (!is_null($persist)) {
260                        $_persist = trim($persist);
261                }
262
263                return $_persist;
264        }
265
266        /*!
267        */
268        function lifetime($lifetime = null)
269        {
270                static $_lifetime;
271                static $set = false;
272
273                if (!is_null($lifetime)) {
274                        $_lifetime = (int) $lifetime;
275                        $set = true;
276                } elseif (!$set) {
277                        // backwards compatibility
278                        if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
279                                return $GLOBALS['ADODB_SESS_LIFE'];
280                        }
281                }
282                if (!$_lifetime) {
283                        $_lifetime = ini_get('session.gc_maxlifetime');
284                        if ($_lifetime <= 1) {
285                                // bug in PHP 4.0.3 pl 1  -- how about other versions?
286                                //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>";
287                                $_lifetime = 1440;
288                        }
289                }
290
291                return $_lifetime;
292        }
293
294        /*!
295        */
296        function debug($debug = null)
297        {
298                static $_debug = false;
299                static $set = false;
300
301                if (!is_null($debug)) {
302                        $_debug = (bool) $debug;
303
304                        $conn = ADODB_Session::_conn();
305                        if ($conn) {
306                                $conn->debug = $_debug;
307                        }
308                        $set = true;
309                } elseif (!$set) {
310                        // backwards compatibility
311                        if (isset($GLOBALS['ADODB_SESS_DEBUG'])) {
312                                return $GLOBALS['ADODB_SESS_DEBUG'];
313                        }
314                }
315
316                return $_debug;
317        }
318
319        /*!
320        */
321        function expireNotify($expire_notify = null)
322        {
323                static $_expire_notify;
324                static $set = false;
325
326                if (!is_null($expire_notify)) {
327                        $_expire_notify = $expire_notify;
328                        $set = true;
329                } elseif (!$set) {
330                        // backwards compatibility
331                        if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) {
332                                return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'];
333                        }
334                }
335
336                return $_expire_notify;
337        }
338
339        /*!
340        */
341        function table($table = null)
342        {
343                static $_table = 'sessions2';
344                static $set = false;
345
346                if (!is_null($table)) {
347                        $_table = trim($table);
348                        $set = true;
349                } elseif (!$set) {
350                        // backwards compatibility
351                        if (isset($GLOBALS['ADODB_SESSION_TBL'])) {
352                                return $GLOBALS['ADODB_SESSION_TBL'];
353                        }
354                }
355
356                return $_table;
357        }
358
359        /*!
360        */
361        function optimize($optimize = null)
362        {
363                static $_optimize = false;
364                static $set = false;
365
366                if (!is_null($optimize)) {
367                        $_optimize = (bool) $optimize;
368                        $set = true;
369                } elseif (!$set) {
370                        // backwards compatibility
371                        if (defined('ADODB_SESSION_OPTIMIZE')) {
372                                return true;
373                        }
374                }
375
376                return $_optimize;
377        }
378
379        /*!
380        */
381        function syncSeconds($sync_seconds = null) {
382                //echo ("<p>WARNING: ADODB_SESSION::syncSeconds is longer used, please remove this function for your code</p>");
383               
384                return 0;
385        }
386
387        /*!
388        */
389        function clob($clob = null) {
390                static $_clob = false;
391                static $set = false;
392
393                if (!is_null($clob)) {
394                        $_clob = strtolower(trim($clob));
395                        $set = true;
396                } elseif (!$set) {
397                        // backwards compatibility
398                        if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) {
399                                return $GLOBALS['ADODB_SESSION_USE_LOBS'];
400                        }
401                }
402
403                return $_clob;
404        }
405
406        /*!
407        */
408        function dataFieldName($data_field_name = null) {
409                //echo ("<p>WARNING: ADODB_SESSION::dataFieldName() is longer used, please remove this function for your code</p>");
410                return '';
411        }
412
413        /*!
414        */
415        function filter($filter = null) {
416                static $_filter = array();
417
418                if (!is_null($filter)) {
419                        if (!is_array($filter)) {
420                                $filter = array($filter);
421                        }
422                        $_filter = $filter;
423                }
424
425                return $_filter;
426        }
427
428        /*!
429        */
430        function encryptionKey($encryption_key = null) {
431                static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!';
432
433                if (!is_null($encryption_key)) {
434                        $_encryption_key = $encryption_key;
435                }
436
437                return $_encryption_key;
438        }
439
440        /////////////////////
441        // private methods
442        /////////////////////
443
444        /*!
445        */
446        function &_conn($conn=null) {
447                return $GLOBALS['ADODB_SESS_CONN'];
448        }
449
450        /*!
451        */
452        function _crc($crc = null) {
453                static $_crc = false;
454
455                if (!is_null($crc)) {
456                        $_crc = $crc;
457                }
458
459                return $_crc;
460        }
461
462        /*!
463        */
464        function _init() {
465                session_module_name('user');
466                session_set_save_handler(
467                        array('ADODB_Session', 'open'),
468                        array('ADODB_Session', 'close'),
469                        array('ADODB_Session', 'read'),
470                        array('ADODB_Session', 'write'),
471                        array('ADODB_Session', 'destroy'),
472                        array('ADODB_Session', 'gc')
473                );
474        }
475
476
477        /*!
478        */
479        function _sessionKey() {
480                // use this function to create the encryption key for crypted sessions
481                // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt
482                return crypt(ADODB_Session::encryptionKey(), session_id());
483        }
484
485        /*!
486        */
487        function _dumprs($rs) {
488                $conn   =& ADODB_Session::_conn();
489                $debug  = ADODB_Session::debug();
490
491                if (!$conn) {
492                        return;
493                }
494
495                if (!$debug) {
496                        return;
497                }
498
499                if (!$rs) {
500                        echo "<br />\$rs is null or false<br />\n";
501                        return;
502                }
503
504                //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";
505
506                if (!is_object($rs)) {
507                        return;
508                }
509
510                require_once ADODB_SESSION.'/../tohtml.inc.php';
511                rs2html($rs);
512        }
513
514        /////////////////////
515        // public methods
516        /////////////////////
517       
518        function config($driver, $host, $user, $password, $database=false,$options=false)
519        {
520                ADODB_Session::driver($driver);
521                ADODB_Session::host($host);
522                ADODB_Session::user($user);
523                ADODB_Session::password($password);
524                ADODB_Session::database($database);
525               
526                if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';
527               
528                if (isset($options['table'])) ADODB_Session::table($options['table']);
529                if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
530                if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
531        }
532
533        /*!
534                Create the connection to the database.
535
536                If $conn already exists, reuse that connection
537        */
538        function open($save_path, $session_name, $persist = null)
539        {
540                $conn =& ADODB_Session::_conn();
541
542                if ($conn) {
543                        return true;
544                }
545
546                $database       = ADODB_Session::database();
547                $debug          = ADODB_Session::debug();
548                $driver         = ADODB_Session::driver();
549                $host           = ADODB_Session::host();
550                $password       = ADODB_Session::password();
551                $user           = ADODB_Session::user();
552
553                if (!is_null($persist)) {
554                        ADODB_Session::persist($persist);
555                } else {
556                        $persist = ADODB_Session::persist();
557                }
558
559# these can all be defaulted to in php.ini
560#               assert('$database');
561#               assert('$driver');
562#               assert('$host');
563
564                $conn =& ADONewConnection($driver);
565
566                if ($debug) {
567                        $conn->debug = true;           
568                        ADOConnection::outp( " driver=$driver user=$user db=$database ");
569                }
570               
571                if ($persist) {
572                        switch($persist) {
573                        default:
574                        case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
575                        case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
576                        case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
577                        }
578                } else {
579                        $ok = $conn->Connect($host, $user, $password, $database);
580                }
581
582                if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
583                else
584                        ADOConnection::outp('<p>Session: connection failed</p>', false);
585               
586
587                return $ok;
588        }
589
590        /*!
591                Close the connection
592        */
593        function close()
594        {
595/*
596                $conn =& ADODB_Session::_conn();
597                if ($conn) $conn->Close();
598*/
599                return true;
600        }
601
602        /*
603                Slurp in the session variables and return the serialized string
604        */
605        function read($key)
606        {
607                $conn   =& ADODB_Session::_conn();
608                $filter = ADODB_Session::filter();
609                $table  = ADODB_Session::table();
610
611                if (!$conn) {
612                        return '';
613                }
614
615                //assert('$table');
616
617                $qkey = $conn->quote($key);
618                $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
619       
620                $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . $conn->sysTimeStamp;
621                /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if
622                  developer has commited elsewhere... :(
623                 */
624                #if (ADODB_Session::Lock())
625                #       $rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata);
626                #else
627               
628                        $rs =& $conn->Execute($sql);
629                //ADODB_Session::_dumprs($rs);
630                if ($rs) {
631                        if ($rs->EOF) {
632                                $v = '';
633                        } else {
634                                $v = reset($rs->fields);
635                                $filter = array_reverse($filter);
636                                foreach ($filter as $f) {
637                                        if (is_object($f)) {
638                                                $v = $f->read($v, ADODB_Session::_sessionKey());
639                                        }
640                                }
641                                $v = rawurldecode($v);
642                        }
643
644                        $rs->Close();
645
646                        ADODB_Session::_crc(strlen($v) . crc32($v));
647                        return $v;
648                }
649
650                return '';
651        }
652
653        /*!
654                Write the serialized data to a database.
655
656                If the data has not been modified since the last read(), we do not write.
657        */
658        function write($key, $val)
659        {
660        global $ADODB_SESSION_READONLY;
661       
662                if (!empty($ADODB_SESSION_READONLY)) return;
663               
664                $clob                   = ADODB_Session::clob();
665                $conn                   =& ADODB_Session::_conn();
666                $crc                    = ADODB_Session::_crc();
667                $debug                  = ADODB_Session::debug();
668                $driver                 = ADODB_Session::driver();
669                $expire_notify  = ADODB_Session::expireNotify();
670                $filter                 = ADODB_Session::filter();
671                $lifetime               = ADODB_Session::lifetime();
672                $table                  = ADODB_Session::table();
673       
674                if (!$conn) {
675                        return false;
676                }
677       
678                $sysTimeStamp = $conn->sysTimeStamp;
679               
680                //assert('$table');
681
682                $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp);
683
684                $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
685
686                // crc32 optimization since adodb 2.1
687                // now we only update expiry date, thx to sebastian thom in adodb 2.32
688                if ($crc !== false && $crc == (strlen($val) . crc32($val))) {
689                        if ($debug) {
690                                echo '<p>Session: Only updating date - crc32 not changed</p>';
691                        }
692                       
693                        $expirevar = '';
694                        if ($expire_notify) {
695                                $var = reset($expire_notify);
696                                global $$var;
697                                if (isset($$var)) {
698                                        $expirevar = $$var;
699                                }
700                        }
701                       
702                       
703                        $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp";
704                        $rs =& $conn->Execute($sql,array($expirevar,$key));
705                        return true;
706                }
707                $val = rawurlencode($val);
708                foreach ($filter as $f) {
709                        if (is_object($f)) {
710                                $val = $f->write($val, ADODB_Session::_sessionKey());
711                        }
712                }
713
714                $expireref = '';
715                if ($expire_notify) {
716                        $var = reset($expire_notify);
717                        global $$var;
718                        if (isset($$var)) {
719                                $expireref = $$var;
720                        }
721                }
722
723                if (!$clob) {   // no lobs, simply use replace()
724                        $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
725                        if ($rs) $rs->Close();
726                                       
727                        if ($rs && reset($rs->fields) > 0) {
728                                $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2');
729                               
730                        } else {
731                                $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
732                                        VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)";
733                        }
734                       
735       
736                        $rs =& $conn->Execute($sql,array($val,$expireref,$key));
737                       
738                } else {
739                        // what value shall we insert/update for lob row?
740                        switch ($driver) {
741                                // empty_clob or empty_lob for oracle dbs
742                                case 'oracle':
743                                case 'oci8':
744                                case 'oci8po':
745                                case 'oci805':
746                                        $lob_value = sprintf('empty_%s()', strtolower($clob));
747                                        break;
748
749                                // null for all other
750                                default:
751                                        $lob_value = 'null';
752                                        break;
753                        }
754                       
755                        $conn->StartTrans();
756                       
757                        $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
758                        if ($rs) $rs->Close();
759                                       
760                        if ($rs && reset($rs->fields) > 0) {
761                                $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1');
762                               
763                        } else {
764                                $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
765                                        VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)";
766                        }
767                       
768                        $rs =& $conn->Execute($sql,array($expireref,$key));
769                       
770                        $qkey = $conn->qstr($key);
771                        $rs2 =& $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob));
772                        $rs = @$conn->CompleteTrans();
773                       
774                       
775                }
776
777                if (!$rs) {
778                        ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
779                        return false;
780                }  else {
781                        // bug in access driver (could be odbc?) means that info is not committed
782                        // properly unless select statement executed in Win2000
783                        if ($conn->databaseType == 'access') {
784                                $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
785                                $rs =& $conn->Execute($sql);
786                                ADODB_Session::_dumprs($rs);
787                                if ($rs) {
788                                        $rs->Close();
789                                }
790                        }
791                }/*
792                if (ADODB_Session::Lock()) {
793                        $conn->CommitTrans();
794                }*/
795                return $rs ? true : false;
796        }
797
798        /*!
799        */
800        function destroy($key) {
801                $conn                   =& ADODB_Session::_conn();
802                $table                  = ADODB_Session::table();
803                $expire_notify  = ADODB_Session::expireNotify();
804
805                if (!$conn) {
806                        return false;
807                }
808
809                //assert('$table');
810
811                $qkey = $conn->quote($key);
812                $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
813
814                if ($expire_notify) {
815                        reset($expire_notify);
816                        $fn = next($expire_notify);
817                        $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
818                        $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
819                        $rs =& $conn->Execute($sql);
820                        ADODB_Session::_dumprs($rs);
821                        $conn->SetFetchMode($savem);
822                        if (!$rs) {
823                                return false;
824                        }
825                        if (!$rs->EOF) {
826                                $ref = $rs->fields[0];
827                                $key = $rs->fields[1];
828                                //assert('$ref');
829                                //assert('$key');
830                                $fn($ref, $key);
831                        }
832                        $rs->Close();
833                }
834
835                $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
836                $rs =& $conn->Execute($sql);
837                ADODB_Session::_dumprs($rs);
838                if ($rs) {
839                        $rs->Close();
840                }
841
842                return $rs ? true : false;
843        }
844
845        /*!
846        */
847        function gc($maxlifetime)
848        {
849                $conn                   =& ADODB_Session::_conn();
850                $debug                  = ADODB_Session::debug();
851                $expire_notify  = ADODB_Session::expireNotify();
852                $optimize               = ADODB_Session::optimize();
853                $table                  = ADODB_Session::table();
854
855                if (!$conn) {
856                        return false;
857                }
858
859                //assert('$table');
860
861                $time = $conn->sysTimeStamp;
862                $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
863
864                if ($expire_notify) {
865                        reset($expire_notify);
866                        $fn = next($expire_notify);
867                        $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
868                        $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";
869                        $rs =& $conn->Execute($sql);
870                        ADODB_Session::_dumprs($rs);
871                        $conn->SetFetchMode($savem);
872                        if ($rs) {
873                                $conn->StartTrans();
874                                $keys = array();
875                                while (!$rs->EOF) {
876                                        $ref = $rs->fields[0];
877                                        $key = $rs->fields[1];
878                                        $fn($ref, $key);
879                                        $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));
880                                        $rs->MoveNext();
881                                }
882                                $rs->Close();
883                               
884                                $conn->CompleteTrans();
885                        }
886                } else {
887               
888                        if (0) {
889                                $sql = "SELECT sesskey FROM $table WHERE expiry < $time";
890                                $arr =& $conn->GetAll($sql);
891                                foreach ($arr as $row) {
892                                        $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0');
893                                        $conn->Execute($sql2,array($row[0]));
894                                }
895                        } else {
896                                $sql = "DELETE FROM $table WHERE expiry < $time";
897                                $rs =& $conn->Execute($sql);
898                                ADODB_Session::_dumprs($rs);
899                                if ($rs) $rs->Close();
900                        }
901                        if ($debug) {
902                                ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");
903                        }
904                }
905
906                // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
907                if ($optimize) {
908                        $driver = ADODB_Session::driver();
909
910                        if (preg_match('/mysql/i', $driver)) {
911                                $sql = "OPTIMIZE TABLE $table";
912                        }
913                        if (preg_match('/postgres/i', $driver)) {
914                                $sql = "VACUUM $table";
915                        }
916                        if (!empty($sql)) {
917                                $conn->Execute($sql);
918                        }
919                }
920
921               
922                return true;
923        }
924}
925
926ADODB_Session::_init();
927if (empty($ADODB_SESSION_READONLY))
928        register_shutdown_function('session_write_close');
929
930// for backwards compatability only
931function adodb_sess_open($save_path, $session_name, $persist = true) {
932        return ADODB_Session::open($save_path, $session_name, $persist);
933}
934
935// for backwards compatability only
936function adodb_sess_gc($t)
937{       
938        return ADODB_Session::gc($t);
939}
940
941?>
Note: See TracBrowser for help on using the repository browser.