Index: trunk/core/kernel/session/session.php =================================================================== diff -u -r4630 -r4758 --- trunk/core/kernel/session/session.php (.../session.php) (revision 4630) +++ trunk/core/kernel/session/session.php (.../session.php) (revision 4758) @@ -63,6 +63,9 @@ var $Expiration; var $SessionTimeout=0; + var $DirectVars = Array(); + var $ChangedDirectVars = Array(); + var $OriginalData=Array(); var $TimestampField; @@ -93,7 +96,7 @@ if ($additional_fields) { $fields_hash = array_merge_recursive2($fields_hash, $additional_fields); } - + $this->Conn->doInsert($fields_hash, $this->TableName); } @@ -110,18 +113,21 @@ function UpdateSession(&$session, $timeout=0) { + $this->SetField($session, $this->TimestampField, $session->Expiration); $query = ' UPDATE '.$this->TableName.' SET '.$this->TimestampField.' = '.$session->Expiration.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID); $this->Conn->Query($query); } function LocateSession($sid) { - $query = ' SELECT '.$this->TimestampField.' FROM '.$this->TableName.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($sid); - $result = $this->Conn->GetOne($query); + $query = ' SELECT * FROM '.$this->TableName.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($sid); + $result = $this->Conn->GetRow($query); if($result===false) return false; - $this->Expiration = $result; + $this->DirectVars = $result; + + $this->Expiration = $result[$this->TimestampField]; return true; } @@ -146,12 +152,18 @@ */ function GetField(&$session, $var_name) { - return $this->Conn->GetOne('SELECT '.$var_name.' FROM '.$this->TableName.' WHERE `'.$this->IDField.'` = '.$this->Conn->qstr($session->GetID()) ); + return $this->DirectVars[$var_name]; + //return $this->Conn->GetOne('SELECT '.$var_name.' FROM '.$this->TableName.' WHERE `'.$this->IDField.'` = '.$this->Conn->qstr($session->GetID()) ); } function SetField(&$session, $var_name, $value) { - return $this->Conn->Query('UPDATE '.$this->TableName.' SET '.$var_name.' = '.$this->Conn->qstr($value).' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->GetID()) ); + if ($this->DirectVars[$var_name] != $value) { + $this->DirectVars[$var_name] = $value; + $this->ChangedDirectVars[] = $var_name; + $this->ChangedDirectVars = array_unique($this->ChangedDirectVars); + } + //return $this->Conn->Query('UPDATE '.$this->TableName.' SET '.$var_name.' = '.$this->Conn->qstr($value).' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->GetID()) ); } function SaveData(&$session) @@ -180,6 +192,15 @@ $query = ' REPLACE INTO '.$this->SessionDataTable. ' ('.$this->IDField.', '.$this->DataVarField.', '.$this->DataValueField.') VALUES '.$replace; $this->Conn->Query($query); } + + if ($this->ChangedDirectVars) { + $changes = array(); + foreach ($this->ChangedDirectVars as $var) { + $changes[] = $var.' = '.$this->Conn->qstr($this->DirectVars[$var]); + } + $query = 'UPDATE '.$this->TableName.' SET '.implode(',', $changes).' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->GetID()); + $this->Conn->Query($query); + } } function RemoveFromData(&$session, $var) @@ -194,7 +215,7 @@ { return getArrayValue($this->OriginalData, $var); } - + function GetExpiredSIDs() { $query = ' SELECT '.$this->IDField.' FROM '.$this->TableName.' WHERE '.$this->TimestampField.' > '.adodb_mktime(); @@ -240,6 +261,11 @@ var $SID; + /** + * Enter description here... + * + * @var SessionStorage + */ var $Storage; var $CachedNeedQueryString = null; @@ -299,17 +325,18 @@ $tmp_sid = $this->GetPassedSIDValue(); + $check = $this->Check(); if( !(defined('IS_INSTALL') && IS_INSTALL) ) { $expired_sids = $this->DeleteExpired(); - if( ( $expired_sids && in_array($tmp_sid,$expired_sids) ) || ( $tmp_sid && !$this->Check() ) ) + if( ( $expired_sids && in_array($tmp_sid,$expired_sids) ) || ( $tmp_sid && !$check ) ) { $this->SetSession(); $this->Application->HandleEvent($event, 'u:OnSessionExpire'); } } - if ($this->Check()) { + if ($check) { $this->SID = $this->GetPassedSIDValue(); $this->Refresh(); $this->LoadData(); @@ -560,7 +587,6 @@ break; } $this->Storage->StoreSession($this); - $this->Application->HandleEvent( new kEvent('visits:OnRegisterVisit') ); } function SetSessionCookie() @@ -697,7 +723,7 @@ { return $this->StoreVar($name, $this->Storage->GetFromData($this, $name)); } - + function GetField($var_name) { return $this->Storage->GetField($this, $var_name);