From 953ce3f69c29f0d97f4ef0581eb0bc0cbbe8f73f Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 14 May 2009 03:22:01 -0400
Subject: [PATCH] Don't write session data on every unset but just remember the unset variables

---
 program/include/session.inc |   32 +++++++++-----------------------
 1 files changed, 9 insertions(+), 23 deletions(-)

diff --git a/program/include/session.inc b/program/include/session.inc
index e198077..a73ee5c 100644
--- a/program/include/session.inc
+++ b/program/include/session.inc
@@ -19,6 +19,7 @@
 
 */
 
+$GLOBALS['rcube_session_unsets'] = array();
 
 function rcube_sess_open($save_path, $session_name)
 {
@@ -65,11 +66,15 @@
   $now = $DB->fromunixtime(time());
 
   if ($oldvars = rcube_sess_read($key)) {
+    $a_oldvars = rcube_sess_unserialize($oldvars);
+    foreach ((array)$GLOBALS['rcube_session_unsets'] as $k)
+      unset($a_oldvars[$k]);
+
     $DB->query(
       "UPDATE " . get_table_name('session') . "
        SET    vars=?, changed= " . $now . "
        WHERE  sess_id=?",
-      rcube_sess_serialize(array_merge(rcube_sess_unserialize($oldvars), rcube_sess_unserialize($vars))),
+      rcube_sess_serialize(array_merge($a_oldvars, rcube_sess_unserialize($vars))),
       $key);
   }
   else {
@@ -82,6 +87,7 @@
       (string)$_SERVER['REMOTE_ADDR']);
   }
 
+  $GLOBALS['rcube_session_unsets'] = array();
   return true;
 }
 
@@ -89,31 +95,11 @@
 // unset session variable
 function rcube_sess_unset($var=NULL)
 {
-  $DB = rcmail::get_instance()->get_dbh();
-
   if (empty($var))
     return rcube_sess_destroy(session_id());
 
-  $now = $DB->fromunixtime(time());
-
-  $sql_result = $DB->query(
-    "SELECT vars
-     FROM " . get_table_name('session') . "
-     WHERE  sess_id=?",
-     session_id());
-
-  if ($sql_arr = $DB->fetch_assoc($sql_result)) {
-    $vars = rcube_sess_unserialize($sql_arr['vars']);
-    if (isset($vars[$var])) {
-      unset($vars[$var]);
-      $DB->query(
-        "UPDATE " . get_table_name('session') . "
-         SET    vars=?, changed= " . $now . "
-         WHERE  sess_id=?",
-         rcube_sess_serialize($vars),
-         session_id());
-    }
-  }   
+  $GLOBALS['rcube_session_unsets'][] = $var;
+  unset($_SESSION[$var]);
 
   return true;
 }

--
Gitblit v1.9.1