aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJannis Leidel2013-03-02 14:09:30 +0100
committerJannis Leidel2013-03-02 14:09:30 +0100
commit0844c8b24527486d43f8ab18241ce0b7f900129b (patch)
treed9db1cd777ee7b122665b5358c0b1d24d30f93a7
parent42d7dde77e1c2daffaa5fa5bd16184f52c413c20 (diff)
parent54f4f3a7361ae711641b511df5a4c8962ad623a4 (diff)
downloaddjango-debug-toolbar-0844c8b24527486d43f8ab18241ce0b7f900129b.tar.bz2
Merge branch 'issue_230' of git://github.com/akaariai/django-debug-toolbar into akaariai-issue_230
Conflicts: debug_toolbar/utils/tracking/db.py
-rw-r--r--debug_toolbar/utils/tracking/db.py20
-rw-r--r--runtests.py5
-rw-r--r--test_pgsql.py28
-rw-r--r--tests/tests.py15
4 files changed, 64 insertions, 4 deletions
diff --git a/debug_toolbar/utils/tracking/db.py b/debug_toolbar/utils/tracking/db.py
index b675227..0ff3359 100644
--- a/debug_toolbar/utils/tracking/db.py
+++ b/debug_toolbar/utils/tracking/db.py
@@ -102,6 +102,14 @@ class NormalCursorWrapper(object):
try:
return self.cursor.execute(sql, params)
finally:
+ # FIXME: Sometimes connections which are not in the connections
+ # dict are used (for example in test database destroying).
+ # The code below (at least get_transaction_id(alias) needs to have
+ # the connection in the connections dict. It would be good to
+ # not have this requirement at all, but for now lets just skip
+ # these connections.
+ if self.db.alias not in connections:
+ return
stop = datetime.now()
duration = ms_from_timedelta(stop - start)
enable_stacktraces = getattr(settings,
@@ -131,7 +139,7 @@ class NormalCursorWrapper(object):
del cur_frame
alias = getattr(self.db, 'alias', 'default')
- conn = connections[alias].connection
+ conn = self.db.connection
# HACK: avoid imports
if conn:
engine = conn.__class__.__module__.split('.', 1)[0]
@@ -158,11 +166,17 @@ class NormalCursorWrapper(object):
}
if engine == 'psycopg2':
- from psycopg2.extensions import TRANSACTION_STATUS_INERROR
+ # If an erroneous query was ran on the connection, it might
+ # be in a state where checking isolation_level raises an
+ # exception.
+ try:
+ iso_level = conn.isolation_level
+ except conn.InternalError:
+ iso_level = 'unknown'
params.update({
'trans_id': self.logger.get_transaction_id(alias),
'trans_status': conn.get_transaction_status(),
- 'iso_level': conn.isolation_level if not conn.get_transaction_status() == TRANSACTION_STATUS_INERROR else "",
+ 'iso_level': iso_level,
'encoding': conn.encoding,
})
diff --git a/runtests.py b/runtests.py
index 3432f8b..ed49824 100644
--- a/runtests.py
+++ b/runtests.py
@@ -1,11 +1,14 @@
#!/usr/bin/env python
import sys
+import os
from os.path import dirname, abspath
from optparse import OptionParser
from django.conf import settings, global_settings
-if not settings.configured:
+# For convenience configure settings if they are not pre-configured or if we
+# haven't been provided settings to use by environment variable.
+if not settings.configured and not os.environ.get('DJANGO_SETTINGS_MODULE'):
settings.configure(
DATABASES={
'default': {
diff --git a/test_pgsql.py b/test_pgsql.py
new file mode 100644
index 0000000..28c0178
--- /dev/null
+++ b/test_pgsql.py
@@ -0,0 +1,28 @@
+from django.conf import global_settings
+DATABASES={
+ 'default': {
+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
+ # Edit the below settings before use...
+ 'USER': '',
+ 'NAME': '',
+ 'HOST': '',
+ 'PASSWORD': '',
+ }
+}
+INSTALLED_APPS=[
+ 'django.contrib.auth',
+ 'django.contrib.admin',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+
+ 'debug_toolbar',
+
+ 'tests',
+]
+MIDDLEWARE_CLASSES=global_settings.MIDDLEWARE_CLASSES + (
+ 'debug_toolbar.middleware.DebugToolbarMiddleware',
+)
+ROOT_URLCONF=''
+DEBUG=False
+SITE_ID=1
diff --git a/tests/tests.py b/tests/tests.py
index ea2938d..a3618bf 100644
--- a/tests/tests.py
+++ b/tests/tests.py
@@ -2,9 +2,11 @@ import thread
from django.conf import settings
from django.contrib.auth.models import User
+from django.db import connection
from django.http import HttpResponse
from django.test import TestCase, RequestFactory
from django.template import Template, Context
+from django.utils import unittest
from debug_toolbar.middleware import DebugToolbarMiddleware
from debug_toolbar.panels.sql import SQLDebugPanel
@@ -214,6 +216,19 @@ class SQLPanelTestCase(BaseTestCase):
# ensure the stacktrace is populated
self.assertTrue(len(query[1]['stacktrace']) > 0)
+ @unittest.skipUnless(connection.vendor=='postgresql',
+ 'Test valid only on PostgreSQL')
+ def test_erroneous_query(self):
+ """
+ Test that an error in the query isn't swallowed by the middleware.
+ """
+ from django.db import connection
+ from django.db.utils import DatabaseError
+ try:
+ connection.cursor().execute("erroneous query")
+ except DatabaseError as e:
+ self.assertTrue('erroneous query' in str(e))
+
def test_disable_stacktraces(self):
panel = self.toolbar.get_panel(SQLDebugPanel)
self.assertEquals(len(panel._queries), 0)