From 01b5d65a1da80f3cc6120e53bba46e4da2ff44ca Mon Sep 17 00:00:00 2001 From: Tomasz Buchert Date: Mon, 26 Sep 2011 00:03:47 +0200 Subject: Issue 187: queries are captured and not executed when template panel is rendered. --- debug_toolbar/utils/tracking/db.py | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'debug_toolbar/utils') diff --git a/debug_toolbar/utils/tracking/db.py b/debug_toolbar/utils/tracking/db.py index 7ffacef..1fa7b36 100644 --- a/debug_toolbar/utils/tracking/db.py +++ b/debug_toolbar/utils/tracking/db.py @@ -2,6 +2,7 @@ import inspect import sys from datetime import datetime +from threading import local from django.conf import settings from django.template import Node @@ -16,7 +17,39 @@ from debug_toolbar.utils.compat.db import connections SQL_WARNING_THRESHOLD = getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}) \ .get('SQL_WARNING_THRESHOLD', 500) -class CursorWrapper(object): +class SQLQueryTriggered(Exception): + """Thrown when template panel triggers a query""" + pass + +class ThreadLocalState(local): + def __init__(self): + self.enabled = True + + @property + def Wrapper(self): + return NormalCursorWrapper if self.enabled else ExceptionCursorWrapper + + def recording(self, v): + self.enabled = v + +state = ThreadLocalState() +recording = state.recording # export function + +def CursorWrapper(*args, **kwds): # behave like a class + return state.Wrapper(*args, **kwds) + +class ExceptionCursorWrapper(object): + """ + Wraps a cursor and raises an exception on any operation. + Used in Templates panel. + """ + def __init__(self, cursor, db, logger): + pass + + def __getattr__(self, attr): + raise SQLQueryTriggered() + +class NormalCursorWrapper(object): """ Wraps a cursor and logs queries. """ @@ -103,4 +136,4 @@ class CursorWrapper(object): return getattr(self.cursor, attr) def __iter__(self): - return iter(self.cursor) \ No newline at end of file + return iter(self.cursor) -- cgit v1.2.3