[ Index ]
 

Code source de Mantis 1.1.0rc3

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/core/adodb/session/ -> adodb-session2.php (source)

   1  <?php
   2  
   3  
   4  /*
   5  V4.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  
  17  CREATE Table SCripts
  18  
  19  Oracle
  20  ======
  21  
  22  CREATE 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  
  34  CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY);
  35  CREATE UNIQUE INDEX SESS2_PK ON SESSIONS2(SESSKEY);
  36  CREATE INDEX SESS2_EXP_REF ON SESSIONS2(EXPIREREF);
  37  
  38  
  39   
  40   MySQL
  41   =====
  42   
  43  CREATE 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  
  58  if (!defined('_ADODB_LAYER')) {
  59      require realpath(dirname(__FILE__) . '/../adodb.inc.php');
  60  }
  61  
  62  if (defined('ADODB_SESSION')) return 1;
  63  
  64  define('ADODB_SESSION', dirname(__FILE__));
  65  define('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  */
  76  function 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  */
  90  function 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  */
 124  function 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  */
 140  class 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      {
 448          if (isset($GLOBALS['ADODB_SESS_CONN'])) {
 449              $conn =& $GLOBALS['ADODB_SESS_CONN'];
 450              return $conn;
 451          }
 452          $false = false;
 453          return $false;
 454      }
 455  
 456      /*!
 457      */
 458  	function _crc($crc = null) {
 459          static $_crc = false;
 460  
 461          if (!is_null($crc)) {
 462              $_crc = $crc;
 463          }
 464  
 465          return $_crc;
 466      }
 467  
 468      /*!
 469      */
 470  	function _init() {
 471          session_module_name('user');
 472          session_set_save_handler(
 473              array('ADODB_Session', 'open'),
 474              array('ADODB_Session', 'close'),
 475              array('ADODB_Session', 'read'),
 476              array('ADODB_Session', 'write'),
 477              array('ADODB_Session', 'destroy'),
 478              array('ADODB_Session', 'gc')
 479          );
 480      }
 481  
 482  
 483      /*!
 484      */
 485  	function _sessionKey() {
 486          // use this function to create the encryption key for crypted sessions
 487          // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt
 488          return crypt(ADODB_Session::encryptionKey(), session_id());
 489      }
 490  
 491      /*!
 492      */
 493  	function _dumprs($rs) {
 494          $conn    =& ADODB_Session::_conn();
 495          $debug    = ADODB_Session::debug();
 496  
 497          if (!$conn) {
 498              return;
 499          }
 500  
 501          if (!$debug) {
 502              return;
 503          }
 504  
 505          if (!$rs) {
 506              echo "<br />\$rs is null or false<br />\n";
 507              return;
 508          }
 509  
 510          //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";
 511  
 512          if (!is_object($rs)) {
 513              return;
 514          }
 515  
 516          require_once  ADODB_SESSION.'/../tohtml.inc.php';
 517          rs2html($rs);
 518      }
 519  
 520      /////////////////////
 521      // public methods
 522      /////////////////////
 523      
 524  	function config($driver, $host, $user, $password, $database=false,$options=false)
 525      {
 526          ADODB_Session::driver($driver);
 527          ADODB_Session::host($host);
 528          ADODB_Session::user($user);
 529          ADODB_Session::password($password);
 530          ADODB_Session::database($database);
 531          
 532          if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';
 533          
 534          if (isset($options['table'])) ADODB_Session::table($options['table']);
 535          if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
 536          if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
 537      }
 538  
 539      /*!
 540          Create the connection to the database.
 541  
 542          If $conn already exists, reuse that connection
 543      */
 544  	function open($save_path, $session_name, $persist = null) 
 545      {
 546          $conn =& ADODB_Session::_conn();
 547  
 548          if ($conn) {
 549              return true;
 550          }
 551  
 552          $database    = ADODB_Session::database();
 553          $debug        = ADODB_Session::debug();
 554          $driver        = ADODB_Session::driver();
 555          $host        = ADODB_Session::host();
 556          $password    = ADODB_Session::password();
 557          $user        = ADODB_Session::user();
 558  
 559          if (!is_null($persist)) {
 560              ADODB_Session::persist($persist);
 561          } else {
 562              $persist = ADODB_Session::persist();
 563          }
 564  
 565  # these can all be defaulted to in php.ini
 566  #        assert('$database');
 567  #        assert('$driver');
 568  #        assert('$host');
 569  
 570          $conn =& ADONewConnection($driver);
 571  
 572          if ($debug) {
 573              $conn->debug = true;        
 574              ADOConnection::outp( " driver=$driver user=$user db=$database ");
 575          }
 576          
 577          if ($persist) {
 578              switch($persist) {
 579              default:
 580              case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
 581              case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
 582              case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
 583              }
 584          } else {
 585              $ok = $conn->Connect($host, $user, $password, $database);
 586          }
 587  
 588          if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
 589          else
 590              ADOConnection::outp('<p>Session: connection failed</p>', false);
 591          
 592  
 593          return $ok;
 594      }
 595  
 596      /*!
 597          Close the connection
 598      */
 599  	function close() 
 600      {
 601  /*
 602          $conn =& ADODB_Session::_conn();
 603          if ($conn) $conn->Close();
 604  */
 605          return true;
 606      }
 607  
 608      /*
 609          Slurp in the session variables and return the serialized string
 610      */
 611  	function read($key) 
 612      {
 613          $conn    =& ADODB_Session::_conn();
 614          $filter    = ADODB_Session::filter();
 615          $table    = ADODB_Session::table();
 616  
 617          if (!$conn) {
 618              return '';
 619          }
 620  
 621          //assert('$table');
 622  
 623          $qkey = $conn->quote($key);
 624          $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 625      
 626          $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . $conn->sysTimeStamp;
 627          /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if 
 628            developer has commited elsewhere... :(
 629           */
 630          #if (ADODB_Session::Lock())
 631          #    $rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata);
 632          #else
 633          
 634              $rs =& $conn->Execute($sql);
 635          //ADODB_Session::_dumprs($rs);
 636          if ($rs) {
 637              if ($rs->EOF) {
 638                  $v = '';
 639              } else {
 640                  $v = reset($rs->fields);
 641                  $filter = array_reverse($filter);
 642                  foreach ($filter as $f) {
 643                      if (is_object($f)) {
 644                          $v = $f->read($v, ADODB_Session::_sessionKey());
 645                      }
 646                  }
 647                  $v = rawurldecode($v);
 648              }
 649  
 650              $rs->Close();
 651  
 652              ADODB_Session::_crc(strlen($v) . crc32($v));
 653              return $v;
 654          }
 655  
 656          return '';
 657      }
 658  
 659      /*!
 660          Write the serialized data to a database.
 661  
 662          If the data has not been modified since the last read(), we do not write.
 663      */
 664  	function write($key, $val) 
 665      {
 666      global $ADODB_SESSION_READONLY;
 667      
 668          if (!empty($ADODB_SESSION_READONLY)) return;
 669          
 670          $clob            = ADODB_Session::clob();
 671          $conn            =& ADODB_Session::_conn();
 672          $crc            = ADODB_Session::_crc();
 673          $debug            = ADODB_Session::debug();
 674          $driver            = ADODB_Session::driver();
 675          $expire_notify    = ADODB_Session::expireNotify();
 676          $filter            = ADODB_Session::filter();
 677          $lifetime        = ADODB_Session::lifetime();
 678          $table            = ADODB_Session::table();
 679      
 680          if (!$conn) {
 681              return false;
 682          }
 683      
 684          $sysTimeStamp = $conn->sysTimeStamp;
 685          
 686          //assert('$table');
 687  
 688          $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp);
 689  
 690          $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 691  
 692          // crc32 optimization since adodb 2.1
 693          // now we only update expiry date, thx to sebastian thom in adodb 2.32
 694          if ($crc !== false && $crc == (strlen($val) . crc32($val))) {
 695              if ($debug) {
 696                  echo '<p>Session: Only updating date - crc32 not changed</p>';
 697              }
 698              
 699              $expirevar = '';
 700              if ($expire_notify) {
 701                  $var = reset($expire_notify);
 702                  global $$var;
 703                  if (isset($$var)) {
 704                      $expirevar = $$var;
 705                  }
 706              }
 707              
 708              
 709              $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp";
 710              $rs =& $conn->Execute($sql,array($expirevar,$key));
 711              return true;
 712          }
 713          $val = rawurlencode($val);
 714          foreach ($filter as $f) {
 715              if (is_object($f)) {
 716                  $val = $f->write($val, ADODB_Session::_sessionKey());
 717              }
 718          }
 719  
 720          $expireref = '';
 721          if ($expire_notify) {
 722              $var = reset($expire_notify);
 723              global $$var;
 724              if (isset($$var)) {
 725                  $expireref = $$var;
 726              }
 727          } 
 728  
 729          if (!$clob) {    // no lobs, simply use replace()
 730              $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
 731              if ($rs) $rs->Close();
 732                      
 733              if ($rs && reset($rs->fields) > 0) {
 734                  $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2');
 735                  
 736              } else {
 737                  $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) 
 738                      VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)";
 739              }
 740              
 741      
 742              $rs =& $conn->Execute($sql,array($val,$expireref,$key));
 743              
 744          } else {
 745              // what value shall we insert/update for lob row?
 746              switch ($driver) {
 747                  // empty_clob or empty_lob for oracle dbs
 748                  case 'oracle':
 749                  case 'oci8':
 750                  case 'oci8po':
 751                  case 'oci805':
 752                      $lob_value = sprintf('empty_%s()', strtolower($clob));
 753                      break;
 754  
 755                  // null for all other
 756                  default:
 757                      $lob_value = 'null';
 758                      break;
 759              }
 760              
 761              $conn->StartTrans();
 762              
 763              $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
 764              if ($rs) $rs->Close();
 765                      
 766              if ($rs && reset($rs->fields) > 0) {
 767                  $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1');
 768                  
 769              } else {
 770                  $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) 
 771                      VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)";
 772              }
 773              
 774              $rs =& $conn->Execute($sql,array($expireref,$key));
 775              
 776              $qkey = $conn->qstr($key);
 777              $rs2 = $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob));
 778              $rs = @$conn->CompleteTrans();
 779              
 780              
 781          }
 782  
 783          if (!$rs) {
 784              ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
 785              return false;
 786          }  else {
 787              // bug in access driver (could be odbc?) means that info is not committed
 788              // properly unless select statement executed in Win2000
 789              if ($conn->databaseType == 'access') {
 790                  $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
 791                  $rs =& $conn->Execute($sql);
 792                  ADODB_Session::_dumprs($rs);
 793                  if ($rs) {
 794                      $rs->Close();
 795                  }
 796              }
 797          }/*
 798          if (ADODB_Session::Lock()) {
 799              $conn->CommitTrans();
 800          }*/
 801          return $rs ? true : false;
 802      }
 803  
 804      /*!
 805      */
 806  	function destroy($key) {
 807          $conn            =& ADODB_Session::_conn();
 808          $table            = ADODB_Session::table();
 809          $expire_notify    = ADODB_Session::expireNotify();
 810  
 811          if (!$conn) {
 812              return false;
 813          }
 814  
 815          //assert('$table');
 816  
 817          $qkey = $conn->quote($key);
 818          $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 819  
 820          if ($expire_notify) {
 821              reset($expire_notify);
 822              $fn = next($expire_notify);
 823              $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
 824              $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
 825              $rs =& $conn->Execute($sql);
 826              ADODB_Session::_dumprs($rs);
 827              $conn->SetFetchMode($savem);
 828              if (!$rs) {
 829                  return false;
 830              }
 831              if (!$rs->EOF) {
 832                  $ref = $rs->fields[0];
 833                  $key = $rs->fields[1];
 834                  //assert('$ref');
 835                  //assert('$key');
 836                  $fn($ref, $key);
 837              }
 838              $rs->Close();
 839          }
 840  
 841          $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
 842          $rs =& $conn->Execute($sql);
 843          ADODB_Session::_dumprs($rs);
 844          if ($rs) {
 845              $rs->Close();
 846          }
 847  
 848          return $rs ? true : false;
 849      }
 850  
 851      /*!
 852      */
 853      function gc($maxlifetime) 
 854      {
 855          $conn            =& ADODB_Session::_conn();
 856          $debug            = ADODB_Session::debug();
 857          $expire_notify    = ADODB_Session::expireNotify();
 858          $optimize        = ADODB_Session::optimize();
 859          $table            = ADODB_Session::table();
 860  
 861          if (!$conn) {
 862              return false;
 863          }
 864  
 865          //assert('$table');
 866  
 867          $time = $conn->sysTimeStamp;
 868          $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 869  
 870          if ($expire_notify) {
 871              reset($expire_notify);
 872              $fn = next($expire_notify);
 873              $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
 874              $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";
 875              $rs =& $conn->Execute($sql);
 876              ADODB_Session::_dumprs($rs);
 877              $conn->SetFetchMode($savem);
 878              if ($rs) {
 879                  $conn->StartTrans();
 880                  $keys = array();
 881                  while (!$rs->EOF) {
 882                      $ref = $rs->fields[0];
 883                      $key = $rs->fields[1];
 884                      $fn($ref, $key);
 885                      $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));
 886                      $rs->MoveNext();
 887                  }
 888                  $rs->Close();
 889                  
 890                  $conn->CompleteTrans();
 891              }
 892          } else {
 893          
 894              if (0) {
 895                  $sql = "SELECT sesskey FROM $table WHERE expiry < $time";
 896                  $arr =& $conn->GetAll($sql);
 897                  foreach ($arr as $row) {
 898                      $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0');
 899                      $conn->Execute($sql2,array($row[0]));
 900                  }
 901              } else {
 902                  $sql = "DELETE FROM $table WHERE expiry < $time";
 903                  $rs =& $conn->Execute($sql);
 904                  ADODB_Session::_dumprs($rs);
 905                  if ($rs) $rs->Close();
 906              }
 907              if ($debug) {
 908                  ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");
 909              }
 910          }
 911  
 912          // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
 913          if ($optimize) {
 914              $driver = ADODB_Session::driver();
 915  
 916              if (preg_match('/mysql/i', $driver)) {
 917                  $sql = "OPTIMIZE TABLE $table";
 918              }
 919              if (preg_match('/postgres/i', $driver)) {
 920                  $sql = "VACUUM $table";
 921              }
 922              if (!empty($sql)) {
 923                  $conn->Execute($sql);
 924              }
 925          }
 926  
 927          
 928          return true;
 929      }
 930  }
 931  
 932  ADODB_Session::_init();
 933  if (empty($ADODB_SESSION_READONLY))
 934      register_shutdown_function('session_write_close');
 935  
 936  // for backwards compatability only
 937  function adodb_sess_open($save_path, $session_name, $persist = true) {
 938      return ADODB_Session::open($save_path, $session_name, $persist);
 939  }
 940  
 941  // for backwards compatability only
 942  function adodb_sess_gc($t)
 943  {    
 944      return ADODB_Session::gc($t);
 945  }
 946  
 947  ?>


Généré le : Thu Nov 29 09:42:17 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics