# HG changeset patch # User Sylvain Thénault # Date 1267637541 -3600 # Node ID 430b89aed9965be99a3796b2a2c54bc97ffd37df # Parent 74b8e39d482573b88cb50cd90e5cd11ee262c71f delete pyro proxy on connection close, properly raise programming error when working on a closed connection diff -r 74b8e39d4825 -r 430b89aed996 dbapi.py --- a/dbapi.py Wed Mar 03 18:31:08 2010 +0100 +++ b/dbapi.py Wed Mar 03 18:32:21 2010 +0100 @@ -398,14 +398,20 @@ def check(self): """raise `BadSessionId` if the connection is no more valid""" + if self._closed is not None: + raise ProgrammingError('Closed connection') self._repo.check_session(self.sessionid) def set_session_props(self, **props): """raise `BadSessionId` if the connection is no more valid""" + if self._closed is not None: + raise ProgrammingError('Closed connection') self._repo.set_session_props(self.sessionid, props) def get_shared_data(self, key, default=None, pop=False): """return value associated to `key` in shared data""" + if self._closed is not None: + raise ProgrammingError('Closed connection') return self._repo.get_shared_data(self.sessionid, key, default, pop) def set_shared_data(self, key, value, querydata=False): @@ -416,6 +422,8 @@ transaction, and won't be available through the connexion, only on the repository side. """ + if self._closed is not None: + raise ProgrammingError('Closed connection') return self._repo.set_shared_data(self.sessionid, key, value, querydata) def get_schema(self): @@ -501,6 +509,8 @@ def user(self, req=None, props=None): """return the User object associated to this connection""" # cnx validity is checked by the call to .user_info + if self._closed is not None: + raise ProgrammingError('Closed connection') eid, login, groups, properties = self._repo.user_info(self.sessionid, props) if req is None: @@ -521,6 +531,8 @@ pass def describe(self, eid): + if self._closed is not None: + raise ProgrammingError('Closed connection') return self._repo.describe(self.sessionid, eid) def close(self): @@ -535,6 +547,7 @@ if self._closed: raise ProgrammingError('Connection is already closed') self._repo.close(self.sessionid) + del self._repo # necessary for proper garbage collection self._closed = 1 def commit(self): diff -r 74b8e39d4825 -r 430b89aed996 test/unittest_dbapi.py --- a/test/unittest_dbapi.py Wed Mar 03 18:31:08 2010 +0100 +++ b/test/unittest_dbapi.py Wed Mar 03 18:32:21 2010 +0100 @@ -35,8 +35,8 @@ self.assertEquals(cnx.user(None).login, 'anon') self.assertEquals(cnx.describe(1), (u'CWGroup', u'system', None)) self.restore_connection() # proper way to close cnx - self.assertRaises(ConnectionError, cnx.user, None) - self.assertRaises(ConnectionError, cnx.describe, 1) + self.assertRaises(ProgrammingError, cnx.user, None) + self.assertRaises(ProgrammingError, cnx.describe, 1) def test_session_data_api(self): cnx = self.login('anon') @@ -64,9 +64,9 @@ cnx.set_shared_data('data', 4) self.assertEquals(cnx.get_shared_data('data'), 4) self.restore_connection() # proper way to close cnx - self.assertRaises(ConnectionError, cnx.check) - self.assertRaises(ConnectionError, cnx.set_shared_data, 'data', 0) - self.assertRaises(ConnectionError, cnx.get_shared_data, 'data') + self.assertRaises(ProgrammingError, cnx.check) + self.assertRaises(ProgrammingError, cnx.set_shared_data, 'data', 0) + self.assertRaises(ProgrammingError, cnx.get_shared_data, 'data') if __name__ == '__main__': from logilab.common.testlib import unittest_main