diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-31 17:31:34 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-31 17:31:34 -0400 |
commit | 89afcfdda4d714ccc4e361e2fb32328f816d06c9 (patch) | |
tree | 10d3d3363b73c4986bdffa2e527b5c8b4893bb15 /lib/sqlalchemy/orm/unitofwork.py | |
parent | 15f4a6ef058f148045e5bd4b4ceb3fd38480f7bc (diff) | |
download | sqlalchemy-89afcfdda4d714ccc4e361e2fb32328f816d06c9.tar.gz |
beginning to address cycles but its not worked out yet
Diffstat (limited to 'lib/sqlalchemy/orm/unitofwork.py')
-rw-r--r-- | lib/sqlalchemy/orm/unitofwork.py | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index 6c53586e7..65d85a37b 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -166,16 +166,23 @@ class UOWTransaction(object): if not ret: break + self.cycles = cycles = topological.find_cycles(self.dependencies, self.postsort_actions.values()) + assert not cycles + for rec in cycles: + rec.per_state_flush_actions(self) + + for edge in list(self.dependencies): + # both nodes in this edge were part of a cycle. + # remove that from our deps as it has replaced + # itself with per-state actions + if cycles.issuperset(edge): + self.dependencies.remove(edge) + sort = topological.sort(self.dependencies, self.postsort_actions.values()) print sort for rec in sort: rec.execute(self) -# if cycles: -# break up actions into finer grained actions along those cycles - -# for rec in topological.sort(self.dependencies, self.actions): -# rec.execute() def finalize_flush_changes(self): """mark processed objects as clean / deleted after a successful flush(). @@ -276,6 +283,13 @@ class ProcessAll(PropertyRecMixin, PostSortRec): else: self.dependency_processor.process_saves(uow, states) + def per_state_flush_actions(self, uow): + for state in self._elements(uow): + if self.delete: + self.dependency_processor.per_deleted_state_flush_actions(uow, self.dependency_processor, state) + else: + self.dependency_processor.per_saved_state_flush_actions(uow, self.dependency_processor, state) + class SaveUpdateAll(PostSortRec): def __init__(self, uow, mapper): self.mapper = mapper @@ -285,6 +299,10 @@ class SaveUpdateAll(PostSortRec): uow.states_for_mapper_hierarchy(self.mapper, False, False), uow ) + + def per_state_flush_actions(self, uow): + for state in uow.states_for_mapper_hierarchy(self.mapper, False, False): + SaveUpdateState(uow, state) class DeleteAll(PostSortRec): def __init__(self, uow, mapper): @@ -296,6 +314,10 @@ class DeleteAll(PostSortRec): uow ) + def per_state_flush_actions(self, uow): + for state in uow.states_for_mapper_hierarchy(self.mapper, True, False): + DeleteState(uow, state) + class ProcessState(PostSortRec): def __init__(self, uow, dependency_processor, delete, state): self.dependency_processor = dependency_processor |