From 222c61d36c1cf0c74ba3482ce118ae6a7b72a21b Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 15 Oct 2005 19:51:03 +0000 Subject: [PATCH] --- lib/sqlalchemy/engine.py | 1 - lib/sqlalchemy/mapper.py | 9 +++++---- lib/sqlalchemy/objectstore.py | 13 +++---------- test/objectstore.py | 18 ++++++++++++++++-- test/tables.py | 2 ++ test/testbase.py | 22 ++++++++++++++++++++++ 6 files changed, 48 insertions(+), 17 deletions(-) diff --git a/lib/sqlalchemy/engine.py b/lib/sqlalchemy/engine.py index 2f3e94de25..6e10ad90bd 100644 --- a/lib/sqlalchemy/engine.py +++ b/lib/sqlalchemy/engine.py @@ -187,7 +187,6 @@ class SQLEngine(schema.SchemaEngine): def execute(self, statement, parameters, connection = None, echo = None, typemap = None, **kwargs): if parameters is None: parameters = {} - if echo is True or self.echo: self.log(statement) self.log(repr(parameters)) diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index b7dedb90ae..8e068fb6f0 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -737,7 +737,7 @@ class PropertyLoader(MapperProperty): else: return uowcommit.uow.attributes.get_history(obj, self.key) - def whose_dependent_on_who(self, obj1, obj2, uowcommit): + def whose_dependent_on_who(self, obj1, obj2): if obj1 is obj2: return None elif self.thiscol.primary_key: @@ -746,7 +746,7 @@ class PropertyLoader(MapperProperty): return (obj2, obj1) def process_dependencies(self, task, deplist, uowcommit, delete = False): - print self.mapper.table.name + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) + #print self.mapper.table.name + " " + repr(len(deplist)) + " process_dep isdelete " + repr(delete) # fucntion to set properties across a parent/child object plus an "association row", # based on a join condition @@ -778,8 +778,9 @@ class PropertyLoader(MapperProperty): uowcommit.register_deleted_list(childlist) else: for obj in deplist: + print "obj: " + repr(obj) childlist = getlist(obj) - if childlist is None: return + if childlist is None: continue clearkeys = False for child in childlist.added_items(): associationrow = {} @@ -824,7 +825,7 @@ class PropertyLoader(MapperProperty): if self.direction == PropertyLoader.RIGHT: uowcommit.register_object(obj) childlist = getlist(obj) - if childlist is None: return + if childlist is None: continue uowcommit.register_saved_list(childlist) clearkeys = False for child in childlist.added_items(): diff --git a/lib/sqlalchemy/objectstore.py b/lib/sqlalchemy/objectstore.py index 972e82f531..3525e40b4b 100644 --- a/lib/sqlalchemy/objectstore.py +++ b/lib/sqlalchemy/objectstore.py @@ -404,13 +404,13 @@ class UOWTask(object): self.mapper.save_obj(self.tosave_objects(), trans) for dep in self.save_dependencies(): (processor, targettask, isdelete) = dep - processor.process_dependencies(targettask, targettask.tosave_objects(), trans, delete = False) + processor.process_dependencies(targettask, [elem.obj for elem in targettask.tosave_elements()], trans, delete = False) for element in self.tosave_elements(): if element.childtask is not None: element.childtask.execute(trans) for dep in self.delete_dependencies(): (processor, targettask, isdelete) = dep - processor.process_dependencies(targettask, targettask.todelete_objects(), trans, delete = True) + processor.process_dependencies(targettask, [elem.obj for elem in targettask.todelete_elements()], trans, delete = True) for child in self.childtasks: child.execute(trans) for element in self.todelete_elements(): @@ -463,7 +463,6 @@ class UOWTask(object): dp[(processor, isdelete)] = l return l - # TODO: rework, its putting too many things in places they shouldnt be for taskelement in self.objects.values(): # go through all of the dependencies on this task, and organize them # into a hash where we isolate individual objects that depend on each @@ -483,7 +482,7 @@ class UOWTask(object): for o in childlist: if not self.objects.has_key(o): continue - whosdep = processor.whose_dependent_on_who(obj, o, trans) + whosdep = processor.whose_dependent_on_who(obj, o) if whosdep is not None: tuples.append(whosdep) if whosdep[0] is obj: @@ -500,8 +499,6 @@ class UOWTask(object): def make_task_tree(node, parenttask): circ = objecttotask[node.item] - #if len(circ.objects) == 0 and len(circ.dependencies) == 0: - # circ = None parenttask.append(node.item, self.objects[node.item].listonly, circ, isdelete=self.objects[node.item].isdelete) if dependencies.has_key(node.item): for tup, deptask in dependencies[node.item].iteritems(): @@ -517,7 +514,6 @@ class UOWTask(object): return t def dump(self, indent=""): - # TODO: what a mess ! s = "\n" + indent + repr(self) if self.circular is not None: s += " Circular Representation:" @@ -557,7 +553,6 @@ class UOWTask(object): s = "" for dt in dep: s += "\n " + indent + "process " + repr(dt[0].key) + " on:" -# s += "\n " + indent + repr(dt[0].key) + "/" + (dt[2] and 'items to be deleted' or 'saved items') if dt[2]: val = [t for t in dt[1].objects.values() if t.isdelete] else: @@ -574,8 +569,6 @@ def mapper(*args, **params): def object_mapper(obj): return sqlalchemy.mapper.object_mapper(obj) - - uow = util.ScopedRegistry(lambda: UnitOfWork(), "thread") diff --git a/test/objectstore.py b/test/objectstore.py index b4b3178f18..a65a42f186 100644 --- a/test/objectstore.py +++ b/test/objectstore.py @@ -444,8 +444,22 @@ UPDATE email_addresses SET user_id=:user_id, email_address=:email_address WHERE k = Keyword() k.name = 'yellow' objects[5].keywords.append(k) - - objectstore.uow().commit() + db.set_assert_list(self, [ + ( + "INSERT INTO keywords (keyword_id, name) VALUES (:keyword_id, :name)", + {'keyword_id': None, 'name': 'yellow'} + ), + ( + "UPDATE items SET order_id=:order_id, item_name=:item_name WHERE items.item_id = :items_item_id", + [{'item_name': 'item4updated', 'order_id': None, 'items_item_id': objects[4].item_id}] + ), + ("INSERT INTO itemkeywords (item_id, keyword_id) VALUES (:item_id, :keyword_id)", + [{'item_id': objects[5].item_id, 'keyword_id': 11}] + ) + ]) + objectstore.commit() + db.set_assert_list(None, None) + objects[2].keywords.append(k) self.echo("added: " + repr(objects[2].keywords.added_items())) objectstore.uow().commit() diff --git a/test/tables.py b/test/tables.py index 911c90322c..6dc1a36cf7 100644 --- a/test/tables.py +++ b/test/tables.py @@ -24,6 +24,8 @@ elif DBTYPE == 'sqlite_file': elif DBTYPE == 'postgres': pass +db = testbase.EngineAssert(db) + users = Table('users', db, Column('user_id', Integer, primary_key = True), Column('user_name', String(20)), diff --git a/test/testbase.py b/test/testbase.py index 4d4d1e408a..2c5bc2318b 100644 --- a/test/testbase.py +++ b/test/testbase.py @@ -1,5 +1,6 @@ import unittest import StringIO +import sqlalchemy.engine as engine echo = True @@ -45,6 +46,27 @@ class AssertMixin(PersistTest): self.assert_(getattr(rowobj, key) == value, "attribute %s value %s does not match %s" % (key, getattr(rowobj, key), value)) def assert_enginesql(self, db, callable_, result): self.assert_(self.capture_exec(db, callable_) == result, result) + +class EngineAssert(object): + def __init__(self, engine): + self.__dict__['engine'] = engine + self.__dict__['realexec'] = engine.execute + self.set_assert_list(None, None) + def __getattr__(self, key): + return getattr(self.engine, key) + def __setattr__(self, key, value): + setattr(self.__dict__['engine'], key, value) + def set_assert_list(self, unittest, list): + self.__dict__['unittest'] = unittest + self.__dict__['assert_list'] = list + def execute(self, statement, parameters, **kwargs): + # TODO: get this to work + if self.assert_list is None: + return + item = self.assert_list.pop() + (query, params) = item + self.unittest.assert_(statement == query and params == parameters) + return self.realexec(statement, parameters, **kwargs) def runTests(suite): runner = unittest.TextTestRunner(verbosity = 2, descriptions =1) -- 2.47.2