From eed944dbb93e0ebf8038ae190d4cbbe9ea849a11 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 7 Sep 2006 23:04:13 +0000 Subject: [PATCH] fixup to printing of uow --- lib/sqlalchemy/orm/unitofwork.py | 6 +- lib/sqlalchemy/orm/uowdumper.py | 200 ++++++++++--------------------- 2 files changed, 64 insertions(+), 142 deletions(-) diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index 17c77785a6..2dac05b1a6 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -577,9 +577,11 @@ class UOWExecutor(object): def execute_per_element_childtasks(self, trans, task, isdelete): for polytask in task.polymorphic_tasks(): for element in polytask.tosave_elements + polytask.todelete_elements: - for child in element.childtasks: - self.execute(trans, child, isdelete) + self.execute_element_childtasks(trans, element, isdelete) + def execute_element_childtasks(self, trans, element, isdelete): + for child in element.childtasks: + self.execute(trans, child, isdelete) class UOWTask(object): """represents the full list of objects that are to be saved/deleted by a specific Mapper.""" diff --git a/lib/sqlalchemy/orm/uowdumper.py b/lib/sqlalchemy/orm/uowdumper.py index f49c35d7f0..e08965ce1c 100644 --- a/lib/sqlalchemy/orm/uowdumper.py +++ b/lib/sqlalchemy/orm/uowdumper.py @@ -9,45 +9,55 @@ class UOWDumper(unitofwork.UOWExecutor): self.task = task self.buf = buf self.starttask = task - #self.execute(None, task) - self._dump(task) - - # execute stuff is UNDER CONSTRUCTION + self.headers = {} + self.execute(None, task) def execute(self, trans, task, isdelete=None): oldstarttask = self.starttask + oldheaders = self.headers self.starttask = task + self.headers = {} try: i = self._indent() if len(i): - i = i[0:-1] + "-" + i += "-" + #i = i[0:-1] + "-" if task.circular is not None: self.buf.write(self._indent() + "\n") self.buf.write(i + " " + self._repr_task(task)) - self.buf.write("->circular->" + self._repr_task(task.circular)) + self.buf.write(" (contains cyclical sub-tasks)") else: self.buf.write(self._indent() + "\n") self.buf.write(i + " " + self._repr_task(task)) - self.buf.write("\n") + self.buf.write(" (" + (isdelete and "delete " or "save/update ") + "phase) \n") + self.indent += 1 super(UOWDumper, self).execute(trans, task, isdelete) finally: + self.indent -= 1 + if self.starttask.is_empty(): + self.buf.write(self._indent() + " |- (empty task)\n") + else: + self.buf.write(self._indent() + " |----\n") + + self.buf.write(self._indent() + "\n") self.starttask = oldstarttask + self.headers = oldheaders def save_objects(self, trans, task): for rec in task.tosave_elements: if rec.listonly: continue - if self.verbose: - header(self.buf, self._indent() + " |- Save elements"+ self._inheritance_tag(task) + "\n") - self.buf.write(self._indent() + " |- " + self._repr_task_element(rec) + "\n") - + self.header("Save elements"+ self._inheritance_tag(task)) + self.buf.write(self._indent() + "- " + self._repr_task_element(rec) + "\n") + self.closeheader() + def delete_objects(self, trans, task): for rec in task.todelete_elements: if rec.listonly: continue - if self.verbose: - header(self.buf, self._indent() + " |- Delete elements"+ self._inheritance_tag(task) + "\n") - self.buf.write(self._indent() + " |- " + self._repr_task_element(rec) + "\n") + self.header("Delete elements"+ self._inheritance_tag(task)) + self.buf.write(self._indent() + "- " + self._repr_task_element(rec) + "\n") + self.closeheader() def _inheritance_tag(self, task): if not self.verbose: @@ -57,9 +67,23 @@ class UOWDumper(unitofwork.UOWExecutor): else: return "" + def header(self, text): + """write a given header just once""" + if not self.verbose: + return + try: + self.headers[text] + except KeyError: + self.buf.write(self._indent() + "- " + text + "\n") + self.headers[text] = True + + def closeheader(self): + if not self.verbose: + return + self.buf.write(self._indent() + "- ------\n") + def execute_dependency(self, transaction, dep, isdelete): - #self.buf.write() - pass + self._dump_processor(dep, isdelete) def execute_save_steps(self, trans, task): super(UOWDumper, self).execute_save_steps(trans, task) @@ -71,13 +95,22 @@ class UOWDumper(unitofwork.UOWExecutor): super(UOWDumper, self).execute_dependencies(trans, task, isdelete) def execute_childtasks(self, trans, task, isdelete=None): + self.header("Child tasks" + self._inheritance_tag(task)) super(UOWDumper, self).execute_childtasks(trans, task, isdelete) - + self.closeheader() + def execute_cyclical_dependencies(self, trans, task, isdelete): + self.header("Cyclical %s dependencies" % (isdelete and "delete" or "save")) super(UOWDumper, self).execute_cyclical_dependencies(trans, task, isdelete) - + self.closeheader() + def execute_per_element_childtasks(self, trans, task, isdelete): super(UOWDumper, self).execute_per_element_childtasks(trans, task, isdelete) + + def execute_element_childtasks(self, trans, element, isdelete): + self.header("%s subelements of UOWTaskElement(%s)" % ((isdelete and "Delete" or "Save"), id(element))) + super(UOWDumper, self).execute_element_childtasks(trans, element, isdelete) + self.closeheader() def _dump_processor(self, proc, deletes): if deletes: @@ -86,14 +119,14 @@ class UOWDumper(unitofwork.UOWExecutor): val = proc.targettask.polymorphic_tosave_elements if self.verbose: - self.buf.write(self._indent() + " |- %s attribute on %s (UOWDependencyProcessor(%d) processing %s)\n" % ( + self.buf.write(self._indent() + " |- %s attribute on %s (UOWDependencyProcessor(%d) processing %s)\n" % ( repr(proc.processor.key), ("%s's to be %s" % (self._repr_task_class(proc.targettask), deletes and "deleted" or "saved")), id(proc), self._repr_task(proc.targettask)) ) elif False: - self.buf.write(self._indent() + " |- %s attribute on %s\n" % ( + self.buf.write(self._indent() + " |- %s attribute on %s\n" % ( repr(proc.processor.key), ("%s's to be %s" % (self._repr_task_class(proc.targettask), deletes and "deleted" or "saved")), ) @@ -101,9 +134,9 @@ class UOWDumper(unitofwork.UOWExecutor): if len(val) == 0: if self.verbose: - self.buf.write(self._indent() + " | |-" + "(no objects)\n") + self.buf.write(self._indent() + " |- " + "(no objects)\n") for v in val: - self.buf.write(self._indent() + " | |-" + self._repr_task_element(v, proc.processor.key, process=True) + "\n") + self.buf.write(self._indent() + " |- " + self._repr_task_element(v, proc.processor.key, process=True) + "\n") def _repr_task_element(self, te, attribute=None, process=False): if te.obj is None: @@ -128,7 +161,10 @@ class UOWDumper(unitofwork.UOWExecutor): name = repr(task.mapper) else: name = '(none)' - return ("UOWTask(%d, %s)" % (id(task), name)) + if task.circular_parent: + return ("UOWTask(%d->%d, %s)" % (id(task.circular_parent), id(task), name)) + else: + return ("UOWTask(%d, %s)" % (id(task), name)) def _repr_task_class(self, task): if task.mapper is not None and task.mapper.__class__.__name__ == 'Mapper': @@ -140,121 +176,5 @@ class UOWDumper(unitofwork.UOWExecutor): return "%s(%d)" % (obj.__class__.__name__, id(obj)) def _indent(self): - return " | " * self.indent - - def _dump(self, starttask, indent=None, circularparent=None): - try: - oldindent = self.indent - if indent is not None: - self.indent = indent - self._dump_impl(starttask, circularparent=circularparent) - finally: - self.indent = oldindent - - def _dump_impl(self, starttask, circularparent=None): - - headers = {} - def header(buf, text): - """writes a given header just once""" - try: - headers[text] - except KeyError: - self.buf.write(self._indent() + " |\n") - self.buf.write(text) - headers[text] = True - - def _inheritance_tag(task): - if not self.verbose: - return "" - elif task is not starttask: - return (" (inheriting task %s)" % self._repr_task(task)) - else: - return "" - - def _dump_saveelements(task): - for ptask in task.polymorphic_tasks(): - for rec in ptask.tosave_elements: - if rec.listonly: - continue - if self.verbose: - header(self.buf, self._indent() + " |- Save elements"+ _inheritance_tag(task) + "\n") - self.buf.write(self._indent() + " |- " + self._repr_task_element(rec) + "\n") - - def _dump_deleteelements(task): - for ptask in task.polymorphic_tasks(): - for rec in ptask.todelete_elements: - if rec.listonly: - continue - if self.verbose: - header(self.buf, self._indent() + " |- Delete elements"+ _inheritance_tag(ptask) + "\n") - self.buf.write(self._indent() + " |- " + self._repr_task_element(rec) + "\n") - - def _dump_dependencies(task): - alltasks = list(task.polymorphic_tasks()) - for task in alltasks: - for dep in task.dependencies: - if self.verbose: - header(self.buf, self._indent() + " |- Save dependencies" + _inheritance_tag(task) + "\n") - self._dump_processor(dep, False) - alltasks.reverse() - for task in alltasks: - for dep in task.dependencies: - if self.verbose: - header(self.buf, self._indent() + " |- Delete dependencies" + _inheritance_tag(task) + "\n") - self._dump_processor(dep, True) - - def _dump_childtasks(task): - for ptask in task.polymorphic_tasks(): - for child in ptask.childtasks: - if self.verbose: - header(self.buf, self._indent() + " |- Child tasks" + _inheritance_tag(task) + "\n") - self._dump(child, indent = self.indent + 1) - - if starttask.circular is not None: - self._dump(starttask.circular, indent=self.indent, circularparent=starttask) - return - - - i = self._indent() - if len(i): - i = i[0:-1] + "-" - if circularparent is not None: - self.buf.write(self._indent() + "\n") - self.buf.write(i + " " + self._repr_task(circularparent)) - self.buf.write("->circular->" + self._repr_task(starttask)) - else: - self.buf.write(self._indent() + "\n") - self.buf.write(i + " " + self._repr_task(starttask)) - - self.buf.write("\n") - _dump_saveelements(starttask) - for dep in starttask.cyclical_dependencies: - if self.verbose: - header(self.buf, self._indent() + " |- Cyclical Save dependencies\n") - self._dump_processor(dep, False) - for element in starttask.tosave_elements: - for task in element.childtasks: - if self.verbose: - header(self.buf, self._indent() + " |- Save subelements of UOWTaskElement(%s)\n" % id(element)) - self._dump(task, indent = self.indent + 1) - _dump_dependencies(starttask) - for dep in starttask.cyclical_dependencies: - if self.verbose: - header(self.buf, self._indent() + " |- Cyclical Delete dependencies\n") - self._dump_processor(dep, True) - _dump_childtasks(starttask) - for element in starttask.todelete_elements: - for task in element.childtasks: - if self.verbose: - header(self.buf, self._indent() + " |- Delete subelements of UOWTaskElement(%s)\n" % id(element)) - self._dump(task, indent = self.indent + 1) - _dump_deleteelements(starttask) - - if starttask.is_empty(): - self.buf.write(self._indent() + " |- (empty task)\n") - else: - self.buf.write(self._indent() + " |----\n") - - self.buf.write(self._indent() + "\n") - + return " |" * self.indent -- 2.47.2