From: Mike Bayer Date: Sat, 10 Sep 2005 06:23:18 +0000 (+0000) Subject: got rough 'topology sort' thing to work X-Git-Tag: rel_0_1_0~761 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7ebb7d1e626344a309f9e766db2823fd8d8b80c;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git got rough 'topology sort' thing to work --- diff --git a/lib/sqlalchemy/objectstore.py b/lib/sqlalchemy/objectstore.py index 950cbac34f..7a2b80b3a8 100644 --- a/lib/sqlalchemy/objectstore.py +++ b/lib/sqlalchemy/objectstore.py @@ -193,16 +193,36 @@ class UnitOfWork(object): pass def commit(self): - import sqlalchemy.mapper as mapper + import sqlalchemy.mapper self.dependencies = {} + objects = [] for obj in self.new: - mapper = mapper.object_mapper(obj) - mapper.register_dependencies(item, self) + mapper = sqlalchemy.mapper.object_mapper(obj) + objects.append((obj, mapper)) + mapper.register_dependencies(obj, self) for obj in self.dirty: - mapper = mapper.object_mapper(obj) + mapper = sqlalchemy.mapper.object_mapper(obj) + objects.append((obj, mapper)) mapper.register_dependencies(obj, self) + + def cmp(a, b): + if self.dependencies.has_key((a[0],b[0])): + return -1 + elif self.dependencies.has_key((b[0],a[0])): + 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 @@ -212,8 +232,10 @@ class UnitOfWork(object): self.dirty.clear() # self.deleted.clear() - def register_dependency(self, obj, dependency): - pass + def register_dependency(self, obj, dependency, processor): + self.dependencies[(obj, dependency)] = True + list = self.dependencies.setdefault(obj, []) + list.append((dependency, processor)) uow = util.ScopedRegistry(lambda: UnitOfWork(), "thread") \ No newline at end of file