Hello community,

here is the log from the commit of package php5-pear-Horde_Memcache for 
openSUSE:Factory checked in at 2012-10-24 17:14:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/php5-pear-Horde_Memcache (Old)
 and      /work/SRC/openSUSE:Factory/.php5-pear-Horde_Memcache.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "php5-pear-Horde_Memcache", Maintainer is ""

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/php5-pear-Horde_Memcache/php5-pear-Horde_Memcache.changes
        2011-09-23 12:40:30.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.php5-pear-Horde_Memcache.new/php5-pear-Horde_Memcache.changes
   2012-10-24 17:14:38.000000000 +0200
@@ -1,0 +2,18 @@
+Tue Oct 16 11:17:03 UTC 2012 - [email protected]
+
+- Shipping HTML-only format of license, as the original link
+  changes depending on the gnu.org's border
+
+-------------------------------------------------------------------
+Tue Jan 17 12:57:07 UTC 2012 - [email protected]
+
+- version 1.0.4
+- added external license file until version with shipped license file
+- [mms] Silence undefined errors when a search key is not found on the server.
+
+-------------------------------------------------------------------
+Thu Jun  9 13:45:33 UTC 2011 - [email protected]
+
+- add upgrade path (obsoletes/provides)
+
+-------------------------------------------------------------------

Old:
----
  Horde_Memcache-1.0.3.tgz

New:
----
  Horde_Memcache-1.0.4.tgz
  lgpl-2.1-standalone.html

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ php5-pear-Horde_Memcache.spec ++++++
--- /var/tmp/diff_new_pack.v92wBZ/_old  2012-10-24 17:14:40.000000000 +0200
+++ /var/tmp/diff_new_pack.v92wBZ/_new  2012-10-24 17:14:40.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package php5-pear-Horde_Memcache
 #
-# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -20,21 +20,32 @@
 %define xmldir  /var/lib/pear
 
 Summary:        PEAR: Horde Memcache API
+License:        LGPL-2.1
+Group:          Development/Libraries/PHP
 
 Name:           php5-pear-Horde_Memcache
-Version:        1.0.3
-Release:        1
-License:        LGPLv3
-Group:          Development/Libraries/PHP
+Version:        1.0.4
+Release:        0
 Source0:        http://pear.horde.org/get/Horde_Memcache-%{version}.tgz
+Source1:        
http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 Url:            http://pear.horde.org/package/Horde_Memcache
 BuildRequires:  php5-pear >= 1.4.7
-Requires:       php5-pear-Horde_Exception < 2.0.0, php5-pear >= 1.7.0
+Requires:       php5-pear >= 1.7.0
+Requires:       php5-pear-Horde_Exception < 2.0.0
 Conflicts:      php5-pear-Horde_Exception = 2.0.0
 BuildRequires:  php5-pear-channel-horde
 Requires:       php5-pear-channel-horde
 BuildArch:      noarch
+%define pear_name  Horde_Memcache
+%define pear_sname horde_memcache
+# Fix for renaming (package convention)
+Provides:       pear-%{pear_sname} = %{version}
+Provides:       php-pear-%{pear_sname} = %{version}
+Provides:       php5-pear-%{pear_sname} = %{version}
+Obsoletes:      pear-%{pear_sname} < %{version}
+Obsoletes:      php-pear-%{pear_sname} < %{version}
+Obsoletes:      php5-pear-%{pear_sname} < %{version}
 
 %description
 The Horde_Memcache library provides an API to access a memcache
@@ -44,7 +55,7 @@
 %setup -c -T
 pear -v -c pearrc \
         -d php_dir=%{peardir} \
-        -d doc_dir=%{_docdir}%{name} \
+        -d doc_dir=%{_docdir}/%{name} \
         -d bin_dir=%{_bindir} \
         -d data_dir=%{peardir}/data \
         -d test_dir=%{peardir}/tests \
@@ -62,6 +73,11 @@
 
 # Install XML package description
 mkdir -p %{buildroot}%{xmldir}
+
+#temporary solution until updated package with license file ships
+mkdir -p %{buildroot}%{_docdir}/%{name}
+cp -ar %{SOURCE1} %{buildroot}%{_docdir}/%{name}
+
 tar -xzf %{SOURCE0} package.xml
 cp -p package.xml %{buildroot}%{xmldir}/Horde_Memcache.xml
 
@@ -81,5 +97,6 @@
 
 %{peardir}/*
 %{xmldir}/Horde_Memcache.xml
+%doc %{_docdir}/%{name}
 
 %changelog

++++++ Horde_Memcache-1.0.3.tgz -> Horde_Memcache-1.0.4.tgz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Horde_Memcache-1.0.3/lib/Horde/Memcache/Exception.php 
new/Horde_Memcache-1.0.3/lib/Horde/Memcache/Exception.php
--- old/Horde_Memcache-1.0.3/lib/Horde/Memcache/Exception.php   2011-06-04 
21:39:13.000000000 +0200
+++ new/Horde_Memcache-1.0.3/lib/Horde/Memcache/Exception.php   1970-01-01 
01:00:00.000000000 +0100
@@ -1,17 +0,0 @@
-<?php
-/**
- * Exception handler for the Horde_Memcache package.
- *
- * Copyright 2011 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author   Michael Slusarz <[email protected]>
- * @category Horde
- * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
- * @package  Memcache
- */
-class Horde_Memcache_Exception extends Horde_Exception_Wrapped
-{
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Horde_Memcache-1.0.3/lib/Horde/Memcache.php 
new/Horde_Memcache-1.0.3/lib/Horde/Memcache.php
--- old/Horde_Memcache-1.0.3/lib/Horde/Memcache.php     2011-06-04 
21:39:13.000000000 +0200
+++ new/Horde_Memcache-1.0.3/lib/Horde/Memcache.php     1970-01-01 
01:00:00.000000000 +0100
@@ -1,458 +0,0 @@
-<?php
-/**
- * This class provides an API or Horde code to interact with a centrally
- * configured memcache installation.
- *
- * memcached website: http://www.danga.com/memcached/
- *
- * Copyright 2007-2011 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author   Michael Slusarz <[email protected]>
- * @author   Didi Rieder <[email protected]>
- * @category Horde
- * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
- * @package  Memcache
- */
-class Horde_Memcache implements Serializable
-{
-    /**
-     * The number of bits reserved by PHP's memcache layer for internal flag
-     * use.
-     */
-    const FLAGS_RESERVED = 16;
-
-    /**
-     * The max storage size of the memcache server.  This should be slightly
-     * smaller than the actual value due to overhead.  By default, the max
-     * slab size of memcached (as of 1.1.2) is 1 MB.
-     */
-    const MAX_SIZE = 1000000;
-
-    /**
-     * Serializable version.
-     */
-    const VERSION = 1;
-
-    /**
-     * Memcache object.
-     *
-     * @var Memcache
-     */
-    protected $_memcache;
-
-    /**
-     * Memcache defaults.
-     *
-     * @var array
-     */
-    protected $_params = array(
-        'compression' => false,
-        'hostspec' => array('localhost'),
-        'large_items' => true,
-        'persistent' => false,
-        'port' => array(11211),
-        'prefix' => 'horde'
-    );
-
-    /**
-     * A list of items known not to exist.
-     *
-     * @var array
-     */
-    protected $_noexist = array();
-
-    /**
-     * Logger instance.
-     *
-     * @var Horde_Log_Logger
-     */
-    protected $_logger;
-
-    /**
-     * Constructor.
-     *
-     * @param array $params  Configuration parameters:
-     *   - compression: (boolean) Compress data inside memcache?
-     *                  DEFAULT: false
-     *   - c_threshold: (integer) The minimum value length before attempting
-     *                  to compress.
-     *                  DEFAULT: none
-     *   - hostspec: (array) The memcached host(s) to connect to.
-     *                  DEFAULT: 'localhost'
-     *   - large_items: (boolean) Allow storing large data items (larger than
-     *                  Horde_Memcache::MAX_SIZE)?
-     *                  DEFAULT: true
-     *   - persistent: (boolean) Use persistent DB connections?
-     *                 DEFAULT: false
-     *   - prefix: (string) The prefix to use for the memcache keys.
-     *             DEFAULT: 'horde'
-     *   - port: (array) The port(s) memcache is listening on. Leave empty
-     *           if using UNIX sockets.
-     *           DEFAULT: 11211
-     *   - weight: (array) The weight(s) to use for each memcached host.
-     *             DEFAULT: none (equal weight to all servers)
-     *
-     * @throws Horde_Memcache_Exception
-     */
-    public function __construct(array $params = array())
-    {
-        $this->_params = array_merge($this->_params, $params);
-
-        if (isset($params['logger'])) {
-            $this->_logger = $params['logger'];
-        }
-
-        $this->_init();
-    }
-
-    /**
-     * Do initialization.
-     *
-     * @throws Horde_Memcache_Exception
-     */
-    public function _init()
-    {
-        $this->_memcache = new Memcache();
-
-        $servers = array();
-        for ($i = 0, $n = count($this->_params['hostspec']); $i < $n; ++$i) {
-            if ($this->_memcache->addServer($this->_params['hostspec'][$i], 
empty($this->_params['port'][$i]) ? 0 : $this->_params['port'][$i], 
!empty($this->_params['persistent']), !empty($this->_params['weight'][$i]) ? 
$this->_params['weight'][$i] : 1)) {
-                $servers[] = $this->_params['hostspec'][$i] . 
(!empty($this->_params['port'][$i]) ? ':' . $this->_params['port'][$i] : '');
-            }
-        }
-
-        /* Check if any of the connections worked. */
-        if (empty($servers)) {
-            throw new Horde_Memcache_Exception('Could not connect to any 
defined memcache servers.');
-        }
-
-        if (!empty($this->_params['c_threshold'])) {
-            
$this->_memcache->setCompressThreshold($this->_params['c_threshold']);
-        }
-
-        // Force consistent hashing
-        ini_set('memcache.hash_strategy', 'consistent');
-
-        if ($this->_logger) {
-            $this->_logger->log('Connected to the following memcache servers:' 
. implode($servers, ', '), 'DEBUG');
-        }
-    }
-
-    /**
-     * Delete a key.
-     *
-     * @see Memcache::delete()
-     *
-     * @param string $key       The key.
-     * @param integer $timeout  Expiration time in seconds.
-     *
-     * @return boolean  True on success.
-     */
-    public function delete($key, $timeout = 0)
-    {
-        return isset($this->_noexist[$key])
-            ? false
-            : $this->_memcache->delete($this->_key($key), $timeout);
-    }
-
-    /**
-     * Get data associated with a key.
-     *
-     * @see Memcache::get()
-     *
-     * @param mixed $keys  The key or an array of keys.
-     *
-     * @return mixed  The string/array on success (return type is the type of
-     *                $keys), false on failure.
-     */
-    public function get($keys)
-    {
-        $flags = null;
-        $key_map = $missing_parts = $os = $out_array = array();
-        $ret_array = true;
-
-        if (!is_array($keys)) {
-            $keys = array($keys);
-            $ret_array = false;
-        }
-        $search_keys = $keys;
-
-        foreach ($search_keys as $v) {
-            $key_map[$v] = $this->_key($v);
-        }
-
-        if (($res = $this->_memcache->get(array_values($key_map), $flags)) === 
false) {
-            return false;
-        }
-
-        /* Check to see if we have any oversize items we need to get. */
-        if (!empty($this->_params['large_items'])) {
-            foreach ($key_map as $key => $val) {
-                $part_count = ($flags[$val] >> self::FLAGS_RESERVED) - 1;
-
-                switch ($part_count) {
-                case -1:
-                    /* Ignore. */
-                    unset($res[$val]);
-                    break;
-
-                case 0:
-                    /* Not an oversize part. */
-                    break;
-
-                default:
-                    $os[$key] = $this->_getOSKeyArray($key, $part_count);
-                    foreach ($os[$key] as $val2) {
-                        $missing_parts[] = $key_map[$val2] = 
$this->_key[$val2];
-                    }
-                    break;
-                }
-            }
-
-            if (!empty($missing_parts)) {
-                if (($res2 = $this->_memcache->get($missing_parts)) === false) 
{
-                    return false;
-                }
-
-                /* $res should now contain the same results as if we had
-                 * run a single get request with all keys above. */
-                $res = array_merge($res, $res2);
-            }
-        }
-
-        foreach ($key_map as $k => $v) {
-            if (!isset($res[$v])) {
-                $this->_noexist[$k] = true;
-            }
-        }
-
-        foreach ($keys as $k) {
-            $out_array[$k] = false;
-            if (isset($res[$key_map[$k]])) {
-                $data = $res[$key_map[$k]];
-                if (isset($os[$k])) {
-                    foreach ($os[$k] as $v) {
-                        if (isset($res[$key_map[$v]])) {
-                            $data .= $res[$key_map[$v]];
-                        } else {
-                            $this->delete($k);
-                            continue 2;
-                        }
-                    }
-                }
-                $out_array[$k] = @unserialize($data);
-            } elseif (isset($os[$k]) && !isset($res[$key_map[$k]])) {
-                $this->delete($k);
-            }
-        }
-
-        return $ret_array
-            ? $out_array
-            : reset($out_array);
-    }
-
-    /**
-     * Set the value of a key.
-     *
-     * @see Memcache::set()
-     *
-     * @param string $key       The key.
-     * @param string $var       The data to store.
-     * @param integer $timeout  Expiration time in seconds.
-     *
-     * @return boolean  True on success.
-     */
-    public function set($key, $var, $expire = 0)
-    {
-        return $this->_set($key, @serialize($var), $expire);
-    }
-
-    /**
-     * Set the value of a key.
-     *
-     * @param string $key       The key.
-     * @param string $var       The data to store (serialized).
-     * @param integer $timeout  Expiration time in seconds.
-     * @param integer $lent     String length of $len.
-     *
-     * @return boolean  True on success.
-     */
-    protected function _set($key, $var, $expire = 0, $len = null)
-    {
-        if (is_null($len)) {
-            $len = strlen($var);
-        }
-
-        if (empty($this->_params['large_items']) && ($len > self::MAX_SIZE)) {
-            return false;
-        }
-
-        for ($i = 0; ($i * self::MAX_SIZE) < $len; ++$i) {
-            $curr_key = $i ? ($key . '_s' . $i) : $key;
-
-            $flags = $this->_getFlags($i ? 0 : ceil($len / self::MAX_SIZE));
-            $res = $this->_memcache->set($this->_key($curr_key), substr($var, 
$i * self::MAX_SIZE, self::MAX_SIZE), $flags, $expire);
-            if ($res === false) {
-                $this->delete($key);
-                break;
-            }
-            unset($this->_noexist[$curr_key]);
-        }
-
-        return $res;
-    }
-
-    /**
-     * Replace the value of a key.
-     *
-     * @see Memcache::replace()
-     *
-     * @param string $key       The key.
-     * @param string $var       The data to store.
-     * @param integer $timeout  Expiration time in seconds.
-     *
-     * @return boolean  True on success, false if key doesn't exist.
-     */
-    public function replace($key, $var, $expire = 0)
-    {
-        $var = @serialize($var);
-        $len = strlen($var);
-
-        if ($len > self::MAX_SIZE) {
-            if (!empty($this->_params['large_items']) &&
-                $this->_memcache->get($this->_key($key))) {
-                return $this->_set($key, $var, $expire, $len);
-            }
-            return false;
-        }
-
-        return $this->_memcache->replace($this->_key($key), $var, 
$this->_getFlags(1), $expire);
-    }
-
-    /**
-     * Obtain lock on a key.
-     *
-     * @param string $key  The key to lock.
-     */
-    public function lock($key)
-    {
-        /* Lock will automatically expire after 10 seconds. */
-        while ($this->_memcache->add($this->_key($key . '_l'), 1, 0, 10) === 
false) {
-            /* Wait 0.005 secs before attempting again. */
-            usleep(5000);
-        }
-    }
-
-    /**
-     * Release lock on a key.
-     *
-     * @param string $key  The key to lock.
-     */
-    public function unlock($key)
-    {
-        $this->_memcache->delete($this->_key($key . '_l'), 0);
-    }
-
-    /**
-     * Mark all entries on a memcache installation as expired.
-     */
-    public function flush()
-    {
-        $this->_memcache->flush();
-    }
-
-    /**
-     * Get the statistics output from the current memcache pool.
-     *
-     * @return array  The output from Memcache::getExtendedStats() using the
-     *                current configuration values.
-     */
-    public function stats()
-    {
-        return $this->_memcache->getExtendedStats();
-    }
-
-    /**
-     * Obtains the md5 sum for a key.
-     *
-     * @param string $key  The key.
-     *
-     * @return string  The corresponding memcache key.
-     */
-    protected function _key($key)
-    {
-        return hash('md5', $this->_params['prefix'] . $key);
-    }
-
-    /**
-     * Returns the key listing of all key IDs for an oversized item.
-     *
-     * @return array  The array of key IDs.
-     */
-    protected function _getOSKeyArray($key, $length)
-    {
-        $ret = array();
-        for ($i = 0; $i < $length; ++$i) {
-            $ret[] = $key . '_s' . ($i + 1);
-        }
-        return $ret;
-    }
-
-    /**
-     * Get flags for memcache call.
-     *
-     * @param integer $count
-     *
-     * @return integer
-     */
-    protected function _getFlags($count)
-    {
-        $flags = empty($this->_params['compression'])
-            ? 0
-            : MEMCACHE_COMPRESSED;
-        return ($flags | $count << self::FLAGS_RESERVED);
-    }
-
-    /* Serializable methods. */
-
-    /**
-     * Serialize.
-     *
-     * @return string  Serialized representation of this object.
-     */
-    public function serialize()
-    {
-        return serialize(array(
-            self::VERSION,
-            $this->_params,
-            $this->_logger
-        ));
-    }
-
-    /**
-     * Unserialize.
-     *
-     * @param string $data  Serialized data.
-     *
-     * @throws Exception
-     * @throws Horde_Memcache_Exception
-     */
-    public function unserialize($data)
-    {
-        $data = @unserialize($data);
-        if (!is_array($data) ||
-            !isset($data[0]) ||
-            ($data[0] != self::VERSION)) {
-            throw new Exception('Cache version change');
-        }
-
-        $this->_params = $data[1];
-        $this->_logger = $data[2];
-
-        $this->_init();
-    }
-
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Horde_Memcache-1.0.4/lib/Horde/Memcache/Exception.php 
new/Horde_Memcache-1.0.4/lib/Horde/Memcache/Exception.php
--- old/Horde_Memcache-1.0.4/lib/Horde/Memcache/Exception.php   1970-01-01 
01:00:00.000000000 +0100
+++ new/Horde_Memcache-1.0.4/lib/Horde/Memcache/Exception.php   2011-09-20 
14:31:16.000000000 +0200
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Exception handler for the Horde_Memcache package.
+ *
+ * Copyright 2011 Horde LLC (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.horde.org/licenses/lgpl21.
+ *
+ * @author   Michael Slusarz <[email protected]>
+ * @category Horde
+ * @license  http://www.horde.org/licenses/lgpl21 LGPL 2.1
+ * @package  Memcache
+ */
+class Horde_Memcache_Exception extends Horde_Exception_Wrapped
+{
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Horde_Memcache-1.0.4/lib/Horde/Memcache.php 
new/Horde_Memcache-1.0.4/lib/Horde/Memcache.php
--- old/Horde_Memcache-1.0.4/lib/Horde/Memcache.php     1970-01-01 
01:00:00.000000000 +0100
+++ new/Horde_Memcache-1.0.4/lib/Horde/Memcache.php     2011-09-20 
14:31:16.000000000 +0200
@@ -0,0 +1,460 @@
+<?php
+/**
+ * This class provides an API or Horde code to interact with a centrally
+ * configured memcache installation.
+ *
+ * memcached website: http://www.danga.com/memcached/
+ *
+ * Copyright 2007-2011 Horde LLC (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.horde.org/licenses/lgpl21.
+ *
+ * @author   Michael Slusarz <[email protected]>
+ * @author   Didi Rieder <[email protected]>
+ * @category Horde
+ * @license  http://www.horde.org/licenses/lgpl21 LGPL 2.1
+ * @package  Memcache
+ */
+class Horde_Memcache implements Serializable
+{
+    /**
+     * The number of bits reserved by PHP's memcache layer for internal flag
+     * use.
+     */
+    const FLAGS_RESERVED = 16;
+
+    /**
+     * The max storage size of the memcache server.  This should be slightly
+     * smaller than the actual value due to overhead.  By default, the max
+     * slab size of memcached (as of 1.1.2) is 1 MB.
+     */
+    const MAX_SIZE = 1000000;
+
+    /**
+     * Serializable version.
+     */
+    const VERSION = 1;
+
+    /**
+     * Memcache object.
+     *
+     * @var Memcache
+     */
+    protected $_memcache;
+
+    /**
+     * Memcache defaults.
+     *
+     * @var array
+     */
+    protected $_params = array(
+        'compression' => false,
+        'hostspec' => array('localhost'),
+        'large_items' => true,
+        'persistent' => false,
+        'port' => array(11211),
+        'prefix' => 'horde'
+    );
+
+    /**
+     * A list of items known not to exist.
+     *
+     * @var array
+     */
+    protected $_noexist = array();
+
+    /**
+     * Logger instance.
+     *
+     * @var Horde_Log_Logger
+     */
+    protected $_logger;
+
+    /**
+     * Constructor.
+     *
+     * @param array $params  Configuration parameters:
+     *   - compression: (boolean) Compress data inside memcache?
+     *                  DEFAULT: false
+     *   - c_threshold: (integer) The minimum value length before attempting
+     *                  to compress.
+     *                  DEFAULT: none
+     *   - hostspec: (array) The memcached host(s) to connect to.
+     *                  DEFAULT: 'localhost'
+     *   - large_items: (boolean) Allow storing large data items (larger than
+     *                  Horde_Memcache::MAX_SIZE)?
+     *                  DEFAULT: true
+     *   - persistent: (boolean) Use persistent DB connections?
+     *                 DEFAULT: false
+     *   - prefix: (string) The prefix to use for the memcache keys.
+     *             DEFAULT: 'horde'
+     *   - port: (array) The port(s) memcache is listening on. Leave empty
+     *           if using UNIX sockets.
+     *           DEFAULT: 11211
+     *   - weight: (array) The weight(s) to use for each memcached host.
+     *             DEFAULT: none (equal weight to all servers)
+     *
+     * @throws Horde_Memcache_Exception
+     */
+    public function __construct(array $params = array())
+    {
+        $this->_params = array_merge($this->_params, $params);
+
+        if (isset($params['logger'])) {
+            $this->_logger = $params['logger'];
+        }
+
+        $this->_init();
+    }
+
+    /**
+     * Do initialization.
+     *
+     * @throws Horde_Memcache_Exception
+     */
+    public function _init()
+    {
+        $this->_memcache = new Memcache();
+
+        $servers = array();
+        for ($i = 0, $n = count($this->_params['hostspec']); $i < $n; ++$i) {
+            if ($this->_memcache->addServer($this->_params['hostspec'][$i], 
empty($this->_params['port'][$i]) ? 0 : $this->_params['port'][$i], 
!empty($this->_params['persistent']), !empty($this->_params['weight'][$i]) ? 
$this->_params['weight'][$i] : 1)) {
+                $servers[] = $this->_params['hostspec'][$i] . 
(!empty($this->_params['port'][$i]) ? ':' . $this->_params['port'][$i] : '');
+            }
+        }
+
+        /* Check if any of the connections worked. */
+        if (empty($servers)) {
+            throw new Horde_Memcache_Exception('Could not connect to any 
defined memcache servers.');
+        }
+
+        if (!empty($this->_params['c_threshold'])) {
+            
$this->_memcache->setCompressThreshold($this->_params['c_threshold']);
+        }
+
+        // Force consistent hashing
+        ini_set('memcache.hash_strategy', 'consistent');
+
+        if ($this->_logger) {
+            $this->_logger->log('Connected to the following memcache servers:' 
. implode($servers, ', '), 'DEBUG');
+        }
+    }
+
+    /**
+     * Delete a key.
+     *
+     * @see Memcache::delete()
+     *
+     * @param string $key       The key.
+     * @param integer $timeout  Expiration time in seconds.
+     *
+     * @return boolean  True on success.
+     */
+    public function delete($key, $timeout = 0)
+    {
+        return isset($this->_noexist[$key])
+            ? false
+            : $this->_memcache->delete($this->_key($key), $timeout);
+    }
+
+    /**
+     * Get data associated with a key.
+     *
+     * @see Memcache::get()
+     *
+     * @param mixed $keys  The key or an array of keys.
+     *
+     * @return mixed  The string/array on success (return type is the type of
+     *                $keys), false on failure.
+     */
+    public function get($keys)
+    {
+        $flags = null;
+        $key_map = $missing_parts = $os = $out_array = array();
+        $ret_array = true;
+
+        if (!is_array($keys)) {
+            $keys = array($keys);
+            $ret_array = false;
+        }
+        $search_keys = $keys;
+
+        foreach ($search_keys as $v) {
+            $key_map[$v] = $this->_key($v);
+        }
+
+        if (($res = $this->_memcache->get(array_values($key_map), $flags)) === 
false) {
+            return false;
+        }
+
+        /* Check to see if we have any oversize items we need to get. */
+        if (!empty($this->_params['large_items'])) {
+            foreach ($key_map as $key => $val) {
+                $part_count = isset($flags[$val])
+                    ? ($flags[$val] >> self::FLAGS_RESERVED) - 1
+                    : -1;
+
+                switch ($part_count) {
+                case -1:
+                    /* Ignore. */
+                    unset($res[$val]);
+                    break;
+
+                case 0:
+                    /* Not an oversize part. */
+                    break;
+
+                default:
+                    $os[$key] = $this->_getOSKeyArray($key, $part_count);
+                    foreach ($os[$key] as $val2) {
+                        $missing_parts[] = $key_map[$val2] = 
$this->_key[$val2];
+                    }
+                    break;
+                }
+            }
+
+            if (!empty($missing_parts)) {
+                if (($res2 = $this->_memcache->get($missing_parts)) === false) 
{
+                    return false;
+                }
+
+                /* $res should now contain the same results as if we had
+                 * run a single get request with all keys above. */
+                $res = array_merge($res, $res2);
+            }
+        }
+
+        foreach ($key_map as $k => $v) {
+            if (!isset($res[$v])) {
+                $this->_noexist[$k] = true;
+            }
+        }
+
+        foreach ($keys as $k) {
+            $out_array[$k] = false;
+            if (isset($res[$key_map[$k]])) {
+                $data = $res[$key_map[$k]];
+                if (isset($os[$k])) {
+                    foreach ($os[$k] as $v) {
+                        if (isset($res[$key_map[$v]])) {
+                            $data .= $res[$key_map[$v]];
+                        } else {
+                            $this->delete($k);
+                            continue 2;
+                        }
+                    }
+                }
+                $out_array[$k] = @unserialize($data);
+            } elseif (isset($os[$k]) && !isset($res[$key_map[$k]])) {
+                $this->delete($k);
+            }
+        }
+
+        return $ret_array
+            ? $out_array
+            : reset($out_array);
+    }
+
+    /**
+     * Set the value of a key.
+     *
+     * @see Memcache::set()
+     *
+     * @param string $key       The key.
+     * @param string $var       The data to store.
+     * @param integer $timeout  Expiration time in seconds.
+     *
+     * @return boolean  True on success.
+     */
+    public function set($key, $var, $expire = 0)
+    {
+        return $this->_set($key, @serialize($var), $expire);
+    }
+
+    /**
+     * Set the value of a key.
+     *
+     * @param string $key       The key.
+     * @param string $var       The data to store (serialized).
+     * @param integer $timeout  Expiration time in seconds.
+     * @param integer $lent     String length of $len.
+     *
+     * @return boolean  True on success.
+     */
+    protected function _set($key, $var, $expire = 0, $len = null)
+    {
+        if (is_null($len)) {
+            $len = strlen($var);
+        }
+
+        if (empty($this->_params['large_items']) && ($len > self::MAX_SIZE)) {
+            return false;
+        }
+
+        for ($i = 0; ($i * self::MAX_SIZE) < $len; ++$i) {
+            $curr_key = $i ? ($key . '_s' . $i) : $key;
+
+            $flags = $this->_getFlags($i ? 0 : ceil($len / self::MAX_SIZE));
+            $res = $this->_memcache->set($this->_key($curr_key), substr($var, 
$i * self::MAX_SIZE, self::MAX_SIZE), $flags, $expire);
+            if ($res === false) {
+                $this->delete($key);
+                break;
+            }
+            unset($this->_noexist[$curr_key]);
+        }
+
+        return $res;
+    }
+
+    /**
+     * Replace the value of a key.
+     *
+     * @see Memcache::replace()
+     *
+     * @param string $key       The key.
+     * @param string $var       The data to store.
+     * @param integer $timeout  Expiration time in seconds.
+     *
+     * @return boolean  True on success, false if key doesn't exist.
+     */
+    public function replace($key, $var, $expire = 0)
+    {
+        $var = @serialize($var);
+        $len = strlen($var);
+
+        if ($len > self::MAX_SIZE) {
+            if (!empty($this->_params['large_items']) &&
+                $this->_memcache->get($this->_key($key))) {
+                return $this->_set($key, $var, $expire, $len);
+            }
+            return false;
+        }
+
+        return $this->_memcache->replace($this->_key($key), $var, 
$this->_getFlags(1), $expire);
+    }
+
+    /**
+     * Obtain lock on a key.
+     *
+     * @param string $key  The key to lock.
+     */
+    public function lock($key)
+    {
+        /* Lock will automatically expire after 10 seconds. */
+        while ($this->_memcache->add($this->_key($key . '_l'), 1, 0, 10) === 
false) {
+            /* Wait 0.005 secs before attempting again. */
+            usleep(5000);
+        }
+    }
+
+    /**
+     * Release lock on a key.
+     *
+     * @param string $key  The key to lock.
+     */
+    public function unlock($key)
+    {
+        $this->_memcache->delete($this->_key($key . '_l'), 0);
+    }
+
+    /**
+     * Mark all entries on a memcache installation as expired.
+     */
+    public function flush()
+    {
+        $this->_memcache->flush();
+    }
+
+    /**
+     * Get the statistics output from the current memcache pool.
+     *
+     * @return array  The output from Memcache::getExtendedStats() using the
+     *                current configuration values.
+     */
+    public function stats()
+    {
+        return $this->_memcache->getExtendedStats();
+    }
+
+    /**
+     * Obtains the md5 sum for a key.
+     *
+     * @param string $key  The key.
+     *
+     * @return string  The corresponding memcache key.
+     */
+    protected function _key($key)
+    {
+        return hash('md5', $this->_params['prefix'] . $key);
+    }
+
+    /**
+     * Returns the key listing of all key IDs for an oversized item.
+     *
+     * @return array  The array of key IDs.
+     */
+    protected function _getOSKeyArray($key, $length)
+    {
+        $ret = array();
+        for ($i = 0; $i < $length; ++$i) {
+            $ret[] = $key . '_s' . ($i + 1);
+        }
+        return $ret;
+    }
+
+    /**
+     * Get flags for memcache call.
+     *
+     * @param integer $count
+     *
+     * @return integer
+     */
+    protected function _getFlags($count)
+    {
+        $flags = empty($this->_params['compression'])
+            ? 0
+            : MEMCACHE_COMPRESSED;
+        return ($flags | $count << self::FLAGS_RESERVED);
+    }
+
+    /* Serializable methods. */
+
+    /**
+     * Serialize.
+     *
+     * @return string  Serialized representation of this object.
+     */
+    public function serialize()
+    {
+        return serialize(array(
+            self::VERSION,
+            $this->_params,
+            $this->_logger
+        ));
+    }
+
+    /**
+     * Unserialize.
+     *
+     * @param string $data  Serialized data.
+     *
+     * @throws Exception
+     * @throws Horde_Memcache_Exception
+     */
+    public function unserialize($data)
+    {
+        $data = @unserialize($data);
+        if (!is_array($data) ||
+            !isset($data[0]) ||
+            ($data[0] != self::VERSION)) {
+            throw new Exception('Cache version change');
+        }
+
+        $this->_params = $data[1];
+        $this->_logger = $data[2];
+
+        $this->_init();
+    }
+
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/package.xml new/package.xml
--- old/package.xml     2011-06-04 21:39:13.000000000 +0200
+++ new/package.xml     2011-09-20 14:31:16.000000000 +0200
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.9.2" version="2.0" 
xmlns="http://pear.php.net/dtd/package-2.0"; 
xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 
http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 
http://pear.php.net/dtd/package-2.0.xsd";>
+<package packagerversion="1.9.4" version="2.0" 
xmlns="http://pear.php.net/dtd/package-2.0"; 
xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 
http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 
http://pear.php.net/dtd/package-2.0.xsd";>
  <name>Horde_Memcache</name>
  <channel>pear.horde.org</channel>
  <summary>Horde Memcache API</summary>
@@ -10,24 +10,24 @@
   <email>[email protected]</email>
   <active>yes</active>
  </lead>
- <date>2011-06-04</date>
- <time>13:39:13</time>
+ <date>2011-09-20</date>
+ <time>14:31:16</time>
  <version>
-  <release>1.0.3</release>
+  <release>1.0.4</release>
   <api>1.0.0</api>
  </version>
  <stability>
   <release>stable</release>
   <api>stable</api>
  </stability>
- <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+ <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
  <notes>
-* [mms] pecl/Memcache version 3.0.3 upwards started to reserve the first 16 
bits for internal flag use (Ticket #10123; [email protected]).
+* [mms] Silence undefined errors when a search key is not found on the server.
  </notes>
  <contents>
   <dir baseinstalldir="/" name="/">
-   <file baseinstalldir="/" md5sum="f4d53d5eaa2857a34e0c1f9695759ce0" 
name="lib/Horde/Memcache/Exception.php" role="php" />
-   <file baseinstalldir="/" md5sum="480271e35a18cd4e6d8e7035b103d9ee" 
name="lib/Horde/Memcache.php" role="php" />
+   <file baseinstalldir="/" md5sum="4365aaa1a13f3c73f4f60d550d74e8cf" 
name="lib/Horde/Memcache/Exception.php" role="php" />
+   <file baseinstalldir="/" md5sum="e711bd07c11cd86ed4964a98e325e06d" 
name="lib/Horde/Memcache.php" role="php" />
   </dir>
  </contents>
  <dependencies>
@@ -71,7 +71,7 @@
     <api>alpha</api>
    </stability>
    <date>2011-03-08</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * First alpha release for Horde 4.
 * Remove Horde_Core dependency.
@@ -87,7 +87,7 @@
     <api>beta</api>
    </stability>
    <date>2011-03-16</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * First beta release for Horde 4.
    </notes>
@@ -102,7 +102,7 @@
     <api>beta</api>
    </stability>
    <date>2011-03-22</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * First release candidate for Horde 4.
    </notes>
@@ -117,7 +117,7 @@
     <api>beta</api>
    </stability>
    <date>2011-03-29</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * Second release candidate for Horde 4.
    </notes>
@@ -132,7 +132,7 @@
     <api>stable</api>
    </stability>
    <date>2011-04-06</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * First stable release for Horde 4.
    </notes>
@@ -147,7 +147,7 @@
     <api>stable</api>
    </stability>
    <date>2011-05-03</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * [jan] Fix dependency.
    </notes>
@@ -162,7 +162,7 @@
     <api>stable</api>
    </stability>
    <date>2011-06-01</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * [mms] Use memcache flags to keep track of large objects 
([email protected], Request #10123).
    </notes>
@@ -177,10 +177,25 @@
     <api>stable</api>
    </stability>
    <date>2011-06-04</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html";>LGPL</license>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
    <notes>
 * [mms] pecl/Memcache version 3.0.3 upwards started to reserve the first 16 
bits for internal flag use (Ticket #10123; [email protected]).
    </notes>
   </release>
+  <release>
+   <version>
+    <release>1.0.4</release>
+    <api>1.0.0</api>
+   </version>
+   <stability>
+    <release>stable</release>
+    <api>stable</api>
+   </stability>
+   <date>2011-09-20</date>
+   <license uri="http://www.horde.org/licenses/lgpl21";>LGPL-2.1</license>
+   <notes>
+* [mms] Silence undefined errors when a search key is not found on the server.
+   </notes>
+  </release>
  </changelog>
 </package>

++++++ lgpl-2.1-standalone.html ++++++
++++ 620 lines (skipped)

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to