except:
rec.checkin()
raise
- fairy = _ConnectionFairy(dbapi_connection, rec)
+ echo = pool._should_log_debug()
+ fairy = _ConnectionFairy(dbapi_connection, rec, echo)
rec.fairy_ref = weakref.ref(
fairy,
lambda ref: _finalize_fairy and
_finalize_fairy(
dbapi_connection,
- rec, pool, ref, pool._echo)
+ rec, pool, ref, echo)
)
_refs.add(rec)
- if pool._echo:
+ if echo:
pool.logger.debug("Connection %r checked out from pool",
dbapi_connection)
return fairy
connection)
try:
- fairy = fairy or _ConnectionFairy(connection, connection_record)
+ fairy = fairy or _ConnectionFairy(
+ connection, connection_record, echo)
assert fairy.connection is connection
- fairy._reset(pool, echo)
+ fairy._reset(pool)
# Immediately close detached instances
if not connection_record:
"""
- def __init__(self, dbapi_connection, connection_record):
+ def __init__(self, dbapi_connection, connection_record, echo):
self.connection = dbapi_connection
self._connection_record = connection_record
+ self._echo = echo
connection = None
"""A reference to the actual DBAPI connection being tracked."""
fairy._pool = pool
fairy._counter = 0
- fairy._echo = pool._should_log_debug()
if threadconns is not None:
threadconns.current = weakref.ref(fairy)
_close = _checkin
- def _reset(self, pool, echo):
+ def _reset(self, pool):
if pool.dispatch.reset:
pool.dispatch.reset(self, self._connection_record)
if pool._reset_on_return is reset_rollback:
- if echo:
+ if self._echo:
pool.logger.debug("Connection %s rollback-on-return%s",
self.connection,
", via agent"
else:
pool._dialect.do_rollback(self)
elif pool._reset_on_return is reset_commit:
- if echo:
+ if self._echo:
pool.logger.debug("Connection %s commit-on-return%s",
self.connection,
", via agent"
from sqlalchemy.testing import engines
import logging.handlers
from sqlalchemy.testing import fixtures
+from sqlalchemy.testing import mock
+from sqlalchemy.testing.util import lazy_gc
class LogParamsTest(fixtures.TestBase):
self.buf = logging.handlers.BufferingHandler(100)
for log in [
logging.getLogger('sqlalchemy.engine'),
- logging.getLogger('sqlalchemy.pool')
]:
log.addHandler(self.buf)
self.eng.execute("drop table foo")
for log in [
logging.getLogger('sqlalchemy.engine'),
- logging.getLogger('sqlalchemy.pool')
]:
log.removeHandler(self.buf)
)
+class PoolLoggingTest(fixtures.TestBase):
+ def setup(self):
+ self.existing_level = logging.getLogger("sqlalchemy.pool").level
+
+ self.buf = logging.handlers.BufferingHandler(100)
+ for log in [
+ logging.getLogger('sqlalchemy.pool')
+ ]:
+ log.addHandler(self.buf)
+
+ def teardown(self):
+ for log in [
+ logging.getLogger('sqlalchemy.pool')
+ ]:
+ log.removeHandler(self.buf)
+ logging.getLogger("sqlalchemy.pool").setLevel(self.existing_level)
+
+ def _queuepool_echo_fixture(self):
+ return tsa.pool.QueuePool(creator=mock.Mock(), echo='debug')
+
+ def _queuepool_logging_fixture(self):
+ logging.getLogger("sqlalchemy.pool").setLevel(logging.DEBUG)
+ return tsa.pool.QueuePool(creator=mock.Mock())
+
+ def _stpool_echo_fixture(self):
+ return tsa.pool.SingletonThreadPool(creator=mock.Mock(), echo='debug')
+
+ def _stpool_logging_fixture(self):
+ logging.getLogger("sqlalchemy.pool").setLevel(logging.DEBUG)
+ return tsa.pool.SingletonThreadPool(creator=mock.Mock())
+
+ def _test_queuepool(self, q, dispose=True):
+ conn = q.connect()
+ conn.close()
+ conn = None
+
+ conn = q.connect()
+ conn.close()
+ conn = None
+
+ conn = q.connect()
+ conn = None
+ del conn
+ lazy_gc()
+ q.dispose()
+
+ eq_(
+ [buf.msg for buf in self.buf.buffer],
+ [
+ 'Created new connection %r',
+ 'Connection %r checked out from pool',
+ 'Connection %r being returned to pool',
+ 'Connection %s rollback-on-return%s',
+ 'Connection %r checked out from pool',
+ 'Connection %r being returned to pool',
+ 'Connection %s rollback-on-return%s',
+ 'Connection %r checked out from pool',
+ 'Connection %r being returned to pool',
+ 'Connection %s rollback-on-return%s',
+ 'Closing connection %r',
+
+ ] + (['Pool disposed. %s'] if dispose else [])
+ )
+
+ def test_stpool_echo(self):
+ q = self._stpool_echo_fixture()
+ self._test_queuepool(q, False)
+
+ def test_stpool_logging(self):
+ q = self._stpool_logging_fixture()
+ self._test_queuepool(q, False)
+
+ def test_queuepool_echo(self):
+ q = self._queuepool_echo_fixture()
+ self._test_queuepool(q)
+
+ def test_queuepool_logging(self):
+ q = self._queuepool_logging_fixture()
+ self._test_queuepool(q)
+
+
class LoggingNameTest(fixtures.TestBase):
__requires__ = 'ad_hoc_engines',