self refernces, issue 353, 'refernce .', thanks eenns

This commit is contained in:
Massimo DiPierro
2012-06-05 17:37:40 -05:00
parent 4fd95881dc
commit 72cacb43d2
2 changed files with 38 additions and 28 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.00.0 (2012-06-05 17:15:12) dev Version 2.00.0 (2012-06-05 17:37:37) dev
+37 -27
View File
@@ -638,37 +638,47 @@ class BaseAdapter(ConnectionPool):
ftype = field.type.native or field.type.type ftype = field.type.native or field.type.type
elif field.type.startswith('reference'): elif field.type.startswith('reference'):
referenced = field.type[10:].strip() referenced = field.type[10:].strip()
if referenced == '.':
referenced = tablename
constraint_name = self.constraint_name(tablename, field.name) constraint_name = self.constraint_name(tablename, field.name)
if hasattr(table,'_primarykey'): if not '.' in referenced \
rtablename,rfieldname = referenced.split('.') and referenced != tablename) \
rtable = table._db[rtablename] and hasattr(table,'_primarykey'):
rfield = rtable[rfieldname] ftype = self.types['integer']
# must be PK reference or unique else:
if rfieldname in rtable._primarykey or rfield.unique: if hasattr(table,'_primarykey'):
ftype = self.types[rfield.type[:9]] % dict(length=rfield.length) rtablename,rfieldname = referenced.split('.')
# multicolumn primary key reference? rtable = table._db[rtablename]
if not rfield.unique and len(rtable._primarykey)>1 : rfield = rtable[rfieldname]
# then it has to be a table level FK # must be PK reference or unique
if rtablename not in TFK: if rfieldname in rtable._primarykey or rfield.unique:
TFK[rtablename] = {} ftype = self.types[rfield.type[:9]] % \
TFK[rtablename][rfieldname] = field.name dict(length=rfield.length)
else: # multicolumn primary key reference?
ftype = ftype + \ if not rfield.unique and len(rtable._primarykey)>1:
self.types['reference FK'] %dict(\ # then it has to be a table level FK
if rtablename not in TFK:
TFK[rtablename] = {}
TFK[rtablename][rfieldname] = field.name
else:
ftype = ftype + self.types['reference FK'] \
% dict(
constraint_name=constraint_name, constraint_name=constraint_name,
table_name=tablename, table_name=tablename,
field_name=field.name, field_name=field.name,
foreign_key='%s (%s)'%(rtablename, rfieldname), foreign_key='%s (%s)'%(rtablename, rfieldname),
on_delete_action=field.ondelete) on_delete_action=field.ondelete)
else: else:
# make a guess here for circular references # make a guess here for circular references
id_fieldname = referenced in table._db and table._db[referenced]._id.name or 'id' id_fieldname = referenced in table._db \
ftype = self.types[field.type[:9]]\ and table._db[referenced]._id.name or 'id'
% dict(table_name=tablename, ftype = self.types[field.type[:9]] % \
field_name=field.name, dict(table_name=tablename,
constraint_name=constraint_name, field_name=field.name,
foreign_key=referenced + ('(%s)' % id_fieldname), constraint_name=constraint_name,
on_delete_action=field.ondelete) foreign_key=referenced + \
('(%s)' % id_fieldname),
on_delete_action=field.ondelete)
elif field.type.startswith('list:reference'): elif field.type.startswith('list:reference'):
ftype = self.types[field.type[:14]] ftype = self.types[field.type[:14]]
elif field.type.startswith('decimal'): elif field.type.startswith('decimal'):
@@ -679,8 +689,8 @@ class BaseAdapter(ConnectionPool):
srid = self.srid srid = self.srid
geotype, parms = field.type[:-1].split('(') geotype, parms = field.type[:-1].split('(')
if not geotype in self.types: if not geotype in self.types:
raise SyntaxError, 'Field: unknown field type: %s for %s' % \ raise SyntaxError, 'Field: unknown field type: %s for %s' \
(field.type, field.name) % (field.type, field.name)
ftype = self.types[geotype] ftype = self.types[geotype]
if self.dbengine == 'postgres' and geotype == 'geometry': if self.dbengine == 'postgres' and geotype == 'geometry':
# parameters: schema, srid, dimension # parameters: schema, srid, dimension