From 68e893d21af31edd2bbc6dec608c95457eaffde6 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 23 Sep 2006 20:18:41 +0000 Subject: - connection pool tracks open cursors and raises an error if connection is returned to pool with cursors still opened. fixes issues with MySQL, others --- lib/sqlalchemy/pool.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'lib/sqlalchemy/pool.py') diff --git a/lib/sqlalchemy/pool.py b/lib/sqlalchemy/pool.py index de987278d..9eb9cd2ff 100644 --- a/lib/sqlalchemy/pool.py +++ b/lib/sqlalchemy/pool.py @@ -168,6 +168,7 @@ class _ConnectionFairy(object): """proxies a DBAPI connection object and provides return-on-dereference support""" def __init__(self, pool): self._threadfairy = _ThreadFairy(self) + self.cursors = weakref.WeakKeyDictionary() self.__pool = pool self.__counter = 0 try: @@ -182,6 +183,7 @@ class _ConnectionFairy(object): def invalidate(self): self._connection_record.invalidate() self.connection = None + self.cursors = None self._close() def cursor(self, *args, **kwargs): try: @@ -196,6 +198,9 @@ class _ConnectionFairy(object): raise "this connection is closed" self.__counter +=1 return self + def close_open_cursors(self): + for c in list(self.cursors): + c.close() def close(self): self.__counter -=1 if self.__counter == 0: @@ -203,6 +208,8 @@ class _ConnectionFairy(object): def __del__(self): self._close() def _close(self): + if self.cursors is not None and len(self.cursors): + raise exceptions.InvalidRequestError("This connection still has %d open cursors" % len(self.cursors)) if self.connection is not None: try: self.connection.rollback() @@ -219,7 +226,12 @@ class _ConnectionFairy(object): class _CursorFairy(object): def __init__(self, parent, cursor): self.__parent = parent + self.__parent.cursors[self]=True self.cursor = cursor + def close(self): + if self in self.__parent.cursors: + del self.__parent.cursors[self] + self.cursor.close() def __getattr__(self, key): return getattr(self.cursor, key) -- cgit v1.2.1