aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/panels/sql/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'debug_toolbar/panels/sql/utils.py')
-rw-r--r--debug_toolbar/panels/sql/utils.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/debug_toolbar/panels/sql/utils.py b/debug_toolbar/panels/sql/utils.py
new file mode 100644
index 0000000..00728a3
--- /dev/null
+++ b/debug_toolbar/panels/sql/utils.py
@@ -0,0 +1,37 @@
+from __future__ import unicode_literals
+
+import re
+
+from django.utils.html import escape
+
+import sqlparse
+from sqlparse import tokens as T
+
+
+class BoldKeywordFilter:
+ """sqlparse filter to bold SQL keywords"""
+ def process(self, stack, stream):
+ """Process the token stream"""
+ for token_type, value in stream:
+ is_keyword = token_type in T.Keyword
+ if is_keyword:
+ yield T.Text, '<strong>'
+ yield token_type, escape(value)
+ if is_keyword:
+ yield T.Text, '</strong>'
+
+
+def reformat_sql(sql):
+ stack = sqlparse.engine.FilterStack()
+ stack.preprocess.append(BoldKeywordFilter()) # add our custom filter
+ stack.postprocess.append(sqlparse.filters.SerializerUnicode()) # tokens -> strings
+ return swap_fields(''.join(stack.run(sql)))
+
+
+def swap_fields(sql):
+ expr = r'SELECT</strong> (...........*?) <strong>FROM'
+ subs = (r'SELECT</strong> '
+ r'<a class="djDebugUncollapsed djDebugToggle" href="#">&#8226;&#8226;&#8226;</a> '
+ r'<a class="djDebugCollapsed djDebugToggle" href="#">\1</a> '
+ r'<strong>FROM')
+ return re.sub(expr, subs, sql)