support for self reference with non standard id
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.0.3 (2012-08-31 09:02:48) stable
|
Version 2.0.3 (2012-08-31 10:21:33) stable
|
||||||
|
|||||||
+49
-44
@@ -656,7 +656,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
drivers_available = [driver for driver in self.drivers
|
drivers_available = [driver for driver in self.drivers
|
||||||
if driver in globals()]
|
if driver in globals()]
|
||||||
if uri:
|
if uri:
|
||||||
items = uri.split('://')[0].split(':')
|
items = uri.split('://',1)[0].split(':')
|
||||||
request_driver = items[1] if len(items)>1 else None
|
request_driver = items[1] if len(items)>1 else None
|
||||||
else:
|
else:
|
||||||
request_driver = None
|
request_driver = None
|
||||||
@@ -703,6 +703,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
migrate=True,
|
migrate=True,
|
||||||
fake_migrate=False,
|
fake_migrate=False,
|
||||||
polymodel=None):
|
polymodel=None):
|
||||||
|
db = table._db
|
||||||
fields = []
|
fields = []
|
||||||
# PostGIS geo fields are added after the table has been created
|
# PostGIS geo fields are added after the table has been created
|
||||||
postcreation_fields = []
|
postcreation_fields = []
|
||||||
@@ -730,7 +731,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
else:
|
else:
|
||||||
if hasattr(table,'_primarykey'):
|
if hasattr(table,'_primarykey'):
|
||||||
rtablename,rfieldname = referenced.split('.')
|
rtablename,rfieldname = referenced.split('.')
|
||||||
rtable = table._db[rtablename]
|
rtable = db[rtablename]
|
||||||
rfield = rtable[rfieldname]
|
rfield = rtable[rfieldname]
|
||||||
# must be PK reference or unique
|
# must be PK reference or unique
|
||||||
if rfieldname in hasattr(rtable,'_primarykey') or \
|
if rfieldname in hasattr(rtable,'_primarykey') or \
|
||||||
@@ -752,8 +753,12 @@ 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 \
|
if referenced in db:
|
||||||
and table._db[referenced]._id.name or 'id'
|
id_fieldname = db[referenced]._id.name
|
||||||
|
elif referenced == tablename:
|
||||||
|
id_fieldname = table._id.name
|
||||||
|
else: #make a guess
|
||||||
|
id_fieldname = 'id'
|
||||||
ftype = types[field_type[:9]] % dict(
|
ftype = types[field_type[:9]] % dict(
|
||||||
index_name = field_name+'__idx',
|
index_name = field_name+'__idx',
|
||||||
field_name = field_name,
|
field_name = field_name,
|
||||||
@@ -840,7 +845,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
fields = ',\n '.join(fields)
|
fields = ',\n '.join(fields)
|
||||||
for rtablename in TFK:
|
for rtablename in TFK:
|
||||||
rfields = TFK[rtablename]
|
rfields = TFK[rtablename]
|
||||||
pkeys = table._db[rtablename]._primarykey
|
pkeys = db[rtablename]._primarykey
|
||||||
fkeys = [ rfields[k] for k in pkeys ]
|
fkeys = [ rfields[k] for k in pkeys ]
|
||||||
fields = fields + ',\n ' + \
|
fields = fields + ',\n ' + \
|
||||||
types['reference TFK'] % dict(
|
types['reference TFK'] % dict(
|
||||||
@@ -2023,7 +2028,7 @@ class SQLiteAdapter(BaseAdapter):
|
|||||||
if uri.startswith('sqlite:memory'):
|
if uri.startswith('sqlite:memory'):
|
||||||
dbpath = ':memory:'
|
dbpath = ':memory:'
|
||||||
else:
|
else:
|
||||||
dbpath = uri.split('://')[1]
|
dbpath = uri.split('://',1)[1]
|
||||||
if dbpath[0] != '/':
|
if dbpath[0] != '/':
|
||||||
dbpath = pjoin(
|
dbpath = pjoin(
|
||||||
self.folder.decode(path_encoding).encode('utf8'), dbpath)
|
self.folder.decode(path_encoding).encode('utf8'), dbpath)
|
||||||
@@ -2087,7 +2092,7 @@ class SpatiaLiteAdapter(SQLiteAdapter):
|
|||||||
if uri.startswith('spatialite:memory'):
|
if uri.startswith('spatialite:memory'):
|
||||||
dbpath = ':memory:'
|
dbpath = ':memory:'
|
||||||
else:
|
else:
|
||||||
dbpath = uri.split('://')[1]
|
dbpath = uri.split('://',1)[1]
|
||||||
if dbpath[0] != '/':
|
if dbpath[0] != '/':
|
||||||
dbpath = pjoin(
|
dbpath = pjoin(
|
||||||
self.folder.decode(path_encoding).encode('utf8'), dbpath)
|
self.folder.decode(path_encoding).encode('utf8'), dbpath)
|
||||||
@@ -2191,7 +2196,7 @@ class JDBCSQLiteAdapter(SQLiteAdapter):
|
|||||||
if uri.startswith('sqlite:memory'):
|
if uri.startswith('sqlite:memory'):
|
||||||
dbpath = ':memory:'
|
dbpath = ':memory:'
|
||||||
else:
|
else:
|
||||||
dbpath = uri.split('://')[1]
|
dbpath = uri.split('://',1)[1]
|
||||||
if dbpath[0] != '/':
|
if dbpath[0] != '/':
|
||||||
dbpath = pjoin(
|
dbpath = pjoin(
|
||||||
self.folder.decode(path_encoding).encode('utf8'), dbpath)
|
self.folder.decode(path_encoding).encode('utf8'), dbpath)
|
||||||
@@ -2283,8 +2288,8 @@ class MySQLAdapter(BaseAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^?]+)(\?set_encoding=(?P<charset>\w+))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^?]+)(\?set_encoding=(?P<charset>\w+))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
"Invalid URI string in DAL: %s" % self.uri
|
"Invalid URI string in DAL: %s" % self.uri
|
||||||
@@ -2408,8 +2413,8 @@ class PostgreSQLAdapter(BaseAdapter):
|
|||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.srid = srid
|
self.srid = srid
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[:2]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?sslmode=(?P<sslmode>.+))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?sslmode=(?P<sslmode>.+))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, "Invalid URI string in DAL"
|
raise SyntaxError, "Invalid URI string in DAL"
|
||||||
user = credential_decoder(m.group('user'))
|
user = credential_decoder(m.group('user'))
|
||||||
@@ -2631,8 +2636,8 @@ class JDBCPostgreSQLAdapter(PostgreSQLAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+)$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+)$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, "Invalid URI string in DAL"
|
raise SyntaxError, "Invalid URI string in DAL"
|
||||||
user = credential_decoder(m.group('user'))
|
user = credential_decoder(m.group('user'))
|
||||||
@@ -2758,10 +2763,10 @@ class OracleAdapter(BaseAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
if not 'threaded' in driver_args:
|
if not 'threaded' in driver_args:
|
||||||
driver_args['threaded']=True
|
driver_args['threaded']=True
|
||||||
def connect(uri=uri,driver_args=driver_args):
|
def connect(uri=ruri,driver_args=driver_args):
|
||||||
return self.driver.connect(uri,**driver_args)
|
return self.driver.connect(uri,**driver_args)
|
||||||
self.pool_connection(connect)
|
self.pool_connection(connect)
|
||||||
self.after_connection()
|
self.after_connection()
|
||||||
@@ -2909,10 +2914,10 @@ class MSSQLAdapter(BaseAdapter):
|
|||||||
self.srid = srid
|
self.srid = srid
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
# ## read: http://bytes.com/groups/python/460325-cx_oracle-utf8
|
# ## read: http://bytes.com/groups/python/460325-cx_oracle-utf8
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
if '@' not in uri:
|
if '@' not in ruri:
|
||||||
try:
|
try:
|
||||||
m = re.compile('^(?P<dsn>.+)$').match(uri)
|
m = re.compile('^(?P<dsn>.+)$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
'Parsing uri string(%s) has no result' % self.uri
|
'Parsing uri string(%s) has no result' % self.uri
|
||||||
@@ -2925,10 +2930,10 @@ class MSSQLAdapter(BaseAdapter):
|
|||||||
# was cnxn = 'DSN=%s' % dsn
|
# was cnxn = 'DSN=%s' % dsn
|
||||||
cnxn = dsn
|
cnxn = dsn
|
||||||
else:
|
else:
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?(?P<urlargs>.*))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?(?P<urlargs>.*))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
"Invalid URI string in DAL: %s" % uri
|
"Invalid URI string in DAL: %s" % self.uri
|
||||||
user = credential_decoder(m.group('user'))
|
user = credential_decoder(m.group('user'))
|
||||||
if not user:
|
if not user:
|
||||||
raise SyntaxError, 'User required'
|
raise SyntaxError, 'User required'
|
||||||
@@ -3105,10 +3110,10 @@ class SybaseAdapter(MSSQLAdapter):
|
|||||||
self.srid = srid
|
self.srid = srid
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
# ## read: http://bytes.com/groups/python/460325-cx_oracle-utf8
|
# ## read: http://bytes.com/groups/python/460325-cx_oracle-utf8
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
if '@' not in uri:
|
if '@' not in ruri:
|
||||||
try:
|
try:
|
||||||
m = re.compile('^(?P<dsn>.+)$').match(uri)
|
m = re.compile('^(?P<dsn>.+)$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
'Parsing uri string(%s) has no result' % self.uri
|
'Parsing uri string(%s) has no result' % self.uri
|
||||||
@@ -3119,10 +3124,10 @@ class SybaseAdapter(MSSQLAdapter):
|
|||||||
logger.error('NdGpatch error')
|
logger.error('NdGpatch error')
|
||||||
raise e
|
raise e
|
||||||
else:
|
else:
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?(?P<urlargs>.*))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?(?P<urlargs>.*))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
"Invalid URI string in DAL: %s" % uri
|
"Invalid URI string in DAL: %s" % self.uri
|
||||||
user = credential_decoder(m.group('user'))
|
user = credential_decoder(m.group('user'))
|
||||||
if not user:
|
if not user:
|
||||||
raise SyntaxError, 'User required'
|
raise SyntaxError, 'User required'
|
||||||
@@ -3222,10 +3227,10 @@ class FireBirdAdapter(BaseAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+?)(\?set_encoding=(?P<charset>\w+))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+?)(\?set_encoding=(?P<charset>\w+))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, "Invalid URI string in DAL: %s" % uri
|
raise SyntaxError, "Invalid URI string in DAL: %s" % self.uri
|
||||||
user = credential_decoder(m.group('user'))
|
user = credential_decoder(m.group('user'))
|
||||||
if not user:
|
if not user:
|
||||||
raise SyntaxError, 'User required'
|
raise SyntaxError, 'User required'
|
||||||
@@ -3279,8 +3284,8 @@ class FireBirdEmbeddedAdapter(FireBirdAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<path>[^\?]+)(\?set_encoding=(?P<charset>\w+))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<path>[^\?]+)(\?set_encoding=(?P<charset>\w+))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
"Invalid URI string in DAL: %s" % self.uri
|
"Invalid URI string in DAL: %s" % self.uri
|
||||||
@@ -3385,8 +3390,8 @@ class InformixAdapter(BaseAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+)$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+)$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
"Invalid URI string in DAL: %s" % self.uri
|
"Invalid URI string in DAL: %s" % self.uri
|
||||||
@@ -3487,8 +3492,8 @@ class DB2Adapter(BaseAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
cnxn = uri.split('://', 1)[1]
|
ruri = uri.split('://', 1)[1]
|
||||||
def connect(cnxn=cnxn,driver_args=driver_args):
|
def connect(cnxn=ruri,driver_args=driver_args):
|
||||||
return self.driver.connect(cnxn,**driver_args)
|
return self.driver.connect(cnxn,**driver_args)
|
||||||
self.pool_connection(connect)
|
self.pool_connection(connect)
|
||||||
self.after_connection()
|
self.after_connection()
|
||||||
@@ -3550,8 +3555,8 @@ class TeradataAdapter(BaseAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
cnxn = uri.split('://', 1)[1]
|
ruri = uri.split('://', 1)[1]
|
||||||
def connect(cnxn=cnxn,driver_args=driver_args):
|
def connect(cnxn=ruri,driver_args=driver_args):
|
||||||
return self.driver.connect(cnxn,**driver_args)
|
return self.driver.connect(cnxn,**driver_args)
|
||||||
self.pool_connection(connect)
|
self.pool_connection(connect)
|
||||||
self.after_connection()
|
self.after_connection()
|
||||||
@@ -3764,8 +3769,8 @@ class SAPDBAdapter(BaseAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?sslmode=(?P<sslmode>.+))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)(\?sslmode=(?P<sslmode>.+))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, "Invalid URI string in DAL"
|
raise SyntaxError, "Invalid URI string in DAL"
|
||||||
user = credential_decoder(m.group('user'))
|
user = credential_decoder(m.group('user'))
|
||||||
@@ -3805,8 +3810,8 @@ class CubridAdapter(MySQLAdapter):
|
|||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.find_or_make_work_folder()
|
self.find_or_make_work_folder()
|
||||||
uri = uri.split('://')[1]
|
ruri = uri.split('://',1)[1]
|
||||||
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^?]+)(\?set_encoding=(?P<charset>\w+))?$').match(uri)
|
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^?]+)(\?set_encoding=(?P<charset>\w+))?$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, \
|
raise SyntaxError, \
|
||||||
"Invalid URI string in DAL: %s" % self.uri
|
"Invalid URI string in DAL: %s" % self.uri
|
||||||
@@ -3937,10 +3942,10 @@ class GoogleSQLAdapter(UseDatabaseStoredFile,MySQLAdapter):
|
|||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
self.folder = folder or pjoin('$HOME',thread.folder.split(
|
self.folder = folder or pjoin('$HOME',thread.folder.split(
|
||||||
os.sep+'applications'+os.sep,1)[1])
|
os.sep+'applications'+os.sep,1)[1])
|
||||||
uri = uri.split("://")[1]
|
ruri = uri.split("://")[1]
|
||||||
m = re.compile('^(?P<instance>.*)/(?P<db>.*)$').match(uri)
|
m = re.compile('^(?P<instance>.*)/(?P<db>.*)$').match(ruri)
|
||||||
if not m:
|
if not m:
|
||||||
raise SyntaxError, "Invalid URI string in SQLDB: %s" % uri
|
raise SyntaxError, "Invalid URI string in SQLDB: %s" % self.uri
|
||||||
instance = credential_decoder(m.group('instance'))
|
instance = credential_decoder(m.group('instance'))
|
||||||
self.dbstring = db = credential_decoder(m.group('db'))
|
self.dbstring = db = credential_decoder(m.group('db'))
|
||||||
driver_args['instance'] = instance
|
driver_args['instance'] = instance
|
||||||
|
|||||||
Reference in New Issue
Block a user