head = self._sort_dependencies()
head.execute(self)
-# sorted = self._sort_dependencies()
-# for task in sorted:
-# task.execute(self, False)
-# sorted.reverse()
-# for task in sorted:
-# task.execute(self, True)
def post_exec(self):
"""after an execute/commit is completed, all of the objects and lists that have
def _sort_dependencies(self):
bymapper = {}
- def sort(node, isdel, res):
- #print "Sort: " + (node and str(node.item) or 'None')
- if node is None:
- return res
- task = bymapper.get((node.item, isdel), None)
- if task is not None:
- res.append(task)
- if node.circular:
- task.iscircular = True
- for child in node.children:
- sort(child, isdel, res)
- return res
-
def sort_hier(node):
- #print "Sort: " + (node and str(node.item) or 'None')
if node is None:
return None
task = bymapper.get(node.item, None)
for task in self.tasks.values():
mappers.append(task.mapper)
bymapper[task.mapper] = task
- #bymapper[(task.mapper, task.isdelete)] = task
head = util.DependencySorter(self.dependencies, mappers).sort()
- #res = []
- #tasklist = sort(head, False, res)
task = sort_hier(head)
-
-# res = []
-# sort(head, True, res)
-# res.reverse()
-# tasklist += res
-
-# assert(len(self.tasks.values()) == len(tasklist)) # "sorted task list not the same size as original task list"
-
return task
-# return tasklist
class UOWTask(object):
- def __init__(self, mapper, isdelete = False):
+ def __init__(self, mapper):
self.mapper = mapper
- self.isdelete = isdelete
self.objects = util.OrderedDict()
self.dependencies = []
self.iscircular = False
rec['childtask'] = childtask
if isdelete:
rec['isdelete'] = True
- print "Task " + str(self) + " append object " + obj.__class__.__name__ + "/" + repr(id(obj)) + " listonly " + repr(listonly) + "/" + repr(self.objects[obj]['listonly'])
+ #print "Task " + str(self) + " append object " + obj.__class__.__name__ + "/" + repr(id(obj)) + " listonly " + repr(listonly) + "/" + repr(self.objects[obj]['listonly'])
def execute(self, trans, isdelete = False):
"""executes this UOWTask. saves objects to be saved, processes all dependencies
task.execute(trans)
return
- print "execute " + str(self)
saved_obj_list = self.saved_objects()
deleted_obj_list = self.deleted_objects()
self.mapper.save_obj(saved_obj_list, trans)
for dep in self.dependencies:
(processor, targettask) = dep
- processor.process_dependencies(targettask, targettask.saved_objects(), trans, delete = False)
- for obj in saved_obj_list:
+ processor.process_dependencies(targettask, targettask.saved_objects(includelistonly=True), trans, delete = False)
+ for obj in self.saved_objects(includelistonly=True):
childtask = self.objects[obj].get('childtask', None)
if childtask is not None:
childtask.execute(trans)
- for child in self.childtasks:
- child.execute(trans)
for dep in self.dependencies:
(processor, targettask) = dep
- processor.process_dependencies(targettask, targettask.deleted_objects(), trans, delete = True)
- for obj in deleted_obj_list:
+ processor.process_dependencies(targettask, targettask.deleted_objects(includelistonly=True), trans, delete = True)
+ for child in self.childtasks:
+ child.execute(trans)
+ for obj in self.deleted_objects(includelistonly=True):
childtask = self.objects[obj].get('childtask', None)
if childtask is not None:
childtask.execute(trans)
self.mapper.delete_obj(deleted_obj_list, trans)
- def saved_objects(self):
- return [o for o, rec in self.objects.iteritems() if not rec['listonly'] and not rec['isdelete']]
- def deleted_objects(self):
- return [o for o, rec in self.objects.iteritems() if not rec['listonly'] and rec['isdelete']]
+ def saved_objects(self, includelistonly=False):
+ if not includelistonly:
+ return [o for o, rec in self.objects.iteritems() if not rec['listonly'] and not rec['isdelete']]
+ else:
+ return [o for o, rec in self.objects.iteritems() if not rec['isdelete']]
+ def deleted_objects(self, includelistonly=False):
+ if not includelistonly:
+ return [o for o, rec in self.objects.iteritems() if not rec['listonly'] and rec['isdelete']]
+ else:
+ return [o for o, rec in self.objects.iteritems() if rec['isdelete']]
def _sort_circular_dependencies(self, trans):
"""for a single task, creates a hierarchical tree of "subtasks" which associate
try:
return objecttotask[obj]
except KeyError:
- t = UOWTask(self.mapper, self.isdelete)
+ t = UOWTask(self.mapper)
objecttotask[obj] = t
return t
try:
l = dp[processor]
except KeyError:
- l = UOWTask(None, None)
+ l = UOWTask(None)
dp[processor] = l
return l
mapperstr = self.mapper.primarytable.name
else:
mapperstr = "(no mapper)"
- if self.isdelete:
- return mapperstr + "/deletes/" + repr(id(self))
- else:
- return mapperstr + "/saves/" + repr(id(self))
+ return mapperstr
uow = util.ScopedRegistry(lambda: UnitOfWork(), "thread")