From: Mike Bayer Date: Fri, 14 Jul 2006 23:58:44 +0000 (+0000) Subject: some cascade tweaks X-Git-Tag: rel_0_2_6~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fbe71c17642f7beba705b28eab8ee22f801bc9a8;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git some cascade tweaks --- diff --git a/CHANGES b/CHANGES index 7fbbe6e015..f3f074472d 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,8 @@ mapping inner-class. Currently this does not support reflecting any relationships. - deferred column load could screw up the connection status in a flush() under some circumstances, this was fixed +- expunge() was not working with cascade, fixed. +- potential endless loop in cascading operations fixed. 0.2.5 - fixed endless loop bug in select_by(), if the traversal hit diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index beccb16afa..253410dabf 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -918,7 +918,7 @@ class Mapper(object): for prop in self.__props.values(): prop.register_dependencies(uowcommit, *args, **kwargs) - def cascade_iterator(self, type, object, callable_=None, recursive=None): + def cascade_iterator(self, type, object, recursive=None): if recursive is None: recursive=util.Set() for prop in self.__props.values(): diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 6988f81cc2..2b5d5068e8 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -264,9 +264,13 @@ class Session(object): self.uow.expire(self, object) def expunge(self, object): - """removes the given object from this Session. this will free all internal references to the object.""" - self.uow.expunge(object) - self._unattach(object) + """remove the given object from this Session. + + this will free all internal references to the object. cascading will be applied according to the + 'expunge' cascade rule.""" + for c in [object] + list(object_mapper(object).cascade_iterator('expunge', object)): + self.uow.expunge(c) + self._unattach(c) def save(self, object, entity_name=None): """ diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index cda99a9027..128442686f 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -101,9 +101,11 @@ class UnitOfWork(object): self.identity_map[key] = obj def refresh(self, sess, obj): + self._validate_obj(obj) sess.query(obj.__class__)._get(obj._instance_key, reload=True) def expire(self, sess, obj): + self._validate_obj(obj) def exp(): sess.query(obj.__class__)._get(obj._instance_key, reload=True) attribute_manager.trigger_history(obj, exp) diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py index 10f7b4e808..570e501309 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -16,7 +16,8 @@ class CascadeOptions(object): self.save_update = "save-update" in values or "all" in values self.merge = "merge" in values or "all" in values self.expunge = "expunge" in values or "all" in values - self.refresh_expire = "refresh-expire" in values or "all" in values + # refresh_expire not really implemented as of yet + #self.refresh_expire = "refresh-expire" in values or "all" in values def __contains__(self, item): return getattr(self, item.replace("-", "_"), False)