00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 if (!defined('_ADODB_LAYER')) {
00059 require realpath(dirname(__FILE__) . '/../adodb.inc.php');
00060 }
00061
00062 if (defined('ADODB_SESSION')) return 1;
00063
00064 define('ADODB_SESSION', dirname(__FILE__));
00065 define('ADODB_SESSION2', ADODB_SESSION);
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 function adodb_unserialize( $serialized_string )
00077 {
00078 $variables = array( );
00079 $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
00080 for( $i = 0; $i < count( $a ); $i = $i+2 ) {
00081 $variables[$a[$i]] = unserialize( $a[$i+1] );
00082 }
00083 return( $variables );
00084 }
00085
00086
00087
00088
00089
00090 function adodb_session_regenerate_id()
00091 {
00092 $conn =& ADODB_Session::_conn();
00093 if (!$conn) return false;
00094
00095 $old_id = session_id();
00096 if (function_exists('session_regenerate_id')) {
00097 session_regenerate_id();
00098 } else {
00099 session_id(md5(uniqid(rand(), true)));
00100 $ck = session_get_cookie_params();
00101 setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
00102
00103 }
00104 $new_id = session_id();
00105 $ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
00106
00107
00108 if (!$ok) {
00109 session_id($old_id);
00110 if (empty($ck)) $ck = session_get_cookie_params();
00111 setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
00112 return false;
00113 }
00114
00115 return true;
00116 }
00117
00118
00119
00120
00121
00122
00123
00124 function adodb_session_create_table($schemaFile=null,$conn = null)
00125 {
00126
00127 if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml';
00128 if ($conn===null) $conn =& ADODB_Session::_conn();
00129
00130 if (!$conn) return 0;
00131
00132 $schema = new adoSchema($conn);
00133 $schema->ParseSchema($schemaFile);
00134 return $schema->ExecuteSchema();
00135 }
00136
00140 class ADODB_Session {
00142
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00157 function driver($driver = null)
00158 {
00159 static $_driver = 'mysql';
00160 static $set = false;
00161
00162 if (!is_null($driver)) {
00163 $_driver = trim($driver);
00164 $set = true;
00165 } elseif (!$set) {
00166
00167 if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
00168 return $GLOBALS['ADODB_SESSION_DRIVER'];
00169 }
00170 }
00171
00172 return $_driver;
00173 }
00174
00177 function host($host = null) {
00178 static $_host = 'localhost';
00179 static $set = false;
00180
00181 if (!is_null($host)) {
00182 $_host = trim($host);
00183 $set = true;
00184 } elseif (!$set) {
00185
00186 if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
00187 return $GLOBALS['ADODB_SESSION_CONNECT'];
00188 }
00189 }
00190
00191 return $_host;
00192 }
00193
00196 function user($user = null)
00197 {
00198 static $_user = 'root';
00199 static $set = false;
00200
00201 if (!is_null($user)) {
00202 $_user = trim($user);
00203 $set = true;
00204 } elseif (!$set) {
00205
00206 if (isset($GLOBALS['ADODB_SESSION_USER'])) {
00207 return $GLOBALS['ADODB_SESSION_USER'];
00208 }
00209 }
00210
00211 return $_user;
00212 }
00213
00216 function password($password = null)
00217 {
00218 static $_password = '';
00219 static $set = false;
00220
00221 if (!is_null($password)) {
00222 $_password = $password;
00223 $set = true;
00224 } elseif (!$set) {
00225
00226 if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
00227 return $GLOBALS['ADODB_SESSION_PWD'];
00228 }
00229 }
00230
00231 return $_password;
00232 }
00233
00236 function database($database = null)
00237 {
00238 static $_database = '';
00239 static $set = false;
00240
00241 if (!is_null($database)) {
00242 $_database = trim($database);
00243 $set = true;
00244 } elseif (!$set) {
00245
00246 if (isset($GLOBALS['ADODB_SESSION_DB'])) {
00247 return $GLOBALS['ADODB_SESSION_DB'];
00248 }
00249 }
00250 return $_database;
00251 }
00252
00255 function persist($persist = null)
00256 {
00257 static $_persist = true;
00258
00259 if (!is_null($persist)) {
00260 $_persist = trim($persist);
00261 }
00262
00263 return $_persist;
00264 }
00265
00268 function lifetime($lifetime = null)
00269 {
00270 static $_lifetime;
00271 static $set = false;
00272
00273 if (!is_null($lifetime)) {
00274 $_lifetime = (int) $lifetime;
00275 $set = true;
00276 } elseif (!$set) {
00277
00278 if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
00279 return $GLOBALS['ADODB_SESS_LIFE'];
00280 }
00281 }
00282 if (!$_lifetime) {
00283 $_lifetime = ini_get('session.gc_maxlifetime');
00284 if ($_lifetime <= 1) {
00285
00286
00287 $_lifetime = 1440;
00288 }
00289 }
00290
00291 return $_lifetime;
00292 }
00293
00296 function debug($debug = null)
00297 {
00298 static $_debug = false;
00299 static $set = false;
00300
00301 if (!is_null($debug)) {
00302 $_debug = (bool) $debug;
00303
00304 $conn = ADODB_Session::_conn();
00305 if ($conn) {
00306 $conn->debug = $_debug;
00307 }
00308 $set = true;
00309 } elseif (!$set) {
00310
00311 if (isset($GLOBALS['ADODB_SESS_DEBUG'])) {
00312 return $GLOBALS['ADODB_SESS_DEBUG'];
00313 }
00314 }
00315
00316 return $_debug;
00317 }
00318
00321 function expireNotify($expire_notify = null)
00322 {
00323 static $_expire_notify;
00324 static $set = false;
00325
00326 if (!is_null($expire_notify)) {
00327 $_expire_notify = $expire_notify;
00328 $set = true;
00329 } elseif (!$set) {
00330
00331 if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) {
00332 return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'];
00333 }
00334 }
00335
00336 return $_expire_notify;
00337 }
00338
00341 function table($table = null)
00342 {
00343 static $_table = 'sessions2';
00344 static $set = false;
00345
00346 if (!is_null($table)) {
00347 $_table = trim($table);
00348 $set = true;
00349 } elseif (!$set) {
00350
00351 if (isset($GLOBALS['ADODB_SESSION_TBL'])) {
00352 return $GLOBALS['ADODB_SESSION_TBL'];
00353 }
00354 }
00355
00356 return $_table;
00357 }
00358
00361 function optimize($optimize = null)
00362 {
00363 static $_optimize = false;
00364 static $set = false;
00365
00366 if (!is_null($optimize)) {
00367 $_optimize = (bool) $optimize;
00368 $set = true;
00369 } elseif (!$set) {
00370
00371 if (defined('ADODB_SESSION_OPTIMIZE')) {
00372 return true;
00373 }
00374 }
00375
00376 return $_optimize;
00377 }
00378
00381 function syncSeconds($sync_seconds = null) {
00382
00383
00384 return 0;
00385 }
00386
00389 function clob($clob = null) {
00390 static $_clob = false;
00391 static $set = false;
00392
00393 if (!is_null($clob)) {
00394 $_clob = strtolower(trim($clob));
00395 $set = true;
00396 } elseif (!$set) {
00397
00398 if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) {
00399 return $GLOBALS['ADODB_SESSION_USE_LOBS'];
00400 }
00401 }
00402
00403 return $_clob;
00404 }
00405
00408 function dataFieldName($data_field_name = null) {
00409
00410 return '';
00411 }
00412
00415 function filter($filter = null) {
00416 static $_filter = array();
00417
00418 if (!is_null($filter)) {
00419 if (!is_array($filter)) {
00420 $filter = array($filter);
00421 }
00422 $_filter = $filter;
00423 }
00424
00425 return $_filter;
00426 }
00427
00430 function encryptionKey($encryption_key = null) {
00431 static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!';
00432
00433 if (!is_null($encryption_key)) {
00434 $_encryption_key = $encryption_key;
00435 }
00436
00437 return $_encryption_key;
00438 }
00439
00441
00443
00446 function &_conn($conn=null) {
00447 return $GLOBALS['ADODB_SESS_CONN'];
00448 }
00449
00452 function _crc($crc = null) {
00453 static $_crc = false;
00454
00455 if (!is_null($crc)) {
00456 $_crc = $crc;
00457 }
00458
00459 return $_crc;
00460 }
00461
00464 function _init() {
00465 session_module_name('user');
00466 session_set_save_handler(
00467 array('ADODB_Session', 'open'),
00468 array('ADODB_Session', 'close'),
00469 array('ADODB_Session', 'read'),
00470 array('ADODB_Session', 'write'),
00471 array('ADODB_Session', 'destroy'),
00472 array('ADODB_Session', 'gc')
00473 );
00474 }
00475
00476
00479 function _sessionKey() {
00480
00481
00482 return crypt(ADODB_Session::encryptionKey(), session_id());
00483 }
00484
00487 function _dumprs($rs) {
00488 $conn =& ADODB_Session::_conn();
00489 $debug = ADODB_Session::debug();
00490
00491 if (!$conn) {
00492 return;
00493 }
00494
00495 if (!$debug) {
00496 return;
00497 }
00498
00499 if (!$rs) {
00500 echo "<br />\$rs is null or false<br />\n";
00501 return;
00502 }
00503
00504
00505
00506 if (!is_object($rs)) {
00507 return;
00508 }
00509
00510 require_once ADODB_SESSION.'/../tohtml.inc.php';
00511 rs2html($rs);
00512 }
00513
00515
00517
00518 function config($driver, $host, $user, $password, $database=false,$options=false)
00519 {
00520 ADODB_Session::driver($driver);
00521 ADODB_Session::host($host);
00522 ADODB_Session::user($user);
00523 ADODB_Session::password($password);
00524 ADODB_Session::database($database);
00525
00526 if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';
00527
00528 if (isset($options['table'])) ADODB_Session::table($options['table']);
00529 if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
00530 if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
00531 }
00532
00538 function open($save_path, $session_name, $persist = null)
00539 {
00540 $conn =& ADODB_Session::_conn();
00541
00542 if ($conn) {
00543 return true;
00544 }
00545
00546 $database = ADODB_Session::database();
00547 $debug = ADODB_Session::debug();
00548 $driver = ADODB_Session::driver();
00549 $host = ADODB_Session::host();
00550 $password = ADODB_Session::password();
00551 $user = ADODB_Session::user();
00552
00553 if (!is_null($persist)) {
00554 ADODB_Session::persist($persist);
00555 } else {
00556 $persist = ADODB_Session::persist();
00557 }
00558
00559 # these can all be defaulted to in php.ini
00560 # assert('$database');
00561 # assert('$driver');
00562 # assert('$host');
00563
00564 $conn =& ADONewConnection($driver);
00565
00566 if ($debug) {
00567 $conn->debug = true;
00568 ADOConnection::outp( " driver=$driver user=$user db=$database ");
00569 }
00570
00571 if ($persist) {
00572 switch($persist) {
00573 default:
00574 case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
00575 case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
00576 case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
00577 }
00578 } else {
00579 $ok = $conn->Connect($host, $user, $password, $database);
00580 }
00581
00582 if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
00583 else
00584 ADOConnection::outp('<p>Session: connection failed</p>', false);
00585
00586
00587 return $ok;
00588 }
00589
00593 function close()
00594 {
00595
00596
00597
00598
00599 return true;
00600 }
00601
00602
00603
00604
00605 function read($key)
00606 {
00607 $conn =& ADODB_Session::_conn();
00608 $filter = ADODB_Session::filter();
00609 $table = ADODB_Session::table();
00610
00611 if (!$conn) {
00612 return '';
00613 }
00614
00615
00616
00617 $qkey = $conn->quote($key);
00618 $binary = $conn->dataProvider === 'mysql' ? '' : '';
00619
00620 $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . $conn->sysTimeStamp;
00621
00622
00623
00624 #if (ADODB_Session::Lock())
00625 # $rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata);
00626 #else
00627
00628 $rs =& $conn->Execute($sql);
00629
00630 if ($rs) {
00631 if ($rs->EOF) {
00632 $v = '';
00633 } else {
00634 $v = reset($rs->fields);
00635 $filter = array_reverse($filter);
00636 foreach ($filter as $f) {
00637 if (is_object($f)) {
00638 $v = $f->read($v, ADODB_Session::_sessionKey());
00639 }
00640 }
00641 $v = rawurldecode($v);
00642 }
00643
00644 $rs->Close();
00645
00646 ADODB_Session::_crc(strlen($v) . crc32($v));
00647 return $v;
00648 }
00649
00650 return '';
00651 }
00652
00658 function write($key, $val)
00659 {
00660 global $ADODB_SESSION_READONLY;
00661
00662 if (!empty($ADODB_SESSION_READONLY)) return;
00663
00664 $clob = ADODB_Session::clob();
00665 $conn =& ADODB_Session::_conn();
00666 $crc = ADODB_Session::_crc();
00667 $debug = ADODB_Session::debug();
00668 $driver = ADODB_Session::driver();
00669 $expire_notify = ADODB_Session::expireNotify();
00670 $filter = ADODB_Session::filter();
00671 $lifetime = ADODB_Session::lifetime();
00672 $table = ADODB_Session::table();
00673
00674 if (!$conn) {
00675 return false;
00676 }
00677
00678 $sysTimeStamp = $conn->sysTimeStamp;
00679
00680
00681
00682 $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp);
00683
00684 $binary = $conn->dataProvider === 'mysql' ? '' : '';
00685
00686
00687
00688 if ($crc !== false && $crc == (strlen($val) . crc32($val))) {
00689 if ($debug) {
00690 echo '<p>Session: Only updating date - crc32 not changed</p>';
00691 }
00692
00693 $expirevar = '';
00694 if ($expire_notify) {
00695 $var = reset($expire_notify);
00696 global $$var;
00697 if (isset($$var)) {
00698 $expirevar = $$var;
00699 }
00700 }
00701
00702
00703 $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp";
00704 $rs =& $conn->Execute($sql,array($expirevar,$key));
00705 return true;
00706 }
00707 $val = rawurlencode($val);
00708 foreach ($filter as $f) {
00709 if (is_object($f)) {
00710 $val = $f->write($val, ADODB_Session::_sessionKey());
00711 }
00712 }
00713
00714 $expireref = '';
00715 if ($expire_notify) {
00716 $var = reset($expire_notify);
00717 global $$var;
00718 if (isset($$var)) {
00719 $expireref = $$var;
00720 }
00721 }
00722
00723 if (!$clob) {
00724 $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
00725 if ($rs) $rs->Close();
00726
00727 if ($rs && reset($rs->fields) > 0) {
00728 $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2');
00729
00730 } else {
00731 $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
00732 VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)";
00733 }
00734
00735
00736 $rs =& $conn->Execute($sql,array($val,$expireref,$key));
00737
00738 } else {
00739
00740 switch ($driver) {
00741
00742 case 'oracle':
00743 case 'oci8':
00744 case 'oci8po':
00745 case 'oci805':
00746 $lob_value = sprintf('empty_%s()', strtolower($clob));
00747 break;
00748
00749
00750 default:
00751 $lob_value = 'null';
00752 break;
00753 }
00754
00755 $conn->StartTrans();
00756
00757 $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
00758 if ($rs) $rs->Close();
00759
00760 if ($rs && reset($rs->fields) > 0) {
00761 $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1');
00762
00763 } else {
00764 $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
00765 VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)";
00766 }
00767
00768 $rs =& $conn->Execute($sql,array($expireref,$key));
00769
00770 $qkey = $conn->qstr($key);
00771 $rs2 =& $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob));
00772 $rs = $conn->CompleteTrans();
00773
00774
00775 }
00776
00777 if (!$rs) {
00778 ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
00779 return false;
00780 } else {
00781
00782
00783 if ($conn->databaseType == 'access') {
00784 $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
00785 $rs =& $conn->Execute($sql);
00786 ADODB_Session::_dumprs($rs);
00787 if ($rs) {
00788 $rs->Close();
00789 }
00790 }
00791 }
00792
00793
00794
00795 return $rs ? true : false;
00796 }
00797
00800 function destroy($key) {
00801 $conn =& ADODB_Session::_conn();
00802 $table = ADODB_Session::table();
00803 $expire_notify = ADODB_Session::expireNotify();
00804
00805 if (!$conn) {
00806 return false;
00807 }
00808
00809
00810
00811 $qkey = $conn->quote($key);
00812 $binary = $conn->dataProvider === 'mysql' ? '' : '';
00813
00814 if ($expire_notify) {
00815 reset($expire_notify);
00816 $fn = next($expire_notify);
00817 $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
00818 $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
00819 $rs =& $conn->Execute($sql);
00820 ADODB_Session::_dumprs($rs);
00821 $conn->SetFetchMode($savem);
00822 if (!$rs) {
00823 return false;
00824 }
00825 if (!$rs->EOF) {
00826 $ref = $rs->fields[0];
00827 $key = $rs->fields[1];
00828
00829
00830 $fn($ref, $key);
00831 }
00832 $rs->Close();
00833 }
00834
00835 $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
00836 $rs =& $conn->Execute($sql);
00837 ADODB_Session::_dumprs($rs);
00838 if ($rs) {
00839 $rs->Close();
00840 }
00841
00842 return $rs ? true : false;
00843 }
00844
00847 function gc($maxlifetime)
00848 {
00849 $conn =& ADODB_Session::_conn();
00850 $debug = ADODB_Session::debug();
00851 $expire_notify = ADODB_Session::expireNotify();
00852 $optimize = ADODB_Session::optimize();
00853 $table = ADODB_Session::table();
00854
00855 if (!$conn) {
00856 return false;
00857 }
00858
00859
00860
00861 $time = $conn->sysTimeStamp;
00862 $binary = $conn->dataProvider === 'mysql' ? '' : '';
00863
00864 if ($expire_notify) {
00865 reset($expire_notify);
00866 $fn = next($expire_notify);
00867 $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
00868 $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";
00869 $rs =& $conn->Execute($sql);
00870 ADODB_Session::_dumprs($rs);
00871 $conn->SetFetchMode($savem);
00872 if ($rs) {
00873 $conn->StartTrans();
00874 $keys = array();
00875 while (!$rs->EOF) {
00876 $ref = $rs->fields[0];
00877 $key = $rs->fields[1];
00878 $fn($ref, $key);
00879 $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));
00880 $rs->MoveNext();
00881 }
00882 $rs->Close();
00883
00884 $conn->CompleteTrans();
00885 }
00886 } else {
00887
00888 if (0) {
00889 $sql = "SELECT sesskey FROM $table WHERE expiry < $time";
00890 $arr =& $conn->GetAll($sql);
00891 foreach ($arr as $row) {
00892 $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0');
00893 $conn->Execute($sql2,array($row[0]));
00894 }
00895 } else {
00896 $sql = "DELETE FROM $table WHERE expiry < $time";
00897 $rs =& $conn->Execute($sql);
00898 ADODB_Session::_dumprs($rs);
00899 if ($rs) $rs->Close();
00900 }
00901 if ($debug) {
00902 ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");
00903 }
00904 }
00905
00906
00907 if ($optimize) {
00908 $driver = ADODB_Session::driver();
00909
00910 if (preg_match('/mysql/i', $driver)) {
00911 $sql = "OPTIMIZE TABLE $table";
00912 }
00913 if (preg_match('/postgres/i', $driver)) {
00914 $sql = "VACUUM $table";
00915 }
00916 if (!empty($sql)) {
00917 $conn->Execute($sql);
00918 }
00919 }
00920
00921
00922 return true;
00923 }
00924 }
00925
00926 ADODB_Session::_init();
00927 if (empty($ADODB_SESSION_READONLY))
00928 register_shutdown_function('session_write_close');
00929
00930
00931 function adodb_sess_open($save_path, $session_name, $persist = true) {
00932 return ADODB_Session::open($save_path, $session_name, $persist);
00933 }
00934
00935
00936 function adodb_sess_gc($t)
00937 {
00938 return ADODB_Session::gc($t);
00939 }
00940
00941 ?>