Author: nunofsantos
Date: 2008-08-12 16:25:47 -0400 (Tue, 12 Aug 2008)
New Revision: 2285
Modified:
mgmt/trunk/mint/python/mint/schemaparser.py
Log:
handle reserved words based on a defined mapping, not on a case-by-case basis
Modified: mgmt/trunk/mint/python/mint/schemaparser.py
===================================================================
--- mgmt/trunk/mint/python/mint/schemaparser.py 2008-08-12 18:54:32 UTC (rev 2284)
+++ mgmt/trunk/mint/python/mint/schemaparser.py 2008-08-12 20:25:47 UTC (rev 2285)
@@ -27,7 +27,18 @@
self.dataTypesMap["bool"] = "BoolCol"
self.dataTypesMap["sstr"] = self.dataTypesMap["lstr"] =
"StringCol"
self.dataTypesMap["map"] = "StringCol"
-
+ # mapping for identifiers in the XML schema that are reserved words in either SQL or
Python
+ self.reservedWords = {"in": "inRsv", "In":
"InRsv",
+ "connection": "clientConnection",
"Connection": "ClientConnection",
+ "other": "otherRsv"}
+
+ def renameReservedWord(self, name):
+ if (name in self.reservedWords.keys()):
+ print "Notice: %s is a reserved word, automatically translating to %s" %
(name, self.reservedWords[name])
+ return self.reservedWords[name]
+ else:
+ return name
+
def attrNameFromDbColumn(self, name, removeSuffix=""):
return self.style.dbColumnToPythonAttr(name.replace(removeSuffix, ""))
@@ -50,8 +61,7 @@
def generateForeignKeyAttrib(self, name, reference):
params = "'%s', cascade='null'" % (reference)
- if (name == "connection"):
- name = "clientConnection"
+ name = self.renameReservedWord(name)
self.generateAttrib(name, "ForeignKey", params)
def generateHiLoAttrib(self, name, type):
@@ -78,43 +88,39 @@
if (schemaName == "JournalStats"):
print schemaName
for elem in elements:
- # special handling due to name conflict with SqlObject.connection
- if (elem["@name"] == "connection"):
- elem["@name"] = "clientConnection"
+ elemName = self.renameReservedWord(elem["@name"])
if (elem["@type"] == "objId"):
- if (elem["(a)name"].endswith("Ref")):
+ if (elemName.endswith("Ref")):
reference = elem["@references"]
# handle cases where the referenced class is in a different namespace (ie,
contains a ".")
namespaceIndex = reference.find(".")
if (namespaceIndex > 0):
reference = reference[namespaceIndex + 1:]
reference = self.style.dbTableToPythonClass(reference)
- if (reference == "Connection"):
- reference = "ClientConnection"
+ reference = self.renameReservedWord(reference)
attrib = reference[0].lower() + reference[1:]
self.generateForeignKeyAttrib(attrib, reference)
self.generateMultipleJoin(reference, self.currentClass)
else:
# if reference doesn't have a "Ref" prefix, handle as a large
uint
- self.generateAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap["uint64"])
+ self.generateAttrib(self.attrNameFromDbColumn(elemName),
self.dataTypesMap["uint64"])
elif (elem["(a)type"].startswith("hilo")):
- self.generateHiLoAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap[elem["@type"]])
+ self.generateHiLoAttrib(self.attrNameFromDbColumn(elemName),
self.dataTypesMap[elem["@type"]])
elif (elem["(a)type"].startswith("mma")):
- self.generateMinMaxAvgAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap[elem["@type"]])
+ self.generateMinMaxAvgAttrib(self.attrNameFromDbColumn(elemName),
self.dataTypesMap[elem["@type"]])
else:
args = ""
if (elem["@type"] == "sstr"):
args += "length=1000"
elif (elem["@type"] == "lstr" or elem["@type"] ==
"ftable"):
args += "length=4000"
- self.generateAttrib(self.attrNameFromDbColumn(elem["@name"]),
self.dataTypesMap[elem["@type"]], args)
+ self.generateAttrib(self.attrNameFromDbColumn(elemName),
self.dataTypesMap[elem["@type"]], args)
self.pythonOutput += "\n"
self.pythonOutput += " classInfos = dict() # brokerId => classInfo\n"
def startClass(self, schemaName, stats=False):
- if (schemaName == "Connection"):
- schemaName = "ClientConnection"
+ schemaName = self.renameReservedWord(schemaName)
if (stats):
origPythonName = self.style.dbTableToPythonClass(schemaName)
pythonName = self.style.dbTableToPythonClass(schemaName + "_stats")
Show replies by date