else:
return sql.and_([pk == secondary.c[pk.name] for pk in primary.primary_keys])
- def register_dependencies(self, obj, uow):
- print 'hi2'
- if self.uselist:
- childlist = objectstore.uow().register_list_attribute(obj, self.key)
- else:
- childlist = objectstore.uow().register_attribute(obj, self.key)
-
+ def register_dependencies(self, objlist, uow):
if self.secondaryjoin is not None:
- print "hi6?"
- # TODO: put a "row" as a dependency into the UOW somehow
pass
elif self.foreignkey.table == self.target:
- print "hi4"
- setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, obj)
- def foo(obj, child):
- setter.obj = obj
- setter.child = child
- setter.associationrow = {}
- self.primaryjoin.accept_visitor(setter)
-
- for child in childlist.added_items():
- uow.register_dependency(obj, child, foo)
+ uow.register_dependency(self.parent, self.mapper, self, objlist)
elif self.foreignkey.table == self.parent.table:
- print "hi5"
- setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, None)
-
- # setter = ForeignKeySetter(self.mapper, self.parent, self.target, self.parent.table, self.secondary, obj)
- def foo(obj, child):
- print "hi7"
- setter.obj = obj
- setter.child = child
- setter.associationrow = {}
- self.primaryjoin.accept_visitor(setter)
-
- for child in childlist.added_items():
- uow.register_dependency(child, obj, foo)
+ uow.register_dependency(self.mapper, self.parent, self, objlist)
else:
raise " no foreign key ?"
+ def process_dependencies(self, deplist):
+
+ for obj in deplist:
+ if self.uselist:
+ childlist = objectstore.uow().register_list_attribute(obj, self.key)
+ else:
+ childlist = objectstore.uow().register_attribute(obj, self.key)
+
+ if self.secondaryjoin is not None:
+ pass
+ elif self.foreignkey.table == self.target:
+ setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, obj)
+ for child in childlist.added_items():
+ setter.obj = obj
+ setter.child = child
+ setter.associationrow = {}
+ self.primaryjoin.accept_visitor(setter)
+
+ elif self.foreignkey.table == self.parent.table:
+ setter = ForeignKeySetter(self.parent, self.mapper, self.parent.table, self.target, self.secondary, None)
+ for child in childlist.added_items():
+ setter.obj = child
+ setter.child = obj
+ setter.associationrow = {}
+ self.primaryjoin.accept_visitor(setter)
+ else:
+ raise " no foreign key ?"
+
def save(self, obj, traverse):
# saves child objects
# TODO: make some kinds of coherent objects here instead of tuples
self.dependencies = {}
- objects = []
+
+ mappers = {}
for obj in self.new:
mapper = sqlalchemy.mapper.object_mapper(obj)
- objects.append((obj, mapper))
- mapper.register_dependencies(obj, self)
+ mapperlist = mappers.setdefault(mapper, [])
+ mapperlist.append(obj)
for obj in self.dirty:
mapper = sqlalchemy.mapper.object_mapper(obj)
- objects.append((obj, mapper))
- mapper.register_dependencies(obj, self)
+ mapperlist = mappers.setdefault(mapper, [])
+ mapperlist.append(obj)
- def cmp(a, b):
- if self.dependencies.has_key((a[0],b[0])):
+ for mapper in mappers.keys():
+ mapperlist = mappers[mapper]
+ mapper.register_dependencies(mapperlist, self)
+
+ mapperlist = mappers.keys()
+ def compare(a, b):
+ if self.dependencies.has_key((a, b)):
return -1
- elif self.dependencies.has_key((b[0],a[0])):
+ elif self.dependencies.has_key((b, a)):
return 1
else:
return 0
-
- objects.sort(cmp)
- for rec in objects:
- rec[1].save_obj(rec[0])
- list = self.dependencies.setdefault(rec[0], [])
- for dep in list:
- dep[1](rec[0], dep[0])
-
-
-# for item in self.deleted:
-# mapper = mapper.object_mapper(item)
-# sort save instructions
-# execute save instructions
-# hmmmmm, as we save items, we have to populate the dependencies too
-# then the save comes down to them and they are populated
+ mapperlist.sort(compare)
+
+ for mapper in mapperlist:
+ obj_list = mappers[mapper]
+ deplist = self.dependencies.get(mapper, [])
+ for obj in obj_list:
+ mapper.save_obj(obj)
+ for dep in deplist:
+ (processor, list) = dep
+ processor.process_dependencies(list)
+
+ self.new.clear()
self.dirty.clear()
-# self.deleted.clear()
- def register_dependency(self, obj, dependency, processor):
+ def register_dependency(self, obj, dependency, processor, list):
self.dependencies[(obj, dependency)] = True
- list = self.dependencies.setdefault(obj, [])
- list.append((dependency, processor))
+ deplist = self.dependencies.setdefault(obj, [])
+ deplist.append((processor, list))
uow = util.ScopedRegistry(lambda: UnitOfWork(), "thread")
\ No newline at end of file