aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debug_toolbar/templates/debug_toolbar/panels/sql_profile.html51
-rw-r--r--debug_toolbar/views.py23
2 files changed, 44 insertions, 30 deletions
diff --git a/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html b/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html
index 7df65da..0dcb0b9 100644
--- a/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html
+++ b/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html
@@ -4,28 +4,35 @@
<h3>SQL Profiled</h3>
</div>
<div class="djDebugPanelContent">
- <dl>
- <dt>{% trans "Executed SQL" %}</dt>
- <dd><pre>{{ sql|safe }}</pre></dd>
- <dt>{% trans "Time" %}</dt>
- <dd>{{ time }} ms</dd>
- </dl>
- <table>
- <thead>
- <tr>
- {% for h in headers %}
- <th>{{ h|upper }}</th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- {% for row in result %}
- <tr class="{% cycle 'djDebugOdd' 'djDebugEven' %}">
- {% for column in row %}
- <td>{{ column|escape }}</td>
+ {% if result %}
+ <dl>
+ <dt>{% trans "Executed SQL" %}</dt>
+ <dd><pre>{{ sql|safe }}</pre></dd>
+ <dt>{% trans "Time" %}</dt>
+ <dd>{{ time }} ms</dd>
+ </dl>
+ <table>
+ <thead>
+ <tr>
+ {% for h in headers %}
+ <th>{{ h|upper }}</th>
{% endfor %}
</tr>
- {% endfor %}
- </tbody>
- </table>
+ </thead>
+ <tbody>
+ {% for row in result %}
+ <tr class="{% cycle 'djDebugOdd' 'djDebugEven' %}">
+ {% for column in row %}
+ <td>{{ column|escape }}</td>
+ {% endfor %}
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ {% else %}
+ <dl>
+ <dt>{% trans 'Error' %}</dt>
+ <dd>{{ result_error }}</dd>
+ </dl>
+ {% endif %}
</div>
diff --git a/debug_toolbar/views.py b/debug_toolbar/views.py
index 9123a00..255a49c 100644
--- a/debug_toolbar/views.py
+++ b/debug_toolbar/views.py
@@ -109,21 +109,28 @@ def sql_profile(request):
if sql.lower().strip().startswith('select'):
params = simplejson.loads(params)
cursor = connection.cursor()
- cursor.execute("SET PROFILING=1") # Enable profiling
- cursor.execute(sql, params) # Execute SELECT
- cursor.execute("SET PROFILING=0") # Disable profiling
- # The Query ID should always be 1 here but I'll subselect to get the last one just in case...
- cursor.execute("SELECT * FROM information_schema.profiling WHERE query_id=(SELECT query_id FROM information_schema.profiling ORDER BY query_id DESC LIMIT 1)")
- headers = [d[0] for d in cursor.description]
- result = cursor.fetchall()
+ result = None
+ headers = None
+ result_error = None
+ try:
+ cursor.execute("SET PROFILING=1") # Enable profiling
+ cursor.execute(sql, params) # Execute SELECT
+ cursor.execute("SET PROFILING=0") # Disable profiling
+ # The Query ID should always be 1 here but I'll subselect to get the last one just in case...
+ cursor.execute("SELECT * FROM information_schema.profiling WHERE query_id=(SELECT query_id FROM information_schema.profiling ORDER BY query_id DESC LIMIT 1)")
+ headers = [d[0] for d in cursor.description]
+ result = cursor.fetchall()
+ except:
+ result_error = "Profiling is either not available or not supported by your database."
cursor.close()
context = {
'result': result,
+ 'result_error': result_error,
'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)),
'time': request.GET.get('time', 0.0),
'headers': headers,
}
- return render_to_response('debug_toolbar/panels/sql_explain.html', context)
+ return render_to_response('debug_toolbar/panels/sql_profile.html', context)
raise InvalidSQLError("Only 'select' queries are allowed.")
def template_source(request):