From be7d3b6918ff90757d10804ac914edb5a65f4828 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Fri, 21 Nov 2008 09:33:58 -0500
Subject: [PATCH] - Fix 'cache' table cleanup on session destroy (#1485516)

---
 CHANGELOG                      |    4 ++++
 program/include/rcube_imap.php |   11 ++++++-----
 SQL/mysql5.initial.sql         |    4 ++++
 SQL/postgres.update.sql        |    6 ++++++
 SQL/mysql.update.sql           |    8 ++++++++
 SQL/postgres.initial.sql       |    3 ++-
 6 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 775379d..de8b879 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
+2008/11/21 (alec)
+----------
+- Fix 'cache' table cleanup on session destroy (#1485516)
+
 2008/11/19 (alec)
 ----------
 - Fix handling of some malformed messages (#1484438)
diff --git a/SQL/mysql.update.sql b/SQL/mysql.update.sql
index ae6fb75..f88a6c4 100644
--- a/SQL/mysql.update.sql
+++ b/SQL/mysql.update.sql
@@ -30,3 +30,11 @@
 
 ALTER TABLE `messages`
     ADD INDEX `created_index` (`created`);
+
+-- Updates from version 0.2-beta (InnoDB only)
+
+ALTER TABLE `cache`
+    ADD CONSTRAINT `session_id_fk_cache` FOREIGN KEY (`session_id`)
+    REFERENCES `session`(`sess_id`)
+    ON DELETE CASCADE
+    ON UPDATE CASCADE;
diff --git a/SQL/mysql5.initial.sql b/SQL/mysql5.initial.sql
index f9d647b..e01f2a6 100644
--- a/SQL/mysql5.initial.sql
+++ b/SQL/mysql5.initial.sql
@@ -77,6 +77,10 @@
  CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
    REFERENCES `users`(`user_id`)
      ON DELETE CASCADE
+     ON UPDATE CASCADE,
+ CONSTRAINT `session_id_fk_cache` FOREIGN KEY (`session_id`)
+   REFERENCES `session`(`sess_id`)
+     ON DELETE CASCADE
      ON UPDATE CASCADE
 ) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
 
diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql
index 88f12af..e53caa1 100644
--- a/SQL/postgres.initial.sql
+++ b/SQL/postgres.initial.sql
@@ -128,13 +128,14 @@
 CREATE TABLE "cache" (
     cache_id integer DEFAULT nextval('cache_ids'::text) PRIMARY KEY,
     user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
-    session_id character varying(40) REFERENCES "session" (sess_id),
+    session_id character varying(40) REFERENCES "session" (sess_id) ON DELETE CASCADE ON UPDATE CASCADE,
     cache_key character varying(128) DEFAULT ''::character varying NOT NULL,
     created timestamp with time zone DEFAULT now() NOT NULL,
     data text NOT NULL
 );
 
 CREATE INDEX cache_user_id_idx ON "cache" (user_id, cache_key);
+CREATE INDEX cache_session_id_idx ON "cache" (session_id);
 
 --
 -- Sequence "message_ids"
diff --git a/SQL/postgres.update.sql b/SQL/postgres.update.sql
index dfc282b..fdd7f0f 100644
--- a/SQL/postgres.update.sql
+++ b/SQL/postgres.update.sql
@@ -21,3 +21,9 @@
 -- Updates from version 0.2-alpha
 
 CREATE INDEX messages_created_idx ON messages (created);
+
+-- Updates from version 0.2-beta
+
+ALTER TABLE cache DROP CONSTRAINT cache_session_id_fkey;
+ALTER TABLE cache ADD FOREIGN KEY (session_id) REFERENCES session(sess_id) ON DELETE CASCADE ON UPDATE CASCADE;
+CREATE INDEX cache_session_id_idx ON "cache" (session_id);
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index f1483af..d8845cc 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -2146,11 +2146,11 @@
       {
       $this->db->query(
         "UPDATE ".get_table_name('cache')."
-         SET    created=".$this->db->now().",
-                data=?
+         SET    created=".$this->db->now().", data=?, session_id=?
          WHERE  user_id=?
          AND    cache_key=?",
         $data,
+	session_id(),
         $_SESSION['user_id'],
         $key);
       }
@@ -2159,11 +2159,12 @@
       {
       $this->db->query(
         "INSERT INTO ".get_table_name('cache')."
-         (created, user_id, cache_key, data)
-         VALUES (".$this->db->now().", ?, ?, ?)",
+         (created, user_id, cache_key, data, session_id)
+         VALUES (".$this->db->now().", ?, ?, ?, ?)",
         $_SESSION['user_id'],
         $key,
-        $data);
+        $data,
+	session_id());
       }
     }
 

--
Gitblit v1.9.1