summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-10-24 22:19:31 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-10-24 22:19:31 +0000
commitb7d1d6deab0716ac49b5cb25656f3ce895b6775a (patch)
tree86c9524920fcb2c3f1b51f1ccaec66e0eb67d560 /lib/sqlalchemy
parent6e565f723149965911d899a753aaf35b07273071 (diff)
downloadsqlalchemy-b7d1d6deab0716ac49b5cb25656f3ce895b6775a.tar.gz
- SingletonConnectionPool must use the "threadlocal" pooling behavior
- the "delete" cascade will load in all child objects, if they were not loaded already. this can be turned off (i.e. the old behavior) by setting passive_deletes=True on a relation().
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/dependency.py1
-rw-r--r--lib/sqlalchemy/orm/properties.py11
-rw-r--r--lib/sqlalchemy/pool.py8
3 files changed, 16 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py
index 8bf5a489d..0e74a3873 100644
--- a/lib/sqlalchemy/orm/dependency.py
+++ b/lib/sqlalchemy/orm/dependency.py
@@ -36,6 +36,7 @@ class DependencyProcessor(object):
self.is_backref = prop.is_backref
self.post_update = prop.post_update
self.foreignkey = prop.foreignkey
+ self.passive_deletes = prop.passive_deletes
self.key = prop.key
self._compile_synchronizers()
diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py
index 501903983..a810e7e96 100644
--- a/lib/sqlalchemy/orm/properties.py
+++ b/lib/sqlalchemy/orm/properties.py
@@ -72,7 +72,7 @@ mapper.ColumnProperty = ColumnProperty
class PropertyLoader(StrategizedProperty):
"""describes an object property that holds a single item or list of items that correspond
to a related database table."""
- def __init__(self, argument, secondary, primaryjoin, secondaryjoin, foreignkey=None, uselist=None, private=False, association=None, order_by=False, attributeext=None, backref=None, is_backref=False, post_update=False, cascade=None, viewonly=False, lazy=True, collection_class=None):
+ def __init__(self, argument, secondary, primaryjoin, secondaryjoin, foreignkey=None, uselist=None, private=False, association=None, order_by=False, attributeext=None, backref=None, is_backref=False, post_update=False, cascade=None, viewonly=False, lazy=True, collection_class=None, passive_deletes=False):
self.uselist = uselist
self.argument = argument
self.secondary = secondary
@@ -84,7 +84,8 @@ class PropertyLoader(StrategizedProperty):
self.lazy = lazy
self.foreignkey = util.to_set(foreignkey)
self.collection_class = collection_class
-
+ self.passive_deletes = passive_deletes
+
if cascade is not None:
self.cascade = mapperutil.CascadeOptions(cascade)
else:
@@ -124,7 +125,8 @@ class PropertyLoader(StrategizedProperty):
def cascade_iterator(self, type, object, recursive):
if not type in self.cascade:
return
- childlist = sessionlib.attribute_manager.get_history(object, self.key, passive=True)
+ passive = type != 'delete' or self.passive_deletes
+ childlist = sessionlib.attribute_manager.get_history(object, self.key, passive=passive)
if childlist is None:
return
mapper = self.mapper.primary_mapper()
@@ -140,7 +142,8 @@ class PropertyLoader(StrategizedProperty):
return
mapper = self.mapper.primary_mapper()
- for c in sessionlib.attribute_manager.get_as_list(object, self.key, passive=True):
+ passive = type != 'delete' or self.passive_deletes
+ for c in sessionlib.attribute_manager.get_as_list(object, self.key, passive=passive):
if c is not None and c not in recursive:
recursive.add(c)
callable_(c, mapper.entity_name)
diff --git a/lib/sqlalchemy/pool.py b/lib/sqlalchemy/pool.py
index 79fc22927..cd58c1031 100644
--- a/lib/sqlalchemy/pool.py
+++ b/lib/sqlalchemy/pool.py
@@ -26,6 +26,8 @@ except:
proxies = {}
+ERROR_ON_RETURN = False
+
def manage(module, **params):
"""given a DBAPI2 module and pool management parameters, returns a proxy for the module
that will automatically pool connections, creating new connection pools for each
@@ -244,6 +246,11 @@ class _ConnectionFairy(object):
# damn mysql -- (todo look for NotSupportedError)
pass
if self._connection_record is not None:
+ global ERROR_ON_RETURN
+ if ERROR_ON_RETURN:
+ ERROR_ON_RETURN=False
+ raise "hi"
+
if self.__pool.echo:
self.__pool.log("Connection %s being returned to pool" % repr(self.connection))
self.__pool.return_conn(self)
@@ -273,6 +280,7 @@ class SingletonThreadPool(Pool):
pool_size=5 - the number of threads in which to maintain connections at once."""
def __init__(self, creator, pool_size=5, **params):
+ params['use_threadlocal'] = True
Pool.__init__(self, creator, **params)
self._conns = {}
self.size = pool_size