aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/panels/sql.py
diff options
context:
space:
mode:
Diffstat (limited to 'debug_toolbar/panels/sql.py')
-rw-r--r--debug_toolbar/panels/sql.py39
1 files changed, 34 insertions, 5 deletions
diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py
index 7396c3a..d3ac7f3 100644
--- a/debug_toolbar/panels/sql.py
+++ b/debug_toolbar/panels/sql.py
@@ -1,5 +1,8 @@
+import os
+import SocketServer
import time
-from debug_toolbar.panels import DebugPanel
+import traceback
+import django
from django.conf import settings
from django.db import connection
from django.db.backends import util
@@ -7,6 +10,28 @@ from django.template.loader import render_to_string
from django.utils import simplejson
from django.utils.encoding import force_unicode
from django.utils.hashcompat import sha_constructor
+from debug_toolbar.panels import DebugPanel
+
+# Figure out some paths
+django_path = os.path.realpath(os.path.dirname(django.__file__))
+socketserver_path = os.path.realpath(os.path.dirname(SocketServer.__file__))
+
+def tidy_stacktrace(strace):
+ """
+ Clean up stacktrace and remove all entries that:
+ 1. Are part of Django (except contrib apps)
+ 2. Are part of SocketServer (used by Django's dev server)
+ 3. Are the last entry (which is part of our stacktracing code)
+ """
+ trace = []
+ for s in strace[:-1]:
+ s_path = os.path.realpath(s[0])
+ if django_path in s_path and not 'django/contrib' in s_path:
+ continue
+ if socketserver_path in s_path:
+ continue
+ trace.append((s[0], s[1], s[2], s[3]))
+ return trace
class DatabaseStatTracker(util.CursorDebugWrapper):
"""
@@ -19,6 +44,7 @@ class DatabaseStatTracker(util.CursorDebugWrapper):
return self.cursor.execute(sql, params)
finally:
stop = time.time()
+ stacktrace = tidy_stacktrace(traceback.extract_stack())
_params = ''
try:
_params = simplejson.dumps([force_unicode(x) for x in params])
@@ -31,6 +57,7 @@ class DatabaseStatTracker(util.CursorDebugWrapper):
'raw_sql': sql,
'params': _params,
'hash': sha_constructor(settings.SECRET_KEY + sql + _params).hexdigest(),
+ 'stacktrace': stacktrace,
})
util.CursorDebugWrapper = DatabaseStatTracker
@@ -71,13 +98,15 @@ class SQLDebugPanel(DebugPanel):
return render_to_string('debug_toolbar/panels/sql.html', context)
def reformat_sql(sql):
- sql = sql.replace('`,`', '`, `')
+ sql = sql.replace(',', ', ')
sql = sql.replace('SELECT ', 'SELECT\n\t')
- sql = sql.replace('` FROM ', '`\nFROM\n\t')
+ sql = sql.replace(' FROM ', '\nFROM\n\t')
sql = sql.replace(' WHERE ', '\nWHERE\n\t')
- sql = sql.replace(' INNER JOIN ', '\nINNER JOIN\n\t')
- sql = sql.replace(' LEFT OUTER JOIN ', '\nLEFT OUTER JOIN\n\t')
+ sql = sql.replace(' INNER JOIN', '\n\tINNER JOIN')
+ sql = sql.replace(' LEFT OUTER JOIN' , '\n\tLEFT OUTER JOIN')
sql = sql.replace(' ORDER BY ', '\nORDER BY\n\t')
+ sql = sql.replace(' HAVING ', '\nHAVING\n\t')
+ sql = sql.replace(' GROUP BY ', '\nGROUP BY\n\t')
# Use Pygments to highlight SQL if it's available
try:
from pygments import highlight