00001 <?php
00003
00004
00005
00006
00007
00008
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 }