Db.php

浏览该文件的文档。
00001 <?php
00003 // FleaPHP Framework
00004 //
00005 // Copyright (c) 2005 - 2008 QeeYuan China Inc. (http://www.qeeyuan.com)
00006 //
00007 // 许可协议,请查看源代码中附带的 LICENSE.txt 文件,
00008 // 或者访问 http://www.fleaphp.org/ 获得详细信息。
00010 
00038 class FLEA_Session_Db
00039 {
00045     var $dbo = null;
00046 
00052     var $tableName = null;
00053 
00059     var $fieldId = null;
00060 
00066     var $fieldData = null;
00067 
00073     var $fieldActivity = null;
00074 
00082     var $lifeTime = 0;
00083 
00089     function FLEA_Session_Db()
00090     {
00091         $this->tableName = FLEA::getAppInf('sessionDbTableName');
00092         $this->fieldId = FLEA::getAppInf('sessionDbFieldId');
00093         $this->fieldData = FLEA::getAppInf('sessionDbFieldData');
00094         $this->fieldActivity = FLEA::getAppInf('sessionDbFieldActivity');
00095         $this->lifeTime = (int)FLEA::getAppInf('sessionDbLifeTime');
00096 
00097         if (PHP4) {
00098             register_shutdown_function('session_write_close');
00099         }
00100 
00101         session_set_save_handler(
00102             array(& $this, 'sessionOpen'),
00103             array(& $this, 'sessionClose'),
00104             array(& $this, 'sessionRead'),
00105             array(& $this, 'sessionWrite'),
00106             array(& $this, 'sessionDestroy'),
00107             array(& $this, 'sessionGc')
00108         );
00109     }
00110 
00114     function __destruct()
00115     {
00116         session_write_close();
00117     }
00118 
00127     function sessionOpen($savePath, $sessionName)
00128     {
00129         $dsnName = FLEA::getAppInf('sessionDbDSN');
00130         $dsn = FLEA::getAppInf($dsnName);
00131         $this->dbo =& FLEA::getDBO($dsn);
00132         if (!$this->dbo) { return false; }
00133 
00134         if (!empty($this->dbo->dsn['dbTablePrefix'])) {
00135             $this->tableName = $this->dbo->dsn['dbTablePrefix'] . $this->tableName;
00136         }
00137         $this->tableName = $this->dbo->qtable($this->tableName);
00138         $this->fieldId = $this->dbo->qfield($this->fieldId);
00139         $this->fieldData = $this->dbo->qfield($this->fieldData);
00140         $this->fieldActivity = $this->dbo->qfield($this->fieldActivity);
00141 
00142         $this->sessionGc(FLEA::getAppInf('sessionDbLifeTime'));
00143 
00144         return true;
00145     }
00146 
00152     function sessionClose()
00153     {
00154         return true;
00155     }
00156 
00164     function sessionRead($sessid)
00165     {
00166         $sessid = $this->dbo->qstr($sessid);
00167         $sql = "SELECT {$this->fieldData} FROM {$this->tableName} WHERE {$this->fieldId} = {$sessid}";
00168         if ($this->lifeTime > 0) {
00169             $time = time() - $this->lifeTime;
00170             $sql .= " AND {$this->fieldActivity} >= {$time}";
00171         }
00172 
00173         return $this->dbo->getOne($sql);
00174     }
00175 
00184     function sessionWrite($sessid, $data)
00185     {
00186         $sessid = $this->dbo->qstr($sessid);
00187         $sql = "SELECT COUNT(*) FROM {$this->tableName} WHERE {$this->fieldId} = {$sessid}";
00188         $data = $this->dbo->qstr($data);
00189         $activity = time();
00190 
00191         $fields = (array)$this->_beforeWrite($sessid);
00192         if ((int)$this->dbo->getOne($sql) > 0) {
00193             $sql = "UPDATE {$this->tableName} SET {$this->fieldData} = {$data}, {$this->fieldActivity} = {$activity}";
00194             if (!empty($fields)) {
00195                 $arr = array();
00196                 foreach ($fields as $field => $value) {
00197                     $arr[] = $this->dbo->qfield($field) . ' = ' . $this->dbo->qstr($value);
00198                 }
00199                 $sql .= ', ' . implode(', ', $arr);
00200             }
00201             $sql .= " WHERE {$this->fieldId} = {$sessid}";
00202         } else {
00203             $extraFields = '';
00204             $extraValues = '';
00205             if (!empty($fields)) {
00206                 foreach ($fields as $field => $value) {
00207                     $extraFields .= ', ' . $this->dbo->qfield($field);
00208                     $extraValues .= ', ' . $this->dbo->qstr($value);
00209                 }
00210             }
00211 
00212             $sql = "INSERT INTO {$this->tableName} ({$this->fieldId}, {$this->fieldData}, {$this->fieldActivity}{$extraFields}) VALUES ({$sessid}, {$data}, {$activity}{$extraValues})";
00213         }
00214 
00215         __TRY();
00216         $this->dbo->execute($sql);
00217         $ex = __CATCH();
00218         return !__IS_EXCEPTION($ex);
00219     }
00220 
00228     function sessionDestroy($sessid)
00229     {
00230         $sessid = $this->dbo->qstr($sessid);
00231         $sql = "DELETE FROM {$this->tableName} WHERE {$this->fieldId} = {$sessid}";
00232         return $this->dbo->execute($sql);
00233     }
00234 
00242     function sessionGc($maxlifetime)
00243     {
00244         if ($this->lifeTime > 0) {
00245             $maxlifetime = $this->lifeTime;
00246         }
00247         $time = time() - $maxlifetime;
00248         $sql = "DELETE FROM {$this->tableName} WHERE {$this->fieldActivity} < {$time}";
00249         $this->dbo->execute($sql);
00250         return true;
00251     }
00252 
00258     function getOnlineCount($lifetime = -1)
00259     {
00260         if ($this->lifeTime > 0) {
00261             $lifetime = $this->lifeTime;
00262         } else if ($lifetime <= 0) {
00263             $lifetime = (int)ini_get('session.gc_maxlifetime');
00264             if ($lifetime <= 0) {
00265                 $lifetime = 1440;
00266             }
00267         }
00268         $sql = "SELECT COUNT(*) FROM {$this->tableName}";
00269         if ($this->lifeTime > 0) {
00270             $time = time() - $lifetime;
00271             $sql .= " WHERE {$this->fieldActivity} >= {$time}";
00272         }
00273         return (int)$this->dbo->getOne($sql);
00274     }
00275 
00290     function _beforeWrite($sessid)
00291     {
00292         return array();
00293     }
00294 }

Generated at Sat Feb 2 15:18:50 2008 for FleaPHP by  doxygen 1.5.3