thomascube
2011-09-28 63d6e6dfc35e6d82c4a64f37c408794c163becd4
program/include/rcmail.php
@@ -336,20 +336,41 @@
      }
      $this->memcache = new Memcache;
      $mc_available = 0;
      $this->mc_available = 0;
      // add alll configured hosts to pool
      $pconnect = $this->config->get('memcache_pconnect', true);
      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));
        $this->mc_available += intval($this->memcache->addServer($host, $port, $pconnect, 1, 1, 15, false, array($this, 'memcache_failure')));
      }
      // test connection and failover (will result in $this->mc_available == 0 on complete failure)
      $this->memcache->increment('__CONNECTIONTEST__', 1);  // NOP if key doesn't exist
      if (!$mc_available)
      if (!$this->mc_available)
        $this->memcache = false;
    }
    return $this->memcache;
  }
  /**
   * Callback for memcache failure
   */
  public function memcache_failure($host, $port)
  {
    static $seen = array();
    // only report once
    if (!$seen["$host:$port"]++) {
      $this->mc_available--;
      raise_error(array('code' => 604, 'type' => 'db',
        'line' => __LINE__, 'file' => __FILE__,
        'message' => "Memcache failure on host $host:$port"),
        true, false);
    }
  }
@@ -392,7 +413,10 @@
        $id = '0';
    // use existing instance
    if (isset($this->address_books[$id]) && is_a($this->address_books[$id], 'rcube_addressbook') && (!$writeable || !$this->address_books[$id]->readonly)) {
    if (isset($this->address_books[$id]) && is_object($this->address_books[$id])
      && is_a($this->address_books[$id], 'rcube_addressbook')
      && (!$writeable || !$this->address_books[$id]->readonly)
    ) {
      $contacts = $this->address_books[$id];
    }
    else if ($id && $ldap_config[$id]) {
@@ -831,6 +855,10 @@
    else if ($config['auto_create_user']) {
      if ($created = rcube_user::create($username, $host)) {
        $user = $created;
        // fix default settings according to namespace prefix
        $this->fix_namespace_settings($user);
        // create default folders on first login
        if ($config['create_default_folders'])
          $this->imap->create_default_folders();
@@ -1162,7 +1190,7 @@
      $this->smtp->disconnect();
    foreach ($this->address_books as $book) {
      if (is_a($book, 'rcube_addressbook'))
      if (is_object($book) && is_a($book, 'rcube_addressbook'))
        $book->close();
    }