--- ZSQLExtend/ZSQLExtend.py 2007/04/20 06:36:01 1.114 +++ ZSQLExtend/ZSQLExtend.py 2007/05/25 15:01:32 1.116 @@ -314,9 +314,8 @@ class ZSQLExtendFolder(Folder,Persistent logger("update xml",logging.INFO,queryStr) self.ZSQLSimpleSearch(queryStr) ret+="ud: %s \n"%field - else: - + else: fields=",".join(dataSet.keys()) values=",".join([""" %s """%self.ZSQLQuote(dataSet[x]) for x in dataSet.keys()]) @@ -325,101 +324,12 @@ class ZSQLExtendFolder(Folder,Persistent self.ZSQLSimpleSearch(queryStr) logger("update xml",logging.INFO,queryStr) - - - return ret - def importXMLFile(self,table,containerTagName,fieldNames,data=None,identify=None,filename=None,RESPONSE=None): - #TODO: finish importXMLFile - ''' - Import XML file into the table - @param table: name of the table the xml shall be imported into - @param containerTagName: XML-Tag which describes a dataset - @param file: xmlfile handle - @param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes. - @param RESPONSE: (optional) - ''' - ret="" - from xml.dom.pulldom import parseString - - doc=parseString(file.read()) - while 1: - node=doc.getEvent() - - if node is None: - break; - else: - if node[1].nodeName==containerTagName: - doc.expandNode(node[1]) - cols=node[1].getElementsByTagName('COL') - dataSet=[] - for col in cols: - data=col.getElementsByTagName('DATA') - dataSet.append(getTextFromNode(data[0])) - update=False - if identify: - - nr=fieldNames.index(identify) - field=dataSet[nr] - - searchStr="""select %s from %s where %s = '%s'"""%(identify,table,identify,field) - logger("import xml",logging.INFO,searchStr) - search=self.ZSQLSimpleSearch(searchStr) - if search: - update=True - - if update: - tmp=[] - for fieldName in fieldNames: - tmp.append("""%s = %s"""%(fieldName,self.ZSQLQuote(dataSet[fieldNames.index(fieldName)]))) - setStr=",".join(tmp) - nr=fieldNames.index(identify) - field=dataSet[nr] - - queryStr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,identify,field) - logger("update xml",logging.INFO,queryStr) - self.ZSQLSimpleSearch(queryStr) - ret+="ud: %s \n"%field - else: - - - fields=",".join(fieldNames) - values=",".join([""" %s """%self.ZSQLQuote(x) for x in dataSet]) - - - queryStr="""INSERT INTO %s (%s) VALUES (%s)"""%(table,fields,values) - self.ZSQLSimpleSearch(queryStr) - logger("update xml",logging.INFO,queryStr) - ret+="ad: %s \n"%field - - elif node[1].nodeName=="METADATA": - fieldNames=[] - doc.expandNode(node[1]) - - names=node[1].getElementsByTagName('FIELD') - - for name in names: - fieldNames.append(name.getAttribute('NAME')) - - logger("update xml: fieldnames",logging.INFO,repr(fieldNames)) - qstr="""select attname from pg_attribute, pg_class where attrelid = pg_class.oid and relname = '%s' """ - columns=[x.attname for x in self.ZSQLSimpleSearch(qstr%table)] - - for fieldName in fieldNames: - logger("update xml: fieldname",logging.INFO,repr(fieldName)) - if fieldName not in columns: - qstr="""alter table %s add %s %s""" - self.ZSQLSimpleSearch(qstr%(table,fieldName,'text')) - logger("update xml: fieldname add",logging.INFO,qstr%(table,fieldName,'text')) - #fn=node[1].getAttribute("xml:id") - #nf=file("xtf/"+fn+".xtf",'w') - #nf.write(""""""+node[1].toxml()+"") - #print "wrote: %s"%fn - - - def importXMLFileFMP(self,table,dsn=None,uploadfile=None,update_fields=None,id_field=None,sync_mode=False,replace=False,redirect_url=None,ascii_db=False,RESPONSE=None): + def importXMLFileFMP(self,table,dsn=None,uploadfile=None,update_fields=None,id_field=None,sync_mode=False, + lc_names=True,keep_fields=False,replace=False,ascii_db=False, + redirect_url=None,RESPONSE=None): ''' Import FileMaker XML file (FMPXMLRESULT format) into the table. @param dsn: database connection string @@ -428,13 +338,17 @@ class ZSQLExtendFolder(Folder,Persistent @param update_fields: (optional) list of fields to update; default is to create all fields @param id_field: (optional) field which uniquely identifies an entry for updating purposes. @param sync_mode: (optional) really synchronise, i.e. delete entries not in XML file + @param lc_names: (optional) lower case and clean up field names from XML + @param keep_fields: (optional) don't add fields to SQL database + @param ascii_db: (optional) assume ascii encoding in db + @param replace: (optional) delete and re-insert data @param RESPONSE: (optional) @param redirect_url: (optional) url for redirecting after the upload is done ''' tfilehd,filename=tempfile.mkstemp() tfile=os.fdopen(tfilehd,'w') - logging.error("import %s"%uploadfile) + logging.info("import %s"%uploadfile) for c in uploadfile.read(): tfile.write(c) tfile.close() @@ -451,15 +365,19 @@ class ZSQLExtendFolder(Folder,Persistent options.update_fields=update_fields options.id_field=id_field options.sync_mode=sync_mode + options.lc_names=lc_names options.replace_table=replace - options.lc_names=True + options.keep_fields=keep_fields options.ascii_db=ascii_db + options.replace_table=replace + importFMPXML(options) os.remove(filename) if RESPONSE and redirect_url: RESPONSE.redirect(redirect_url) + def generateIndex(self,field,index_name,table,RESPONSE=None): """erzeuge ein Index Objekt einem Feld (experimental) @@ -639,7 +557,7 @@ class ZSQLExtendFolder(Folder,Persistent return 1 return 0 - def ZSQLMultiSearch(self,_table,_searchField,_value,_idField,_additionalStatement="",_select=None,_storename=None): + def ZSQLMultiSearch(self,_table,_searchField,_value,_idField,_additionalStatement="",_select=None,_subselectAddition="",_storename=None): """ Durchsucht in einer Tabelle "table" die Spalte "searchfield" nach dem allen Vorkommnissen von Worten in value und gibt alle Werte mit gleichem id field zurŸck, d.h. es wird die "und" suche Ÿber mehrere Eintrsege in einer @@ -664,17 +582,16 @@ class ZSQLExtendFolder(Folder,Persistent if not _select: _select=_idField - queries.append("select %s from %s %s where lower(%s) like '%%%s%%'"%(_select,_table,_additionalStatement,_searchField,splitted[0].lower())) + query="select %s from %s %s where lower(%s) like '%%%s%%'"%(_select,_table,_additionalStatement,_searchField,splitted[0].lower()) - if len(splitted)>1: + if len(splitted)>1: # mehr als ein Wort + query+=" and %s in"%_idField # dann einschraenken for v in splitted[1:]: - queries.append("select %s from %s where lower(%s) like '%%%s%%'"%(_idField,_table,_searchField,v.lower())) + queries.append("select %s from %s %s where lower(%s) like '%%%s%%'"%(_idField,_table,_subselectAddition,_searchField,v.lower())) - q=" and %s in ("%_idField - query=q.join(queries) # nun baue sie zusammen - for i in range(len(queries)-1): - query+=")" #noch die klammern schliessen + intersect=" intersect ".join(queries) # nun baue sie zusammen + query+="(%s)"%intersect logging.info("ZSQLSimple: %s"%query)