From 76d4019a355019f2cc3465bd36e3475f80c3d745 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Wed, 18 May 2011 06:16:36 -0400
Subject: [PATCH] Get memcache object from rcmail instance

---
 program/include/rcmail.php        |   39 +++++++++++++++++++++++++++++++++++++++
 program/include/rcube_session.php |   12 ++----------
 2 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 5567130..eb08c81 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -64,6 +64,13 @@
   public $db;
 
   /**
+   * Instace of Memcache class.
+   *
+   * @var rcube_mdb2
+   */
+  public $memcache;
+
+  /**
    * Instace of rcube_session class.
    *
    * @var rcube_session
@@ -310,6 +317,38 @@
 
     return $this->db;
   }
+  
+  
+  /**
+   * Get global handle for memcache access
+   *
+   * @return object Memcache
+   */
+  public function get_memcache()
+  {
+    if (!isset($this->memcache)) {
+      // no memcache support in PHP
+      if (!class_exists('Memcache')) {
+        $this->memcache = false;
+        return false;
+      }
+      
+      $this->memcache = new Memcache;
+      $mc_available = 0;
+      foreach ($this->config->get('memcache_hosts', array()) as $host) {
+        list($host, $port) = explode(':', $host);
+        if (!$port) $port = 11211;
+        // add server and attempt to connect if not already done yet
+        if ($this->memcache->addServer($host, $port) && !$mc_available)
+          $mc_available += intval($this->memcache->connect($host, $port));
+      }
+      
+      if (!$mc_available)
+        $this->memcache = false;
+    }
+    
+    return $this->memcache;
+  }
 
 
   /**
diff --git a/program/include/rcube_session.php b/program/include/rcube_session.php
index e4d9a87..a635010 100644
--- a/program/include/rcube_session.php
+++ b/program/include/rcube_session.php
@@ -59,18 +59,10 @@
 
     // use memcache backend
     if ($config->get('session_storage', 'db') == 'memcache') {
-      $this->memcache = new Memcache;
-      $mc_available = 0;
-      foreach ($config->get('memcache_hosts', array()) as $host) {
-        list($host, $port) = explode(':', $host);
-        if (!$port) $port = 11211;
-        // add server and attempt to connect if not already done yet
-        if ($this->memcache->addServer($host, $port) && !$mc_available)
-          $mc_available += intval($this->memcache->connect($host, $port));
-      }
+      $this->memcache = rcmail::get_instance()->get_memcache();
 
       // set custom functions for PHP session management if memcache is available
-      if ($mc_available) {
+      if ($this->memcache) {
         session_set_save_handler(
           array($this, 'open'),
           array($this, 'close'),

--
Gitblit v1.9.1