diff options
Diffstat (limited to 'debug_toolbar/utils/tracking/db.py')
| -rw-r--r-- | debug_toolbar/utils/tracking/db.py | 37 | 
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)  | 
