]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- added "refresh-expire" cascade [ticket:492]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 24 Feb 2007 21:58:38 +0000 (21:58 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 24 Feb 2007 21:58:38 +0000 (21:58 +0000)
CHANGES
lib/sqlalchemy/orm/session.py
lib/sqlalchemy/orm/util.py
test/orm/mapper.py

diff --git a/CHANGES b/CHANGES
index 2024e3a63e378689ae9e7a6590711c71f3d46cfb..440d91a4eedf873542c7704aed98cde3c1ed9e34 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,7 @@
       worked anyway), but also query.selectfirst(), query.selectone() which
       will be used as is (i.e. no query is compiled). works similarly to
       sending the results to instances().
+    - added "refresh-expire" cascade [ticket:492]
 0.3.5
 - sql:
     - the value of "case_sensitive" defaults to True now, regardless of the
index 4935b04819f79479f6df0ac17f0f608cc5b106be..231be29b8babd5aa531a4073eca618a49b5d3e6f 100644 (file)
@@ -264,12 +264,16 @@ class Session(object):
         an attribute is next accessed, the session will reload all attributes on the instance
         from the database.
         """
+        for c in [obj] + list(_object_mapper(obj).cascade_iterator('refresh-expire', obj)):
+            self._expire_impl(c)
+            
+    def _expire_impl(self, obj):
         self._validate_persistent(obj)
         def exp():
             if self.query(obj.__class__)._get(obj._instance_key, reload=True) is None:
                 raise exceptions.InvalidRequestError("Could not refresh instance '%s'" % repr(obj))
         attribute_manager.trigger_history(obj, exp)
-
+        
     def is_expired(self, obj, unexpire=False):
         """return True if the given object has been marked as expired."""
         ret = attribute_manager.has_trigger(obj)
index 293ec03770d84277d031b62d5feb25d13b41b34a..9de58ce3101c29ac7e0b439055048ee957d6194d 100644 (file)
@@ -16,8 +16,7 @@ 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
-        # refresh_expire not really implemented as of yet
-        #self.refresh_expire = "refresh-expire" in values or "all" in values
+        self.refresh_expire = "refresh-expire" in values or "all" in values
         
         for x in values:
             if x not in all_cascades:
@@ -26,7 +25,7 @@ class CascadeOptions(object):
     def __contains__(self, item):
         return getattr(self, item.replace("-", "_"), False)
     def __repr__(self):
-        return "CascadeOptions(arg=%s)" % repr(",".join([x for x in ['delete', 'save_update', 'merge', 'expunge', 'delete_orphan'] if getattr(self, x, False) is True]))
+        return "CascadeOptions(arg=%s)" % repr(",".join([x for x in ['delete', 'save_update', 'merge', 'expunge', 'delete_orphan', 'refresh-expire'] if getattr(self, x, False) is True]))
 
 def polymorphic_union(table_map, typecolname, aliasname='p_union'):
     """create a UNION statement used by a polymorphic mapper.
index 414aaf378b0c2269ea41cac6133f3a56065d3d89..d8c23e103a2f71c0ee7bdd38a747b56d5ae12ffc 100644 (file)
@@ -114,6 +114,14 @@ class MapperTest(MapperSuperTest):
         self.assert_(u.user_name == 'jack')
         self.assert_(a not in u.addresses)
     
+    def testexpirecascade(self):
+        mapper(User, users, properties={'addresses':relation(mapper(Address, addresses), cascade="all, refresh-expire")})
+        s = create_session()
+        u = s.get(User, 8)
+        u.addresses[0].email_address = 'someotheraddress'
+        s.expire(u)
+        assert u.addresses[0].email_address == 'ed@wood.com'
+        
     def testrefreshwitheager(self):
         """test that a refresh/expire operation loads rows properly and sends correct "isnew" state to eager loaders"""
         mapper(User, users, properties={'addresses':relation(mapper(Address, addresses), lazy=False)})