aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/utils/tracking/db.py
diff options
context:
space:
mode:
Diffstat (limited to 'debug_toolbar/utils/tracking/db.py')
-rw-r--r--debug_toolbar/utils/tracking/db.py37
1 files changed, 35 insertions, 2 deletions
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)