[ Index ]
 

Code source de eGroupWare 1.2.106-2

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/phpgwapi/inc/adodb/session/ -> adodb-session.php (source)

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


Généré le : Sun Feb 25 17:20:01 2007 par Balluche grâce à PHPXref 0.7