Commit 8e733020 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

[1.3.x] Fixed #16481 -- Adapted one raw SQL query in cull implementation of...

[1.3.x] Fixed #16481 -- Adapted one raw SQL query in cull implementation of the database-based cache backend so it works with Oracle. Backport of r16635 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.3.X@17805 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent fd2efb35
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -132,7 +132,13 @@ class DatabaseCache(BaseDatabaseCache):
            cursor.execute("SELECT COUNT(*) FROM %s" % table)
            num = cursor.fetchone()[0]
            if num > self._max_entries:
                cursor.execute("SELECT cache_key FROM %s ORDER BY cache_key LIMIT 1 OFFSET %%s" % table, [num / self._cull_frequency])
                cull_num = num / self._cull_frequency
                if connections[db].vendor == 'oracle':
                    # Special case for Oracle because it doesn't support LIMIT + OFFSET
                    cursor.execute("SELECT cache_key FROM (SELECT ROW_NUMBER() OVER (ORDER BY cache_key) AS counter, cache_key FROM %s) WHERE counter > %%s AND COUNTER <= %%s" % table, [cull_num, cull_num + 1])
		else:
                    # This isn't standard SQL, it's likely to break with some non officially supported databases             
                    cursor.execute("SELECT cache_key FROM %s ORDER BY cache_key LIMIT 1 OFFSET %%s" % table, [cull_num])
                cursor.execute("DELETE FROM %s WHERE cache_key < %%s" % table, [cursor.fetchone()[0]])

    def clear(self):