From 9a95a39b49a2fadb3e1674d083d7c3da2fd886a8 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 11 Jul 2013 15:15:09 -0400 Subject: Dialect.initialize() is not called a second time if an :class:`.Engine` is recreated, due to a disconnect error. This fixes a particular issue in the Oracle 8 dialect, but in general the dialect.initialize() phase should only be once per dialect. [ticket:2776] --- test/engine/test_reconnect.py | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'test') diff --git a/test/engine/test_reconnect.py b/test/engine/test_reconnect.py index dee2fd216..1936cec08 100644 --- a/test/engine/test_reconnect.py +++ b/test/engine/test_reconnect.py @@ -348,6 +348,28 @@ class MockReconnectTest(fixtures.TestBase): list, result ) + def test_dialect_initialize_once(self): + from sqlalchemy.engine.base import Engine + from sqlalchemy.engine.url import URL + from sqlalchemy.engine.default import DefaultDialect + from sqlalchemy.pool import QueuePool + dbapi = self.dbapi + + mock_dialect = Mock() + class MyURL(URL): + def get_dialect(self): + return Dialect + class Dialect(DefaultDialect): + initialize = Mock() + + engine = create_engine(MyURL("foo://"), module=dbapi) + c1 = engine.connect() + engine.dispose() + c2 = engine.connect() + eq_(Dialect.initialize.call_count, 1) + + + class CursorErrTest(fixtures.TestBase): def setup(self): @@ -493,9 +515,15 @@ class RealReconnectTest(fixtures.TestBase): # raises a DBAPIError, not an AttributeError assert_raises(exc.DBAPIError, engine.connect) - # dispose connections so we get a new one on - # next go - engine.dispose() + @testing.skip_if( + [lambda: util.py3k, "oracle+cx_oracle"], + "Crashes on py3k+cx_oracle") + def test_explode_in_initializer_disconnect(self): + engine = engines.testing_engine() + def broken_initialize(connection): + connection.execute("select fake_stuff from _fake_table") + + engine.dialect.initialize = broken_initialize p1 = engine.pool -- cgit v1.2.1