Skip to content

Commit 52e8107

Browse files
committed
[1.2.X] Fixed django#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
1 parent 9ccf1d0 commit 52e8107

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

django/core/cache/backends/memcached.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ def _get_memcache_timeout(self, timeout):
4040
return timeout
4141

4242
def add(self, key, value, timeout=0):
43-
if isinstance(value, unicode):
44-
value = value.encode('utf-8')
4543
return self._cache.add(smart_str(key), value, self._get_memcache_timeout(timeout))
4644

4745
def get(self, key, default=None):
@@ -92,8 +90,6 @@ def decr(self, key, delta=1):
9290
def set_many(self, data, timeout=0):
9391
safe_data = {}
9492
for key, value in data.items():
95-
if isinstance(value, unicode):
96-
value = value.encode('utf-8')
9793
safe_data[smart_str(key)] = value
9894
self._cache.set_multi(safe_data, self._get_memcache_timeout(timeout))
9995

tests/regressiontests/cache/tests.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,20 +293,48 @@ def test_unicode(self):
293293
u'Iñtërnâtiônàlizætiøn': u'Iñtërnâtiônàlizætiøn2',
294294
u'ascii': {u'x' : 1 }
295295
}
296+
# Test `set`
296297
for (key, value) in stuff.items():
297298
self.cache.set(key, value)
298299
self.assertEqual(self.cache.get(key), value)
299300

301+
# Test `add`
302+
for (key, value) in stuff.items():
303+
self.cache.delete(key)
304+
self.cache.add(key, value)
305+
self.assertEqual(self.cache.get(key), value)
306+
307+
# Test `set_many`
308+
for (key, value) in stuff.items():
309+
self.cache.delete(key)
310+
self.cache.set_many(stuff)
311+
for (key, value) in stuff.items():
312+
self.assertEqual(self.cache.get(key), value)
313+
300314
def test_binary_string(self):
301315
# Binary strings should be cachable
302316
from zlib import compress, decompress
303317
value = 'value_to_be_compressed'
304318
compressed_value = compress(value)
319+
320+
# Test set
305321
self.cache.set('binary1', compressed_value)
306322
compressed_result = self.cache.get('binary1')
307323
self.assertEqual(compressed_value, compressed_result)
308324
self.assertEqual(value, decompress(compressed_result))
309325

326+
# Test add
327+
self.cache.add('binary1-add', compressed_value)
328+
compressed_result = self.cache.get('binary1-add')
329+
self.assertEqual(compressed_value, compressed_result)
330+
self.assertEqual(value, decompress(compressed_result))
331+
332+
# Test set_many
333+
self.cache.set_many({'binary1-set_many': compressed_value})
334+
compressed_result = self.cache.get('binary1-set_many')
335+
self.assertEqual(compressed_value, compressed_result)
336+
self.assertEqual(value, decompress(compressed_result))
337+
310338
def test_set_many(self):
311339
# Multiple keys can be set using set_many
312340
self.cache.set_many({"key1": "spam", "key2": "eggs"})

0 commit comments

Comments
 (0)