From 9793d1b56745c0e13439602f8098e9dcdddf33cd Mon Sep 17 00:00:00 2001 From: Jason Kirtland Date: Fri, 17 Aug 2007 15:01:20 +0000 Subject: [PATCH] - session transaction closing tweak for threadlocal - connection-rollback decorator only fires on unhandled testing exceptions --- lib/sqlalchemy/orm/session.py | 2 ++ test/orm/session.py | 21 +++++++++++++++++++-- test/testlib/engines.py | 7 ++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 6263a2e525..109c468fc8 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -241,7 +241,9 @@ class SessionTransaction(object): return for t in util.Set(self.__connections.values()): if t[2]: + # fixme: wrong- # closing the connection will also issue a rollback() + t[1].rollback() t[0].close() self.session.transaction = None diff --git a/test/orm/session.py b/test/orm/session.py index 337acd51da..6a8e9dfe50 100644 --- a/test/orm/session.py +++ b/test/orm/session.py @@ -79,6 +79,7 @@ class SessionTest(AssertMixin): # then see if expunge fails session.expunge(u) + @engines.rollback_open_connections def test_binds_from_expression(self): """test that Session can extract Table objects from ClauseElements and match them to tables.""" Session = sessionmaker(binds={users:testbase.db, addresses:testbase.db}) @@ -93,9 +94,10 @@ class SessionTest(AssertMixin): Session = sessionmaker(binds={User:testbase.db, Address:testbase.db}) sess.execute(users.insert(), params=dict(user_id=2, user_name='fred')) assert sess.execute(users.select()).fetchall() == [(1, 'ed'), (2, 'fred')] - + sess.close() @testing.unsupported('sqlite', 'mssql') # TEMP: test causes mssql to hang + @engines.rollback_open_connections def test_transaction(self): class User(object):pass mapper(User, users) @@ -111,8 +113,10 @@ class SessionTest(AssertMixin): sess.commit() assert conn1.execute("select count(1) from users").scalar() == 1 assert testbase.db.connect().execute("select count(1) from users").scalar() == 1 + sess.close() @testing.unsupported('sqlite', 'mssql') # TEMP: test causes mssql to hang + @engines.rollback_open_connections def test_autoflush(self): class User(object):pass mapper(User, users) @@ -130,8 +134,10 @@ class SessionTest(AssertMixin): sess.commit() assert conn1.execute("select count(1) from users").scalar() == 1 assert testbase.db.connect().execute("select count(1) from users").scalar() == 1 + sess.close() @testing.unsupported('sqlite', 'mssql') # TEMP: test causes mssql to hang + @engines.rollback_open_connections def test_autoflush_unbound(self): class User(object):pass mapper(User, users) @@ -148,10 +154,12 @@ class SessionTest(AssertMixin): sess.commit() assert sess.execute("select count(1) from users", mapper=User).scalar() == 1 assert testbase.db.connect().execute("select count(1) from users").scalar() == 1 + sess.close() except: sess.rollback() raise + @engines.rollback_open_connections def test_autoflush_2(self): class User(object):pass mapper(User, users) @@ -165,6 +173,7 @@ class SessionTest(AssertMixin): sess.commit() assert conn1.execute("select count(1) from users").scalar() == 1 assert testbase.db.connect().execute("select count(1) from users").scalar() == 1 + sess.commit() # TODO: not doing rollback of attributes right now. def dont_test_autoflush_rollback(self): @@ -189,6 +198,7 @@ class SessionTest(AssertMixin): assert newad not in u.addresses + @engines.rollback_open_connections def test_external_joined_transaction(self): class User(object):pass mapper(User, users) @@ -202,8 +212,10 @@ class SessionTest(AssertMixin): sess.commit() # commit does nothing trans.rollback() # rolls back assert len(sess.query(User).select()) == 0 + sess.close() @testing.supported('postgres', 'mysql') + @engines.rollback_open_connections def test_external_nested_transaction(self): class User(object):pass mapper(User, users) @@ -263,6 +275,7 @@ class SessionTest(AssertMixin): sess.commit() # commit does nothing sess.rollback() # rolls back assert len(sess.query(User).select()) == 0 + sess.close() @testing.supported('postgres', 'mysql') @testing.exclude('mysql', '<', (5, 0, 3)) @@ -286,6 +299,7 @@ class SessionTest(AssertMixin): sess.commit() assert len(sess.query(User).select()) == 1 + sess.close() @testing.supported('postgres', 'mysql') @testing.exclude('mysql', '<', (5, 0, 3)) @@ -302,12 +316,14 @@ class SessionTest(AssertMixin): u2 = User() sess.save(u2) sess.flush() - + sess.rollback() sess.commit() assert len(sess.query(User).select()) == 1 + sess.close() + @engines.rollback_open_connections def test_bound_connection(self): class User(object):pass mapper(User, users) @@ -340,6 +356,7 @@ class SessionTest(AssertMixin): transaction.rollback() assert len(sess.query(User).select()) == 0 + sess.close() def test_update(self): """test that the update() method functions and doesnet blow away changes""" diff --git a/test/testlib/engines.py b/test/testlib/engines.py index a66b336e94..414d262dea 100644 --- a/test/testlib/engines.py +++ b/test/testlib/engines.py @@ -21,12 +21,12 @@ class ConnectionKiller(object): except Exception, e: # fixme sys.stderr.write("\n" + str(e) + "\n") - del self.record_refs[:] def rollback_all(self): self._apply_all(('rollback',)) + def close_all(self): - self._apply_all(('rollback','close')) + self._apply_all(('rollback', 'close')) testing_reaper = ConnectionKiller() @@ -36,8 +36,9 @@ def rollback_open_connections(fn): def decorated(*args, **kw): try: fn(*args, **kw) - finally: + except: testing_reaper.rollback_all() + raise decorated.__name__ = fn.__name__ return decorated -- 2.47.3