summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2012-11-10 18:39:59 +0200
committerAnssi Kääriäinen <akaariai@gmail.com>2012-11-10 19:48:27 +0200
commit825a793555aafcbd670e50759f9a5046f11703df (patch)
tree3088a39ac21812f86f24cc43fc0eaf819707a273
parent48a2917d46571840d3df43f2b434f81166071a17 (diff)
[1.5.x] Fixed #19273 -- Fixed DB cache backend on pg 9.0+ and py3
There was a problem caused by Postgres 9.0+ having bytea_output default value of 'hex' and cache backend inserting the content as 'bytes' into a column of type TEXT. Fixed by converting the bytes value to a string before insert. Backpatch of [cc0ac26f4a3947be8a3fc55d4784d3474b640c23].
-rw-r--r--django/core/cache/backends/db.py12
1 files changed, 8 insertions, 4 deletions
diff --git a/django/core/cache/backends/db.py b/django/core/cache/backends/db.py
index 348b03f733..c93bc90b18 100644
--- a/django/core/cache/backends/db.py
+++ b/django/core/cache/backends/db.py
@@ -11,7 +11,7 @@ except ImportError:
from django.conf import settings
from django.core.cache.backends.base import BaseCache
from django.db import connections, router, transaction, DatabaseError
-from django.utils import timezone
+from django.utils import timezone, six
from django.utils.encoding import force_bytes
@@ -104,7 +104,11 @@ class DatabaseCache(BaseDatabaseCache):
if num > self._max_entries:
self._cull(db, cursor, now)
pickled = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
- encoded = base64.b64encode(pickled).strip()
+ b64encoded = base64.b64encode(pickled)
+ # The DB column is expecting a string, so make sure the value is a
+ # string, not bytes. Refs #19274.
+ if six.PY3:
+ b64encoded = b64encoded.decode('latin1')
cursor.execute("SELECT cache_key, expires FROM %s "
"WHERE cache_key = %%s" % table, [key])
try:
@@ -113,11 +117,11 @@ class DatabaseCache(BaseDatabaseCache):
(mode == 'add' and result[1] < now)):
cursor.execute("UPDATE %s SET value = %%s, expires = %%s "
"WHERE cache_key = %%s" % table,
- [encoded, connections[db].ops.value_to_db_datetime(exp), key])
+ [b64encoded, connections[db].ops.value_to_db_datetime(exp), key])
else:
cursor.execute("INSERT INTO %s (cache_key, value, expires) "
"VALUES (%%s, %%s, %%s)" % table,
- [key, encoded, connections[db].ops.value_to_db_datetime(exp)])
+ [key, b64encoded, connections[db].ops.value_to_db_datetime(exp)])
except DatabaseError:
# To be threadsafe, updates/inserts are allowed to fail silently
transaction.rollback_unless_managed(using=db)