allowing for stuff like:

def SQLPatternFields(value_list, pattern, type):
   fields = []
   if not pattern or pattern == '':
       pattern = '%s'
   for value in value_list:
       fields.append(
           SQLField(pattern % value, type)
           )
   return fields

periods_fields = SQLPatternFields(range(1,12), 'period_%02d', '
integer')
# generates SQLField('period_01', 'integer') upto SQLField
('period_12', 'integer')

db.define_table(
   'period',
   periods_fields
)

(on gae the db design needs to be a bit more denormalized, this keeps
you DRY)
while building this I ran into exception msgs not being verbose enough


PS: already send to Massimo (before the new DAL announcement)

=== modified file 'web2py/gluon/contrib/gql.py'
--- web2py/gluon/contrib/gql.py 2009-05-25 06:12:10 +0000
+++ web2py/gluon/contrib/gql.py 2009-05-28 21:27:50 +0000
@@ -55,7 +55,8 @@
 def cleanup(text):
     if re.compile('[^0-9a-zA-Z_]').findall(text):
         raise SyntaxError, \
-            'only [0-9a-zA-Z_] allowed in table and field names'
+            'only [0-9a-zA-Z_] allowed in table and field names,
received %s' \
+            % text
     return text


@@ -113,7 +114,8 @@

     def __setattr__(self, key, value):
         if key in self:
-            raise SyntaxError, 'Object exists and cannot be
redefined'
+            raise SyntaxError, 'Object exists and cannot be
redefined: %s' \
+                % key
         self[key] = value

     def __repr__(self):
@@ -155,11 +157,11 @@

         tablename = cleanup(tablename)
         if tablename in dir(self) or tablename[0] == '_':
-            raise SyntaxError, 'invalid table name'
+            raise SyntaxError, 'invalid table name: %s' % tablename
         if not tablename in self.tables:
             self.tables.append(tablename)
         else:
-            raise SyntaxError, 'table already defined'
+            raise SyntaxError, 'table already defined: %s'  %
tablename
         t = self[tablename] = SQLTable(self, tablename, *fields)
         t._create()
         return t
@@ -200,15 +202,25 @@
         *fields
         ):
         new_fields = []
+
+        def check_field(field, new_fields):
+
+                if isinstance(field, SQLField):
+                    new_fields.append(field)
+                elif isinstance(field, SQLTable):
+                    new_fields += [copy.copy(field[f]) for f in
+                                   field.fields if f != 'id']
+                elif isinstance(field, list) or isinstance(field,
tuple):
+                    for field2 in field:
+                        check_field(field2, new_fields)
+                else:
+                    raise SyntaxError, \
+                        'define_table field argument "%s" is not a
SQLField' \
+                        % field
+
         for field in fields:
-            if isinstance(field, SQLField):
-                new_fields.append(field)
-            elif isinstance(field, SQLTable):
-                new_fields += [copy.copy(field[f]) for f in
-                               field.fields if f != 'id']
-            else:
-                raise SyntaxError, \
-                    'define_table argument is not a SQLField'
+            check_field(field, new_fields)
+
         fields = new_fields
         self._db = db
         self._tablename = tablename
@@ -248,18 +260,20 @@
                 if not referenced:
                     raise SyntaxError, 'SQLTable: reference to
nothing!'
                 if not referenced in self._db:
-                    raise SyntaxError, 'SQLTable: table does not
exist'
+                    raise SyntaxError, \
+                        'SQLTable: table does not exist: %s' %
referenced
                 referee = self._db[referenced]
                 ftype = \
                     self._db._translator[field.type[:9]](self._db
[referenced])
                 if self._tablename in referee.fields:  # ## THIS IS
OK
                     raise SyntaxError, \
-                        'SQLField: table name has same name as a
field in referenced table'
+                        'SQLField: table name has same name as a
field in referenced table: %s' \
+                        % self._tablename
                 self._db[referenced]._referenced_by.append
((self._tablename,
                         field.name))
             elif not field.type in self._db._translator\
                  or not self._db._translator[field.type]:
-                raise SyntaxError, 'SQLField: unkown field type'
+                raise SyntaxError, 'SQLField: unknown field type: %s'
% field.type
             else:
                 ftype = self._db._translator[field.type](**attr)
             myfields[field.name] = ftype
@@ -401,7 +415,7 @@

         self.name = fieldname = cleanup(fieldname)
         if fieldname in dir(SQLTable) or fieldname[0] == '_':
-            raise SyntaxError, 'SQLField: invalid field name'
+            raise SyntaxError, 'SQLField: invalid field name: %s' %
fieldname
         if isinstance(type, SQLTable):
             type = 'reference ' + type._tablename
         if not length and type == 'string':
@@ -543,14 +557,15 @@
             return
         if isinstance(right, (SQLField, SQLXorable)):
             raise SyntaxError, \
-                'SQLQuery: right side of filter must be a value or
entity'
+                'SQLQuery: right side of filter must be a value or
entity: %s' \
+                % right
         if isinstance(left, SQLField) and left.name == 'id':
             if not right:
                 right = 0
             try:
                 value = long(right)
             except:
-                raise SyntaxError, 'id value must be integer'
+                raise SyntaxError, 'id value must be integer: %s' %
id
             if op == '=':
                 self.get_one = \
                     QueryException(tablename=left._tablename,
id=value)
@@ -654,7 +669,7 @@
             ]
         if [key for key in attributes.keys() if not key
              in valid_attributes]:
-            raise SyntaxError, 'invalid select attribute'
+            raise SyntaxError, 'invalid select attribute: %s' % key
         if fields and isinstance(fields[0], SQLALL):
             self._tables.insert(0, fields[0].table._tablename)
         table = self._get_table_or_raise()
@@ -821,7 +836,7 @@

     def __getitem__(self, i):
         if i >= len(self.response) or i < 0:
-            raise SyntaxError, 'SQLRows: no such row'
+            raise SyntaxError, 'SQLRows: no such row: %s' % i
         if len(self.response[0]) != len(self.colnames):
             raise SyntaxError, 'SQLRows: internal error'
         row = SQLStorage()

=== modified file 'web2py/gluon/sql.py'
--- web2py/gluon/sql.py 2009-05-25 06:12:10 +0000
+++ web2py/gluon/sql.py 2009-05-28 21:27:51 +0000
@@ -404,7 +404,8 @@
 def cleanup(text):
     if re.compile('[^0-9a-zA-Z_]').findall(text):
         raise SyntaxError, \
-            'only [0-9a-zA-Z_] allowed in table and field names'
+            'only [0-9a-zA-Z_] allowed in table and field names,
received %s' \
+            % text
     return text


@@ -492,7 +493,8 @@

     def __setattr__(self, key, value):
         if key in self:
-            raise SyntaxError, 'Object exists and cannot be
redefined'
+            raise SyntaxError, \
+                'Object %s exists and cannot be redefined' % key
         self[key] = value

     def __repr__(self):
@@ -581,7 +583,8 @@
         for (i, db) in instances:
             keys.append('%s.%i' % (thread_key, i))
             if not db._dbname == 'postgres':
-                raise SyntaxError, 'only supported by postgresql'
+                raise SyntaxError, \
+                    'distributed transactyion only supported by
postgresql'
         try:
             for (i, db) in instances:
                 db._execute("PREPARE TRANSACTION '%s';" % keys[i])
@@ -664,7 +667,8 @@
             m = re.compile('^(?P<user>[^:@]+)(\:(?P<passwd>[...@]*))?@(?
P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^?]+)(\?set_encoding=(?
P<charset>\w+))?$'
                 ).match(self._uri[8:])
             if not m:
-                raise SyntaxError, "Invalid URI string in SQLDB"
+                raise SyntaxError, \
+                    "Invalid URI string in SQLDB: %s" % self._uri
             user = m.group('user')
             if not user:
                 raise SyntaxError, 'User required'
@@ -766,7 +770,8 @@
                     re.compile('^(?P<user>[^:@]+)(\:(?P<passwd>[...@]
*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+)$'
                                ).match(self._uri[skip:])
                 if not m:
-                    raise SyntaxError, "Invalid URI string in SQLDB"
+                    raise SyntaxError, \
+                        "Invalid URI string in SQLDB: %s" % self._uri
                 user = m.group('user')
                 if not user:
                     raise SyntaxError, 'User required'
@@ -801,7 +806,8 @@
                 re.compile('^(?P<user>[^:@]+)(\:(?P<passwd>[...@]*))?@(?
P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+)(\?set_encoding=(?
P<charset>\w+))?$'
                            ).match(self._uri[11:])
             if not m:
-                raise SyntaxError, "Invalid URI string in SQLDB"
+                raise SyntaxError, \
+                    "Invalid URI string in SQLDB: %s" % self._uri
             user = m.group('user')
             if not user:
                 raise SyntaxError, 'User required'
@@ -834,7 +840,8 @@
                 re.compile('^(?P<user>[^:@]+)(\:(?P<passwd>[...@]*))?@(?
P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+)$'
                            ).match(self._uri[11:])
             if not m:
-                raise SyntaxError, "Invalid URI string in SQLDB"
+                raise SyntaxError, \
+                    "Invalid URI string in SQLDB: %s" % self._uri
             user = m.group('user')
             if not user:
                 raise SyntaxError, 'User required'
@@ -890,7 +897,8 @@
             self._cursor = Dummy()
             self._execute = lambda a: []
         else:
-            raise SyntaxError, 'database type not supported'
+            raise SyntaxError, \
+                'database type not supported: %s' % self._uri
         self._translator = SQL_DIALECTS[self._dbname]

         # ## register this instance of SQLDB
@@ -913,12 +921,13 @@
         if not 'migrate' in args:
             args['migrate'] = True
         if args.keys() != ['migrate']:
-            raise SyntaxError, 'invalid table attribute'
+            raise SyntaxError, \
+                'invalid table attribute: %s' % arg.keys()
         tablename = cleanup(tablename)
         if tablename in dir(self) or tablename[0] == '_':
-            raise SyntaxError, 'invalid table name'
+            raise SyntaxError, 'invalid table name: %s' % tablename
         if tablename in self.tables:
-            raise SyntaxError, 'table already defined'
+            raise SyntaxError, 'table already defined: %s' %
tablename
         t = self[tablename] = SQLTable(self, tablename, *fields)
         if self._uri == 'None':
             args['migrate'] = False
@@ -1066,15 +1075,23 @@
         *fields
         ):
         new_fields = []
+
+        def check_field(field, new_fields):
+
+                if isinstance(field, SQLField):
+                    new_fields.append(field)
+                elif isinstance(field, SQLTable):
+                    new_fields += [copy.copy(field[f]) for f in
+                                   field.fields if f != 'id']
+                elif isinstance(field, list) or isinstance(field,
tuple):
+                    for field2 in field:
+                        check_field(field2, new_fields)
+                else:
+                    raise SyntaxError, \
+                        'define_table field argument "%s" is not a
SQLField' % field
+
         for field in fields:
-            if isinstance(field, SQLField):
-                new_fields.append(field)
-            elif isinstance(field, SQLTable):
-                new_fields += [copy.copy(field[f]) for f in
-                               field.fields if f != 'id']
-            else:
-                raise SyntaxError, \
-                    'define_table argument is not a SQLField'
+            check_field(field, new_fields)
         fields = new_fields
         self._db = db
         self._tablename = tablename
@@ -1109,20 +1126,21 @@
                 self.insert(**self._filter_fields(value))
             elif not self._db(self.id
                                == key).update(**self._filter_fields
(value)):
-                raise SyntaxError, 'No such record'
+                raise SyntaxError, 'No such record: %s' % key
         else:
             dict.__setitem__(self, str(key), value)

     def __delitem__(self, key):
         if not is_integer(key) or not self._db(self.id == key).delete
():
-            raise SyntaxError, 'No such record'
+            raise SyntaxError, 'No such record: %s' % key

     def __getattr__(self, key):
         return self[key]

     def __setattr__(self, key, value):
         if key in self:
-            raise SyntaxError, 'Object exists and cannot be
redefined'
+            raise SyntaxError, \
+                'Object exists and cannot be redefined: %s' % key
         self[key] = value

     def __repr__(self):
@@ -1155,7 +1173,8 @@
                 if not referenced:
                     raise SyntaxError, 'SQLTable: reference to
nothing!'
                 if not referenced in self._db:
-                    raise SyntaxError, 'SQLTable: table does not
exist'
+                    raise SyntaxError, \
+                        'SQLTable: table does not exist: ' %
referenced
                 referee = self._db[referenced]
                 ftype = self._db._translator[field.type[:9]]\
                      % dict(table_name=self._tablename,
@@ -1164,11 +1183,13 @@
                             on_delete_action=field.ondelete)
                 if self._tablename in referee.fields:  # ## THIS IS
OK
                     raise SyntaxError, \
-                        'SQLField: table name has same name as a
field in referenced table'
+                        'SQLField: table name has same name as a
field in referenced table: %s' \
+                        % self._tablename
                 self._db[referenced]._referenced_by.append
((self._tablename,
                         field.name))
             elif not field.type in self._db._translator:
-                raise SyntaxError, 'SQLField: unkown field type'
+                raise SyntaxError, \
+                    'SQLField: unkown field type %s' % field.type
             else:
                 ftype = self._db._translator[field.type]\
                      % dict(length=field.length)
@@ -1348,7 +1369,7 @@
     def _insert(self, **fields):
         (fs, vs) = ([], [])
         if [key for key in fields if not key in self.fields]:
-            raise SyntaxError, 'invalid field name'
+            raise SyntaxError, 'invalid field name: %s' % key
         for fieldname in self.fields:
             if fieldname == 'id':
                 continue
@@ -1365,7 +1386,7 @@
                 fs.append(fieldname)
                 vs.append(sql_represent(field.default, ft, fd))
             elif field.required is True:
-                raise SyntaxError,'SQLTable: missing required field:
%s'%field
+                raise SyntaxError,'SQLTable: missing required field:
%s' % field
         sql_f = ', '.join(fs)
         sql_v = ', '.join(vs)
         sql_t = self._tablename
@@ -1601,7 +1622,7 @@

         self.name = fieldname = cleanup(fieldname)
         if fieldname in dir(SQLTable) or fieldname[0] == '_':
-            raise SyntaxError, 'SQLField: invalid field name'
+            raise SyntaxError, 'SQLField: invalid field name: %s' %
fieldname
         if isinstance(type, SQLTable):
             type = 'reference ' + type._tablename
         if not length and type == 'string':
@@ -1716,13 +1737,16 @@

     def __getslice__(self, start, stop):
         if start < 0 or stop < start:
-            raise SyntaxError, 'not supported'
+            raise SyntaxError, 'not supported: %s - %s' % (start,
stop)
         d = dict(field=str(self), pos=start + 1, length=stop - start)
         s = self._db._translator['substring'] % d
         return SQLXorable(s, 'string', self._db)

     def __str__(self):
-        return '%s.%s' % (self._tablename, self.name)
+        try:
+            return '%s.%s' % (self._tablename, self.name)
+        except:
+            return '<no table>.%s' % self.name


 SQLDB.Field = SQLField  # necessary in gluon/globals.py
session.connect
@@ -1873,7 +1897,7 @@
             ]
         if [key for key in attributes if not key
              in valid_attributes]:
-            raise SyntaxError, 'invalid select attribute'
+            raise SyntaxError, 'invalid select attribute: %s' % key

         # ## if not fields specified take them all from the requested
tables

@@ -2101,7 +2125,7 @@

     def __getitem__(self, i):
         if i >= len(self.response) or i < 0:
-            raise SyntaxError, 'SQLRows: no such row'
+            raise SyntaxError, 'SQLRows: no such row: %s' % i
         if len(self.response[0]) != len(self.colnames):
             raise SyntaxError, 'SQLRows: internal error'
         row = SQLStorage()


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to