Update of /cvsroot/webware/Webware/MiddleKit/Design
In directory sc8-pr-cvs1:/tmp/cvs-serv410/Design
Modified Files:
PythonGenerator.py SQLGenerator.py
Log Message:
- better error reporting
- better support for .xls models
Index: PythonGenerator.py
===================================================================
RCS file: /cvsroot/webware/Webware/MiddleKit/Design/PythonGenerator.py,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** PythonGenerator.py 8 Dec 2003 06:08:40 -0000 1.27
--- PythonGenerator.py 19 Dec 2003 05:26:55 -0000 1.28
***************
*** 270,281 ****
def stringToValue(self, string):
! string = string.upper()
! if string=='TRUE' or string=='YES':
value = 1
! elif string=='FALSE' or string=='NO':
value = 0
else:
value = int(string)
! assert value==0 or value==1
return value
--- 270,284 ----
def stringToValue(self, string):
! try:
! string = string.upper()
! except:
! pass
! if string in ('TRUE', 'YES', '1', '1.0', 1, 1.0):
value = 1
! elif string in ('FALSE', 'NO', '0', '0.0', 0, 0.0):
value = 0
else:
value = int(string)
! assert value==0 or value==1, value
return value
Index: SQLGenerator.py
===================================================================
RCS file: /cvsroot/webware/Webware/MiddleKit/Design/SQLGenerator.py,v
retrieving revision 1.35
retrieving revision 1.36
diff -C2 -d -r1.35 -r1.36
*** SQLGenerator.py 18 Dec 2003 06:17:02 -0000 1.35
--- SQLGenerator.py 19 Dec 2003 05:26:55 -0000 1.36
***************
*** 115,119 ****
lines = open(filename).readlines()
try:
! self.writeInsertSamplesSQLForLines(lines, generator, file)
except SampleError, s:
s.output( filename )
--- 115,119 ----
lines = open(filename).readlines()
try:
! self.writeInsertSamplesSQLForLines(lines, generator, file, filename)
except SampleError, s:
s.output( filename )
***************
*** 121,125 ****
file.close()
! def writeInsertSamplesSQLForLines(self, lines, generator, file):
# @@ 2001-02-04 ce: this method is too long
# break into additional methods
--- 121,125 ----
file.close()
! def writeInsertSamplesSQLForLines(self, lines, generator, file, filename):
# @@ 2001-02-04 ce: this method is too long
# break into additional methods
***************
*** 133,206 ****
fields = parse(line)
except CSVParser.ParseError, err:
! raise SampleError( linenum, 'Syntax error: %s' % err)
if fields is None: # parser got embedded newline; continue with the next line
continue
! if self.areFieldsBlank(fields):
! continue # skip blank lines
! if fields[0] and str(fields[0])[0]=='#':
! continue
! if fields[0].endswith(' objects'):
! tableName = fields[0].split()[0]
! try:
! klass = self.klass(tableName)
! except KeyError:
! raise SampleError( linenum, "Class '%s' has not been defined" % ( tableName ) )
! file.write('\n\n/* %s */\n\n' % fields[0])
! #print '>> table:', tableName
! readColumns = 1
! continue
! if readColumns:
! names = [name for name in fields if name]
! attrs = []
! for name in names:
! if name == klass.sqlIdName():
! attrs.append( PrimaryKey( name, klass ) )
! else:
! try:
! attrs.append( klass.lookupAttr(name) )
! except KeyError:
! raise SampleError( linenum, "Class '%s' has no attribute '%s'" % ( klass.name(), name ) )
! # @@ 2000-10-29 ce: check that each attr.hasSQLColumn()
for attr in attrs:
! assert not attr.get('isDerived', 0)
! colNames = [attr.sqlName() for attr in attrs]
! #print '>> cols:', columns
! colSql = ','.join(colNames)
! readColumns = 0
! continue
! values = fields[:len(attrs)]
! i = 0
! for attr in attrs:
! try:
! value = values[i]
! except IndexError:
! raise SampleError( linenum, "Couldn't find value for attribute '%s'" % attr.name() )
! value = value.strip()
! #print '>> (%s, %s)' % (value, attr)
! if value=='':
! value = attr.get('Default', None)
! if value is None:
value = 'NULL'
else:
value = attr.sampleValue(value)
! elif value.lower()=='none':
! value = 'NULL'
! else:
! value = attr.sampleValue(value)
! # print 'Attr: %s, Value: %s' % (attr,value)
! if not isinstance(value, StringTypes):
! print 'attr:', attr
! print 'value:', value
! print 'type of value:', type(value)
! assert isinstance(value, StringTypes)
! assert value # value cannot be blank
! values[i] = value
! i += 1
! #print
! #values = [self.valueFilter(value) for value in values]
! values = ', '.join(values)
! stmt = 'insert into %s (%s) values (%s);\n' % (tableName, colSql, values)
! file.write(stmt)
def areFieldsBlank(self, fields):
--- 133,219 ----
fields = parse(line)
except CSVParser.ParseError, err:
! raise SampleError(linenum, 'Syntax error: %s' % err)
if fields is None: # parser got embedded newline; continue with the next line
continue
! try:
! if self.areFieldsBlank(fields):
! continue # skip blank lines
! if fields[0] and str(fields[0])[0]=='#':
! continue
! if fields[0].endswith(' objects'):
! tableName = fields[0].split()[0]
! try:
! klass = self.klass(tableName)
! except KeyError:
! raise SampleError( linenum, "Class '%s' has not been defined" % ( tableName ) )
! file.write('\n\n/* %s */\n\n' % fields[0])
! #print '>> table:', tableName
! readColumns = 1
! continue
! if readColumns:
! names = [name for name in fields if name]
! attrs = []
! for name in names:
! if name == klass.sqlIdName():
! attrs.append(PrimaryKey(name, klass))
! else:
! try:
! attrs.append(klass.lookupAttr(name))
! except KeyError:
! raise SampleError( linenum, "Class '%s' has no attribute '%s'" % ( klass.name(), name ) )
! # @@ 2000-10-29 ce: check that each attr.hasSQLColumn()
! for attr in attrs:
! assert not attr.get('isDerived', 0)
! colNames = [attr.sqlName() for attr in attrs]
! #print '>> cols:', columns
! colSql = ','.join(colNames)
! readColumns = 0
! continue
! values = fields[:len(attrs)]
! i = 0
for attr in attrs:
! try:
! value = values[i]
! except IndexError:
! raise SampleError( linenum, "Couldn't find value for attribute '%s'" % attr.name() )
! value = value.strip()
! #print '>> (%s, %s)' % (value, attr)
! if value=='':
! value = attr.get('Default', None)
! if value is None:
! value = 'NULL'
! else:
! value = attr.sampleValue(value)
! elif value.lower()=='none':
value = 'NULL'
else:
value = attr.sampleValue(value)
! # print 'Attr: %s, Value: %s' % (attr,value)
! value = str(value)
! if 0:
! if not isinstance(value, StringTypes):
! print 'attr:', attr
! print 'value:', value
! print 'type of value:', type(value)
! assert isinstance(value, StringTypes), value
! assert value # value cannot be blank
! values[i] = value
! i += 1
! #print
! #values = [self.valueFilter(value) for value in values]
! values = ', '.join(values)
! stmt = 'insert into %s (%s) values (%s);\n' % (tableName, colSql, values)
! file.write(stmt)
! except:
! print
! print 'Samples error:'
! try:
! print '%s:%s' % (filename, linenum)
! print line
! except:
! pass
! print
! raise
def areFieldsBlank(self, fields):
***************
*** 456,474 ****
def writeCreateSQL(self, generator, out):
! if self.hasSQLColumn():
! name = self.sqlName().ljust(self.maxNameWidth())
! if self.isRequired():
! notNullSQL = ' not null'
! else:
! notNullSQL = self.sqlNullSpec()
! if generator.sqlSupportsDefaultValues():
! defaultSQL = self.createDefaultSQL()
! if defaultSQL:
! defaultSQL = ' ' + defaultSQL
else:
! defaultSQL = ''
! out.write('\t%s %s%s%s' % (name, self.sqlType(), notNullSQL, defaultSQL))
! else:
! out.write('\t/* %(Name)s %(Type)s - not a SQL column */' % self)
def sqlNullSpec(self):
--- 469,499 ----
def writeCreateSQL(self, generator, out):
! try:
! if self.hasSQLColumn():
! name = self.sqlName().ljust(self.maxNameWidth())
! if self.isRequired():
! notNullSQL = ' not null'
! else:
! notNullSQL = self.sqlNullSpec()
! if generator.sqlSupportsDefaultValues():
! defaultSQL = self.createDefaultSQL()
! if defaultSQL:
! defaultSQL = ' ' + defaultSQL
! else:
! defaultSQL = ''
! out.write('\t%s %s%s%s' % (name, self.sqlType(), notNullSQL, defaultSQL))
else:
! out.write('\t/* %(Name)s %(Type)s - not a SQL column */' % self)
! except:
! print
! print 'exception for attribute:'
! print '%s.%s' % (self.klass().name(), self.name())
! print
! try:
! print self
! except:
! pass
! print
! raise
def sqlNullSpec(self):
***************
*** 478,482 ****
default = self.get('Default', None)
if default is not None:
! default = default.strip()
if default.lower()=='none': # kind of redundant
default = None
--- 503,507 ----
default = self.get('Default', None)
if default is not None:
! default = str(default).strip()
if default.lower()=='none': # kind of redundant
default = None
***************
*** 505,516 ****
def sampleValue(self, value):
! value = value.upper()
! if value=='FALSE' or value=='NO':
value = 0
! elif value=='TRUE' or value=='YES':
value = 1
! else:
! value = int(value) # will throw exception if value is weird
! assert value==0 or value==1
return str(value)
--- 530,542 ----
def sampleValue(self, value):
! try:
! value = value.upper()
! except:
! pass
! if value in ('FALSE', 'NO', '0', '0.0', 0, 0.0):
value = 0
! elif value in ('TRUE', 'YES', '1', '1.0', 1, 1.0):
value = 1
! assert value==0 or value==1, value
return str(value)
***************
*** 522,527 ****
def sampleValue(self, value):
! int(value) # raises exception if value is invalid
! return value
--- 548,558 ----
def sampleValue(self, value):
! if not isinstance(value, int):
! value = str(value)
! if value.endswith('.0'):
! # numeric values from Excel-based models are always float
! value = value[:-2]
! int(value) # raises exception if value is invalid
! return value
***************
*** 645,658 ****
raise Exception, 'Lists are implicit. They cannot have sample values.'
class PrimaryKey:
! '''
This class is not a 'standard' attribute, but just a helper class for the
writeInsertSamplesSQLForLines method, in case the samples.csv file contains
a primary key column (i.e. the serial numbers are specified explicitly).
! '''
! def __init__(self,name,klass):
self._name = name
self._klassid = klass.id()
! self._props = {'isDerived':0}
def name(self):
--- 676,691 ----
raise Exception, 'Lists are implicit. They cannot have sample values.'
+
class PrimaryKey:
! """
This class is not a 'standard' attribute, but just a helper class for the
writeInsertSamplesSQLForLines method, in case the samples.csv file contains
a primary key column (i.e. the serial numbers are specified explicitly).
! """
!
! def __init__(self, name, klass):
self._name = name
self._klassid = klass.id()
! self._props = {'isDerived': 0}
def name(self):
|