comparison RestDbInterface.py @ 31:6d2055f1b4fa

more work on types
author casties
date Tue, 31 Aug 2010 10:54:00 +0200
parents 51db9e78bf98
children c732c2ff61d9
comparison
equal deleted inserted replaced
30:51db9e78bf98 31:6d2055f1b4fa
48 s = re.sub(r'[^A-Za-z0-9_]','_',s) 48 s = re.sub(r'[^A-Za-z0-9_]','_',s)
49 if lc: 49 if lc:
50 return s.lower() 50 return s.lower()
51 51
52 return s 52 return s
53
54 gisToSqlTypeMap = {
55 "text": "text",
56 "number": "number",
57 "id": "text",
58 "gis_id": "integer",
59 "coord_lat": "float",
60 "coord_lon": "float"
61 }
53 62
54 class RestDbInterface(Folder): 63 class RestDbInterface(Folder):
55 """Object for RESTful database queries 64 """Object for RESTful database queries
56 path schema: /db/{schema}/{table}/ 65 path schema: /db/{schema}/{table}/
57 omitting table gives a list of schemas 66 omitting table gives a list of schemas
153 return {"fields":fields, "rows":data} 162 return {"fields":fields, "rows":data}
154 else: 163 else:
155 cur.close() 164 cur.close()
156 return None 165 return None
157 166
167 def setTableMetaTypes(self,schema,table,fields):
168 """sets the GIS meta information for table"""
169 logging.debug("settablemetatypes schema=%s, table=%s, fields=%s"%(schema,table,fields))
170 # TODO: what now?
158 171
159 def publishTraverse(self,request,name): 172 def publishTraverse(self,request,name):
160 """change the traversal""" 173 """change the traversal"""
161 # get stored path 174 # get stored path
162 path = request.get('restdb_path', []) 175 path = request.get('restdb_path', [])
245 fieldsStr = REQUEST.get("create_table_fields",None) 258 fieldsStr = REQUEST.get("create_table_fields",None)
246 logging.debug("put with schema=%s table=%s file=%s fields=%s"%(schema,tablename,file,repr(fieldsStr))) 259 logging.debug("put with schema=%s table=%s file=%s fields=%s"%(schema,tablename,file,repr(fieldsStr)))
247 if fieldsStr is not None: 260 if fieldsStr is not None:
248 # unpack fields 261 # unpack fields
249 fields = [{"name":n, "type": t} for (n,t) in [f.split(":") for f in fieldsStr.split(",")]] 262 fields = [{"name":n, "type": t} for (n,t) in [f.split(":") for f in fieldsStr.split(",")]]
263
250 ret = self.createTableFromXML(schema, tablename, file, fields) 264 ret = self.createTableFromXML(schema, tablename, file, fields)
251 # return the result as JSON 265 # return the result as JSON
252 format = REQUEST.get("format","JSON") 266 format = REQUEST.get("format","JSON")
253 if format == "JSON": 267 if format == "JSON":
254 RESPONSE.setHeader("Content-Type", "application/json") 268 RESPONSE.setHeader("Content-Type", "application/json")
397 for f in fields: 411 for f in fields:
398 if isinstance(f,dict): 412 if isinstance(f,dict):
399 # {name: XX, type: YY} 413 # {name: XX, type: YY}
400 name = sqlName(f['name']) 414 name = sqlName(f['name'])
401 type = f['type'] 415 type = f['type']
416 sqltype = gisToSqlTypeMap[type]
402 417
403 else: 418 else:
404 # name only 419 # name only
405 name = sqlName(f) 420 name = sqlName(f)
406 type = 'text' 421 type = 'text'
422 sqltype = 'text'
407 423
408 sqlFields.append({'name':name, 'type':type}) 424 sqlFields.append({'name':name, 'type':type, 'sqltype':sqltype})
409 425
410 # drop table if it exists 426 self.executeSQL('drop table if exists "%s"."%s"'%(schema,table),hasResult=False)
411 try: 427 fieldString = ", ".join(['"%s" %s'%(f['name'],f['sqltype']) for f in sqlFields])
412 res = self.executeSQL('select * from "%s"."%s" where 1=0'%(schema,table))
413 logging.debug("createemptytable: table %s.%s exists"%(schema,table))
414 self.executeSQL('drop table "%s"."%s"'%(schema,table),hasResult=False)
415 except:
416 pass
417
418 fieldString = ", ".join(['"%s" %s'%(f['name'],f['type']) for f in sqlFields])
419 sqlString = 'create table "%s"."%s" (%s)'%(schema,table,fieldString) 428 sqlString = 'create table "%s"."%s" (%s)'%(schema,table,fieldString)
420 logging.debug("createemptytable: SQL=%s"%sqlString) 429 logging.debug("createemptytable: SQL=%s"%sqlString)
421 self.executeSQL(sqlString,hasResult=False) 430 self.executeSQL(sqlString,hasResult=False)
431 self.setTableMetaTypes(schema,table,sqlFields)
422 return sqlFields 432 return sqlFields
423 433
424 def createTableFromXML(self,schema,table,data, fields=None): 434 def createTableFromXML(self,schema,table,data, fields=None):
425 """create or replace a table with the given XML data""" 435 """create or replace a table with the given XML data"""
426 logging.debug("createTableFromXML schema=%s table=%s data=%s fields=%s"%(schema,table,data,fields)) 436 logging.debug("createTableFromXML schema=%s table=%s data=%s fields=%s"%(schema,table,data,fields))
485 # return just field names 495 # return just field names
486 return xmlFields 496 return xmlFields
487 497
488 # create table 498 # create table
489 if fields is None: 499 if fields is None:
490 sqlFields = self.createEmptyTable(schema, table, xmlFields) 500 fields = xmlFields
501
502 sqlFields = self.createEmptyTable(schema, table, fields)
491 numFields = len(sqlFields) 503 numFields = len(sqlFields)
492 fieldString = ", ".join(['"%s"'%f['name'] for f in sqlFields]) 504 fieldString = ", ".join(['"%s"'%f['name'] for f in sqlFields])
493 valString = ", ".join(["%s" for f in sqlFields]) 505 valString = ", ".join(["%s" for f in sqlFields])
494 sqlInsert = 'insert into "%s"."%s" (%s) values (%s)'%(schema,table,fieldString,valString) 506 sqlInsert = 'insert into "%s"."%s" (%s) values (%s)'%(schema,table,fieldString,valString)
495 #logging.debug("importexcelsql: sqlInsert=%s"%sqlInsert) 507 #logging.debug("importexcelsql: sqlInsert=%s"%sqlInsert)