From 46fa536ba4c2542bcac41346bb113a08ebcf342c Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 27 Feb 2010 00:44:26 +0000 Subject: - threadlocal engine wasn't properly closing the connection upon close() - fixed that. - Transaction object doesn't rollback or commit if it isn't "active", allows more accurate nesting of begin/rollback/commit. - Added basic support for mxODBC [ticket:1710]. - Python unicode objects as binds result in the Unicode type, not string, thus eliminating a certain class of unicode errors on drivers that don't support unicode binds. --- lib/sqlalchemy/engine/base.py | 14 +++++++++----- lib/sqlalchemy/engine/threadlocal.py | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'lib/sqlalchemy/engine') diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index ff475ee3d..578bd58d7 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -1287,8 +1287,8 @@ class Transaction(object): def rollback(self): if not self._parent.is_active: return - self.is_active = False self._do_rollback() + self.is_active = False def _do_rollback(self): self._parent.rollback() @@ -1318,10 +1318,12 @@ class RootTransaction(Transaction): self.connection._begin_impl() def _do_rollback(self): - self.connection._rollback_impl() + if self.is_active: + self.connection._rollback_impl() def _do_commit(self): - self.connection._commit_impl() + if self.is_active: + self.connection._commit_impl() class NestedTransaction(Transaction): @@ -1330,10 +1332,12 @@ class NestedTransaction(Transaction): self._savepoint = self.connection._savepoint_impl() def _do_rollback(self): - self.connection._rollback_to_savepoint_impl(self._savepoint, self._parent) + if self.is_active: + self.connection._rollback_to_savepoint_impl(self._savepoint, self._parent) def _do_commit(self): - self.connection._release_savepoint_impl(self._savepoint, self._parent) + if self.is_active: + self.connection._release_savepoint_impl(self._savepoint, self._parent) class TwoPhaseTransaction(Transaction): diff --git a/lib/sqlalchemy/engine/threadlocal.py b/lib/sqlalchemy/engine/threadlocal.py index a9892ae7e..001caee2a 100644 --- a/lib/sqlalchemy/engine/threadlocal.py +++ b/lib/sqlalchemy/engine/threadlocal.py @@ -94,6 +94,8 @@ class TLEngine(base.Engine): def close(self): if not self.closed: self.contextual_connect().close() + connection = self._connections.conn() + connection._force_close() del self._connections.conn self._connections.trans = [] -- cgit v1.2.1