SQLEngines are constructed via the create_engine() function inside this package.
"""
- def __init__(self, pool=None, echo=False, logger=None, default_ordering=False, **params):
+ def __init__(self, pool=None, echo=False, logger=None, default_ordering=False, echo_pool=False, echo_uow=False, **params):
"""constructs a new SQLEngine. SQLEngines should be constructed via the create_engine()
function which will construct the appropriate subclass of SQLEngine."""
# get a handle on the connection pool via the connect arguments
# by direct usage of pool.manager(<module>).connect(*args, **params)
(cargs, cparams) = self.connect_args()
if pool is None:
+ params['echo'] = echo_pool
self._pool = sqlalchemy.pool.manage(self.dbapi(), **params).get_pool(*cargs, **cparams)
else:
self._pool = pool
self.default_ordering=default_ordering
self.echo = echo
+ self.echo_uow = echo_uow
self.context = util.ThreadLocal(raiseerror=False)
self.tables = {}
- self.notes = {}
self._figure_paramstyle()
if logger is None:
self.logger = sys.stdout
else:
self.logger = logger
-
+
def dispose(self):
"""disposes of the underlying pool manager for this SQLEngine."""
(cargs, cparams) = self.connect_args()
__all__ = ['get_id_key', 'get_row_key', 'commit', 'update', 'clear', 'delete',
'begin', 'has_key', 'has_instance', 'UnitOfWork']
-LOG = 1
+LOG = False
def get_id_key(ident, class_, table):
"""returns an identity-map key for use in storing/retrieving an item from the identity
for mapper in commit_context.mappers:
for e in mapper.engines:
engines.append(e)
-
+
+ echo_commit = False
for e in engines:
+ echo_commit = echo_commit or e.echo_uow
e.begin()
try:
- commit_context.execute()
+ commit_context.execute(echo=echo_commit)
except:
for e in engines:
e.rollback()
def register_deleted_object(self, obj):
self.deleted_objects.append(obj)
- def execute(self):
+ def execute(self, echo=False):
for task in self.tasks.values():
task.mapper.register_dependencies(self)
head = self._sort_dependencies()
- if LOG:
+ if LOG or echo:
print "Task dump:\n" + head.dump()
if head is not None:
head.execute(self)
def _repr_task(task):
if task.mapper is not None:
if task.mapper.__class__.__name__ == 'Mapper':
- name = task.mapper.class_.__name__ + "/" + task.mapper.primarytable.name
+ name = task.mapper.class_.__name__ + "/" + task.mapper.primarytable.id
else:
name = repr(task.mapper)
else:
agent = ConnectionFairy(self)
self._threadconns[thread.get_ident()] = agent
return agent
-
+
+ def return_conn(self, conn):
+ if self._echo:
+ self.log("return connection to pool")
+ self.do_return_conn(conn)
+
def get(self):
+ if self._echo:
+ self.log("get connection from pool")
+ self.log(self.status())
+ return self.do_get()
+
+ def do_get(self):
raise NotImplementedError()
- def return_conn(self, conn):
+ def do_return_conn(self, conn):
+ raise NotImplementedError()
+
+ def status(self):
raise NotImplementedError()
def log(self, msg):
Pool.__init__(self, **params)
self._conns = {}
self._creator = creator
-
- def return_conn(self, conn):
+
+ def status(self):
+ return "SingletonThreadPool size: %d" % len(self._conns)
+
+ def do_return_conn(self, conn):
pass
- def get(self):
+ def do_get(self):
try:
return self._conns[thread.get_ident()]
except KeyError:
self._overflow = 0 - pool_size
self._max_overflow = max_overflow
- def return_conn(self, conn):
+ def do_return_conn(self, conn):
if self._echo:
self.log("return connection to pool")
try:
except Queue.Full:
self._overflow -= 1
- def get(self):
+ def do_get(self):
if self._echo:
self.log("get connection from pool")
self.log(self.status())