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
+20 -10
View File
@@ -638,23 +638,31 @@ 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 not '.' in referenced \
and referenced != tablename) \
and hasattr(table,'_primarykey'):
ftype = self.types['integer']
else:
if hasattr(table,'_primarykey'): if hasattr(table,'_primarykey'):
rtablename,rfieldname = referenced.split('.') rtablename,rfieldname = referenced.split('.')
rtable = table._db[rtablename] rtable = table._db[rtablename]
rfield = rtable[rfieldname] rfield = rtable[rfieldname]
# must be PK reference or unique # must be PK reference or unique
if rfieldname in rtable._primarykey or rfield.unique: if rfieldname in rtable._primarykey or rfield.unique:
ftype = self.types[rfield.type[:9]] % dict(length=rfield.length) ftype = self.types[rfield.type[:9]] % \
dict(length=rfield.length)
# multicolumn primary key reference? # multicolumn primary key reference?
if not rfield.unique and len(rtable._primarykey)>1 : if not rfield.unique and len(rtable._primarykey)>1:
# then it has to be a table level FK # then it has to be a table level FK
if rtablename not in TFK: if rtablename not in TFK:
TFK[rtablename] = {} TFK[rtablename] = {}
TFK[rtablename][rfieldname] = field.name TFK[rtablename][rfieldname] = field.name
else: else:
ftype = ftype + \ ftype = ftype + self.types['reference FK'] \
self.types['reference FK'] %dict(\ % dict(
constraint_name=constraint_name, constraint_name=constraint_name,
table_name=tablename, table_name=tablename,
field_name=field.name, field_name=field.name,
@@ -662,12 +670,14 @@ class BaseAdapter(ConnectionPool):
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]] % \
dict(table_name=tablename,
field_name=field.name, field_name=field.name,
constraint_name=constraint_name, constraint_name=constraint_name,
foreign_key=referenced + ('(%s)' % id_fieldname), foreign_key=referenced + \
('(%s)' % id_fieldname),
on_delete_action=field.ondelete) 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]]
@@ -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