From 0556fd7b48c709b5ff803eff01e0dd7eb07ba3fc Mon Sep 17 00:00:00 2001 From: David Cramer Date: Wed, 6 Apr 2011 16:29:33 -0700 Subject: Generate fake transaction ids so we can match up transaction end state correctly --- debug_toolbar/panels/sql.py | 46 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) (limited to 'debug_toolbar/panels/sql.py') diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index 9f4e83c..0c36f48 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -1,4 +1,5 @@ import re +import uuid from django.db.backends import BaseDatabaseWrapper from django.template.loader import render_to_string @@ -71,22 +72,30 @@ class SQLDebugPanel(DebugPanel): self._queries = [] self._databases = {} self._transaction_status = {} + self._transaction_ids = {} - def get_transaction_status(self, alias, reset=False): + def get_transaction_id(self, alias): conn = connections[alias].connection if not conn: return None engine = conn.__class__.__module__.split('.', 1)[0] + if engine == 'psycopg2': + cur_status = conn.get_transaction_status() + else: + raise ValueError(engine) + + last_status = self._transaction_status.get(alias) + self._transaction_status[alias] = cur_status + + if not cur_status: + # No available state + return None + + if cur_status != last_status: + self._transaction_ids[alias] = uuid.uuid4().hex - if reset or self._transaction_status.get(alias) is None: - if engine == 'psycopg2': - self._transaction_status[alias] = conn.get_transaction_status() - else: - raise ValueError(engine) - - return self._transaction_status[alias] - + return self._transaction_ids[alias] def record(self, alias, **kwargs): self._queries.append((alias, kwargs)) @@ -146,7 +155,22 @@ class SQLDebugPanel(DebugPanel): rgb[nn] = nc db['rgb_color'] = rgb + trans_ids = {} + trans_id = None + i = 0 for alias, query in self._queries: + trans_id = query.get('trans_id') + last_trans_id = trans_ids.get(alias) + + print trans_id, last_trans_id + if query['engine'] == 'psycopg2' and trans_id != last_trans_id: + if last_trans_id: + self._queries[i][1]['ends_trans'] = True + trans_ids[alias] = trans_id + query['starts_trans'] = True + if trans_id: + query['in_trans'] = True + query['alias'] = alias if 'iso_level' in query: query['iso_level'] = get_isolation_level_display(query['engine'], query['iso_level']) @@ -167,6 +191,10 @@ class SQLDebugPanel(DebugPanel): params = map(escape, frame[0].rsplit('/', 1) + list(frame[1:])) stacktrace.append('{0}/{1} in {3}({2})\n {4}"'.format(*params)) query['stacktrace'] = mark_safe('\n'.join(stacktrace)) + i += 1 + + if trans_id: + self._queries[i][1]['ends_trans'] = True context = self.context.copy() context.update({ -- cgit v1.2.3