From: Mike Bayer Date: Tue, 14 Jan 2014 02:20:54 +0000 (-0500) Subject: - _cursor_execute() will close the cursor on error; oracle doesn't allow double close X-Git-Tag: rel_0_9_2~60 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=52b25c5319b982486348069e2d9edd5259be03d3;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - _cursor_execute() will close the cursor on error; oracle doesn't allow double close - ensure no iterator changed size issues in testing.engines --- diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index bcb9960b12..c1c012d33e 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -240,20 +240,20 @@ class DefaultDialect(interfaces.Dialect): parameters = {} def check_unicode(test): - cursor = connection.connection.cursor() + statement = cast_to(expression.select([test]).compile(dialect=self)) try: - try: - statement = cast_to(expression.select([test]).compile(dialect=self)) - connection._cursor_execute(cursor, statement, parameters) - row = cursor.fetchone() - - return isinstance(row[0], util.text_type) - except exc.DBAPIError as de: - util.warn("Exception attempting to " - "detect unicode returns: %r" % de) - return False - finally: + cursor = connection.connection.cursor() + connection._cursor_execute(cursor, statement, parameters) + row = cursor.fetchone() cursor.close() + except exc.DBAPIError as de: + # note that _cursor_execute() will have closed the cursor + # if an exception is thrown. + util.warn("Exception attempting to " + "detect unicode returns: %r" % de) + return False + else: + return isinstance(row[0], util.text_type) tests = [ # detect plain VARCHAR diff --git a/lib/sqlalchemy/testing/engines.py b/lib/sqlalchemy/testing/engines.py index a74bffe26b..d85771f8a0 100644 --- a/lib/sqlalchemy/testing/engines.py +++ b/lib/sqlalchemy/testing/engines.py @@ -61,7 +61,7 @@ class ConnectionKiller(object): # is collecting in finalize_fairy, deadlock. # not sure if this should be if pypy/jython only. # note that firebird/fdb definitely needs this though - for conn, rec in self.conns: + for conn, rec in list(self.conns): self._safe(conn.rollback) def _stop_test_ctx(self): @@ -81,7 +81,7 @@ class ConnectionKiller(object): def _stop_test_ctx_aggressive(self): self.close_all() - for conn, rec in self.conns: + for conn, rec in list(self.conns): self._safe(conn.close) rec.connection = None