--- ZSQLExtend/ZSQLExtend.py 2007/07/24 09:22:14 1.117 +++ ZSQLExtend/ZSQLExtend.py 2008/02/15 13:05:41 1.124 @@ -77,6 +77,15 @@ def utf8ify(str): else: return str.encode('utf-8') + +def setPsycopg2UseUnicode(): + """force Psycopg2DA to return unicode objects""" + try: + import psycopg2 + import psycopg2.extensions + psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) + except: + logging.error("Unable to force psycopg2 to use unicode") def sql_quote(v): @@ -348,8 +357,9 @@ class ZSQLExtendFolder(Folder,Persistent return ret - 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, + def importXMLFileFMP(self,tables,dsn=None,uploadfile=None,update_fields=None,id_field=None,sync_mode=False, + lc_names=True,keep_fields=False,ascii_db=False,replace=False,backup=False, + debug=False,log_to_response=False, redirect_url=None,RESPONSE=None): ''' Import FileMaker XML file (FMPXMLRESULT format) into the table. @@ -363,6 +373,7 @@ class ZSQLExtendFolder(Folder,Persistent @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 backup: (optional) create backup of old table (breaks indices) @param RESPONSE: (optional) @param redirect_url: (optional) url for redirecting after the upload is done ''' @@ -378,26 +389,53 @@ class ZSQLExtendFolder(Folder,Persistent if not dsn: dsn=self.getConnectionObj().connection_string - - options=Options() - options.dsn=dsn - options.table=table - options.filename=filename - 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.keep_fields=keep_fields - options.ascii_db=ascii_db - options.replace_table=replace + + tablelist=tables.split(',') + logging.debug("tablelist: %s" %tablelist) + #table=tables + + for table in tablelist : + logging.debug("table: %s" %table) + options=Options() + options.dsn=dsn + options.table=table + options.filename=filename + 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.keep_fields=keep_fields + options.ascii_db=ascii_db + options.replace_table=replace + options.backup_table=backup + options.debug=debug + + if RESPONSE and log_to_response: + # set up logging to response as plain text + RESPONSE.setHeader("Content-Type","text/plain; charset=utf-8") + RESPONSE.write("Import FMPXML file...\n\n") + loghandler = logging.StreamHandler(RESPONSE) + if debug: + loghandler.setLevel(logging.DEBUG) + else: + loghandler.setLevel(logging.INFO) + logger = logging.getLogger('db.import.fmpxml') + logger.addHandler(loghandler) + options.use_logger_instance = logger - importFMPXML(options) + importFMPXML(options) + + + if RESPONSE and log_to_response: + loghandler.flush() + RESPONSE.write("\n\n DONE!") + + elif RESPONSE and redirect_url: + RESPONSE.redirect(redirect_url) + os.remove(filename) - - if RESPONSE and redirect_url: - RESPONSE.redirect(redirect_url) def generateIndex(self,field,index_name,table,RESPONSE=None): @@ -443,6 +481,27 @@ class ZSQLExtendFolder(Folder,Persistent """ return urllib.quote(txt) + + def createIdSet(self, resultset, idField=None): + """returns a (frozen)set of IDs from a SQL-resultset (using idField) or a list (if idField=None)""" + logging.debug("createidset for idfield %s"%idField) + if idField is None: + return frozenset(resultset) + else: + idlist = [r[idField] for r in resultset] + return frozenset(idlist) + + def opIdSet(self, a, b, op): + """operate on sets a and b""" + logging.debug("opidset with op %s"%op) + if (op == 'intersect'): + return a.intersection(b) + elif (op == 'union'): + return a.union(b) + elif (op == 'diff'): + return a.difference(b) + + def searchRel(self,relStatement,statement,wherePart,classes): """suche relative haufigkeiten (experimental)""" ret={} @@ -497,13 +556,13 @@ class ZSQLExtendFolder(Folder,Persistent return pt() - def changeZSQLExtend(self,label,description,weight=0,REQUEST=None,connection_id=None): + def changeZSQLExtend(self,label,description,weight=0,connection_id=None,REQUEST=None,): """change the Konfiguration""" self.connection_id=connection_id self.weight=weight self.label=label self.description=description - + if REQUEST is not None: return self.manage_main(self, REQUEST) @@ -1216,30 +1275,25 @@ class ZSQLExtendFolder(Folder,Persistent """suche mit alten parametern bis auf die in argv getauschten""" if args: argv=args - + #get the old queries qs=self.REQUEST.SESSION[storename]['qs'] querys=qs.split(",") #which arguments are in the old query string - queryList={} for query in querys: arg=query.split("=")[0] if arg[0]=="_": arg="-"+arg[1:] # sicherstellen, dass an Anfang stets "_" try: - queryList[arg]=query.split("=")[1] + queryList[arg]=urllib.unquote_plus(query.split("=")[1]) except: queryList[arg]='' argList=[] arg="" - - - #gehe durch die zu aendernden Argumente for argTmp in argv.keys(): - arg=argTmp[0:]# sicherstellen, dass der string auh kopiert wird if arg[0]=="_": arg="-"+arg[1:] # sicherstellen, dass an Anfang stets "_" @@ -1251,6 +1305,7 @@ class ZSQLExtendFolder(Folder,Persistent str="ZSQLSearch?"+urllib.urlencode(queryList) return str + def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename="foundCount",tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None): """analysieren den QueryString"""