From 1a6d98dab97df7e4bfc6fd9c82183eb9a1349078 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sat, 19 Mar 2011 02:42:40 +0000 Subject: [PATCH] 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. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15880 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 a40416d90d..c456f7f3c3 100644 --- a/django/core/cache/backends/memcached.py +++ b/django/core/cache/backends/memcached.py @@ -51,8 +51,6 @@ class BaseMemcachedCache(BaseCache): def add(self, key, value, timeout=0, version=None): key = self.make_key(key, version=version) - if isinstance(value, unicode): - value = value.encode('utf-8') return self._cache.add(key, value, self._get_memcache_timeout(timeout)) def get(self, key, default=None, version=None): @@ -118,8 +116,6 @@ class BaseMemcachedCache(BaseCache): safe_data = {} for key, value in data.items(): key = self.make_key(key, version=version) - if isinstance(value, unicode): - value = value.encode('utf-8') safe_data[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 62d5eb6c87..2832bcbdd9 100644 --- a/tests/regressiontests/cache/tests.py +++ b/tests/regressiontests/cache/tests.py @@ -317,20 +317,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"})