diff --git a/django/core/cache/backends/db.py b/django/core/cache/backends/db.py index 4e81ec29f1f..eb459a076d5 100644 --- a/django/core/cache/backends/db.py +++ b/django/core/cache/backends/db.py @@ -35,7 +35,8 @@ class CacheClass(BaseCache): cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key]) transaction.commit_unless_managed() return default - return pickle.loads(base64.decodestring(row[1])) + value = connection.ops.process_clob(row[1]) + return pickle.loads(base64.decodestring(value)) def set(self, key, value, timeout=None): self._base_set('set', key, value, timeout) diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py index 1c057c3358e..6dcc17f4f2b 100644 --- a/django/db/backends/__init__.py +++ b/django/db/backends/__init__.py @@ -255,6 +255,13 @@ class BaseDatabaseOperations(object): """ return 'DEFAULT' + def process_clob(self, value): + """ + Returns the value of a CLOB column, for backends that return a locator + object that requires additional processing. + """ + return value + def return_insert_id(self): """ For backends that support returning the last insert ID as part diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 109ec5bd9f1..6000e32f3a3 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -123,6 +123,11 @@ WHEN (new.%(col_name)s IS NULL) def prep_for_iexact_query(self, x): return x + def process_clob(self, value): + if value is None: + return u'' + return force_unicode(value.read()) + def query_class(self, DefaultQueryClass): return query.query_class(DefaultQueryClass, Database)