diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-10-24 22:19:31 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-10-24 22:19:31 +0000 |
| commit | b7d1d6deab0716ac49b5cb25656f3ce895b6775a (patch) | |
| tree | 86c9524920fcb2c3f1b51f1ccaec66e0eb67d560 /lib/sqlalchemy | |
| parent | 6e565f723149965911d899a753aaf35b07273071 (diff) | |
| download | sqlalchemy-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.py | 1 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/properties.py | 11 | ||||
| -rw-r--r-- | lib/sqlalchemy/pool.py | 8 |
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 |
