]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
some cascade tweaks
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 14 Jul 2006 23:58:44 +0000 (23:58 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 14 Jul 2006 23:58:44 +0000 (23:58 +0000)
CHANGES
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/orm/session.py
lib/sqlalchemy/orm/unitofwork.py
lib/sqlalchemy/orm/util.py

diff --git a/CHANGES b/CHANGES
index 7fbbe6e0151cfba7fa96be6c39cd5a5aacdefa0a..f3f074472d291b2fb891660ae0acad3fae04b1f3 100644 (file)
--- 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
index beccb16afae2db9b97761f780b81ed46a26cf299..253410dabfd763699298cd1e51f7c3a1c22104a9 100644 (file)
@@ -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():
index 6988f81cc2d327f8e1372970b42d68709781e4da..2b5d5068e8728292e4bb4bf3a59b0a049b5a43e9 100644 (file)
@@ -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):
         """
index cda99a902784ba7e43caf64056ad5e77d03513a0..128442686f7f35f1b7d85bb45c296bf097d65285 100644 (file)
@@ -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)
index 10f7b4e808d542aa2cd7ea0e6e2ee70ccd23771a..570e501309d7e6ff6070de3e296ceafaa9b47121 100644 (file)
@@ -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)