summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/dependency.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-03-18 20:59:52 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-03-18 20:59:52 +0000
commit13475937e4cdbd1ffaa98d2c426dd118f7edd74f (patch)
tree9cb56906825195e8f9f43806078e3bb6cd09d1b5 /lib/sqlalchemy/orm/dependency.py
parentb9a67d1458ad4a307e9f25625731c8e85c2f2daf (diff)
downloadsqlalchemy-13475937e4cdbd1ffaa98d2c426dd118f7edd74f.tar.gz
- fixed/added coverage for various cascade scenarios
- added coverage for some extra cases in dynamic relations - removed some unused methods from unitofwork
Diffstat (limited to 'lib/sqlalchemy/orm/dependency.py')
-rw-r--r--lib/sqlalchemy/orm/dependency.py35
1 files changed, 21 insertions, 14 deletions
diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py
index 8b41d93dd..425b171df 100644
--- a/lib/sqlalchemy/orm/dependency.py
+++ b/lib/sqlalchemy/orm/dependency.py
@@ -217,16 +217,21 @@ class OneToManyDP(DependencyProcessor):
if delete:
# head object is being deleted, and we manage its list of child objects
# the child objects have to have their foreign key to the parent set to NULL
- if not self.post_update and not self.cascade.delete and not self.passive_deletes=='all':
+ if not self.post_update:
+ should_null_fks = not self.cascade.delete and not self.passive_deletes=='all'
for state in deplist:
(added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes)
if unchanged or deleted:
for child in deleted:
if child is not None and self.hasparent(child) is False:
- uowcommit.register_object(child)
- for child in unchanged:
- if child is not None:
- uowcommit.register_object(child)
+ if self.cascade.delete_orphan:
+ uowcommit.register_object(child, isdelete=True)
+ else:
+ uowcommit.register_object(child)
+ if should_null_fks:
+ for child in unchanged:
+ if child is not None:
+ uowcommit.register_object(child)
else:
for state in deplist:
(added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=True)
@@ -249,8 +254,6 @@ class OneToManyDP(DependencyProcessor):
uowcommit.register_object(child)
def _synchronize(self, state, child, associationrow, clearkeys, uowcommit):
- if child is not None:
- child = getattr(child, '_state', child)
source = state
dest = child
if dest is None or (not self.post_update and uowcommit.is_deleted(dest)):
@@ -338,15 +341,19 @@ class ManyToOneDP(DependencyProcessor):
if self.post_update:
return
if delete:
- if self.cascade.delete:
+ if self.cascade.delete or self.cascade.delete_orphan:
for state in deplist:
(added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes)
- if deleted or unchanged:
- for child in deleted + unchanged:
- if child is not None and self.hasparent(child) is False:
- uowcommit.register_object(child, isdelete=True)
- for c, m in self.mapper.cascade_iterator('delete', child):
- uowcommit.register_object(c._state, isdelete=True)
+ if self.cascade.delete_orphan:
+ todelete = added + unchanged + deleted
+ else:
+ todelete = added + unchanged
+ for child in todelete:
+ if child is None:
+ continue
+ uowcommit.register_object(child, isdelete=True)
+ for c, m in self.mapper.cascade_iterator('delete', child):
+ uowcommit.register_object(c._state, isdelete=True)
else:
for state in deplist:
uowcommit.register_object(state)