|
[Webware-checkins] CVS: Webware/MiddleKit/Design SQLGenerator.py,1.50,1.51
From: Chuck Esterbrook <echuck@us...> - 2004-03-12 12:00
|
Update of /cvsroot/webware/Webware/MiddleKit/Design
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22406/Design
Modified Files:
SQLGenerator.py
Log Message:
- MiddleKit will now generate CREATE TABLE statements in order of
dependency (least to most) so that foreign key declarations always work.
Index: SQLGenerator.py
===================================================================
RCS file: /cvsroot/webware/Webware/MiddleKit/Design/SQLGenerator.py,v
retrieving revision 1.50
retrieving revision 1.51
diff -C2 -d -r1.50 -r1.51
*** SQLGenerator.py 11 Mar 2004 21:43:28 -0000 1.50
--- SQLGenerator.py 12 Mar 2004 11:33:17 -0000 1.51
***************
*** 235,239 ****
kv(out, 'Num classes', len(self._klasses))
wr('\nClasses:\n')
! for klass in self._model._allKlassesInOrder:
wr('\t%s\n' % klass.name())
wr('*/\n\n')
--- 235,239 ----
kv(out, 'Num classes', len(self._klasses))
wr('\nClasses:\n')
! for klass in self._model.allKlassesInOrder():
wr('\t%s\n' % klass.name())
wr('*/\n\n')
***************
*** 291,295 ****
self.assignClassIds(generator)
self.writeClassIdsSQL(generator, out)
! for klass in self._model._allKlassesInOrder:
klass.writeCreateSQL(self._sqlGenerator, out)
--- 291,313 ----
self.assignClassIds(generator)
self.writeClassIdsSQL(generator, out)
!
! if self._model.setting('DoNotSortSQLCreateStatementsByDependency', False):
! # Generates the CREATE TABLEs in the order the classes were declared
! # but if you're not careful, than foreign keys will cause "unknown table" errors
! allKlasses = self._model.allKlassesInOrder()
! else:
! class Container:
! pass
! sorter = Container()
! # Generate the CREATE TABLEs in the order that foreign keys requires.
! sorter.allKlasses = [] # will be added in the correct order
! sorter.recordedKlasses = {} # a set for fast membership testing.
! for klass in self._model.allKlassesInOrder():
! sorter.visitedKlasses = {}
! klass.sortByDependency(sorter)
! allKlasses = sorter.allKlasses
! assert len(allKlasses)==len(self._model.allKlassesInOrder())
!
! for klass in allKlasses:
klass.writeCreateSQL(self._sqlGenerator, out)
***************
*** 351,354 ****
--- 369,392 ----
class Klass:
+ def sortByDependency(self, sorter):
+ """
+ Sort the klasses by their dependencies so that foreign key declarations work.
+ """
+ if sorter.visitedKlasses.has_key(self):
+ return
+ sorter.visitedKlasses[self] = 1
+ if sorter.recordedKlasses.has_key(self):
+ return
+ from MiddleKit.Core.ObjRefAttr import ObjRefAttr
+ for attr in self.allAttrs():
+ if isinstance(attr, ObjRefAttr):
+ targetKlass = attr.targetKlass()
+ if targetKlass is not self and not sorter.visitedKlasses.has_key(targetKlass):
+ targetKlass.sortByDependency(sorter) # recursive call
+ # end of the dependency road
+ if not sorter.recordedKlasses.has_key(self):
+ sorter.allKlasses.append(self)
+ sorter.recordedKlasses[self] = 1
+
def writeCreateSQL(self, generator, out):
for attr in self.attrs():
|
| Thread | Author | Date |
|---|---|---|
| [Webware-checkins] CVS: Webware/MiddleKit/Design SQLGenerator.py,1.50,1.51 | Chuck Esterbrook <echuck@us...> |