From 52e81079bee761500c21c11fa3cabf9a8da1546f Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sat, 19 Mar 2011 02:45:51 +0000 Subject: [PATCH] [1.2.X] Fixed #13686 -- Ensure that memcache handling of unicode values in add() and set_many() is consistent with the handling provided by get() and set(). Thanks to nedbatchelder for the report, and to jbalogh, accuser and Jacob Burch for their work ont the patch. Backport of r15880 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15881 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/cache/backends/memcached.py | 4 ---- tests/regressiontests/cache/tests.py | 28 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/django/core/cache/backends/memcached.py b/django/core/cache/backends/memcached.py index 7d6b5b362b..5e2eaa72a9 100644 --- a/django/core/cache/backends/memcached.py +++ b/django/core/cache/backends/memcached.py @@ -40,8 +40,6 @@ class CacheClass(BaseCache): return timeout def add(self, key, value, timeout=0): - if isinstance(value, unicode): - value = value.encode('utf-8') return self._cache.add(smart_str(key), value, self._get_memcache_timeout(timeout)) def get(self, key, default=None): @@ -92,8 +90,6 @@ class CacheClass(BaseCache): def set_many(self, data, timeout=0): safe_data = {} for key, value in data.items(): - if isinstance(value, unicode): - value = value.encode('utf-8') safe_data[smart_str(key)] = value self._cache.set_multi(safe_data, self._get_memcache_timeout(timeout)) diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py index f109e39f00..0581e4e7d8 100644 --- a/tests/regressiontests/cache/tests.py +++ b/tests/regressiontests/cache/tests.py @@ -293,20 +293,48 @@ class BaseCacheTests(object): u'Iñtërnâtiônàlizætiøn': u'Iñtërnâtiônàlizætiøn2', u'ascii': {u'x' : 1 } } + # Test `set` for (key, value) in stuff.items(): self.cache.set(key, value) self.assertEqual(self.cache.get(key), value) + # Test `add` + for (key, value) in stuff.items(): + self.cache.delete(key) + self.cache.add(key, value) + self.assertEqual(self.cache.get(key), value) + + # Test `set_many` + for (key, value) in stuff.items(): + self.cache.delete(key) + self.cache.set_many(stuff) + for (key, value) in stuff.items(): + self.assertEqual(self.cache.get(key), value) + def test_binary_string(self): # Binary strings should be cachable from zlib import compress, decompress value = 'value_to_be_compressed' compressed_value = compress(value) + + # Test set self.cache.set('binary1', compressed_value) compressed_result = self.cache.get('binary1') self.assertEqual(compressed_value, compressed_result) self.assertEqual(value, decompress(compressed_result)) + # Test add + self.cache.add('binary1-add', compressed_value) + compressed_result = self.cache.get('binary1-add') + self.assertEqual(compressed_value, compressed_result) + self.assertEqual(value, decompress(compressed_result)) + + # Test set_many + self.cache.set_many({'binary1-set_many': compressed_value}) + compressed_result = self.cache.get('binary1-set_many') + self.assertEqual(compressed_value, compressed_result) + self.assertEqual(value, decompress(compressed_result)) + def test_set_many(self): # Multiple keys can be set using set_many self.cache.set_many({"key1": "spam", "key2": "eggs"})