--- ZSQLExtend/ZSQLExtend.py 2007/05/25 15:01:32 1.116 +++ ZSQLExtend/ZSQLExtend.py 2007/12/11 15:47:52 1.123 @@ -56,6 +56,36 @@ def analyseIntSearch(word): else: return "BETWEEN "+splitted[0]+" AND "+splitted[1] +def unicodify(str): + """decode str (utf-8 or latin-1 representation) into unicode object""" + if not str: + return u"" + if type(str) is StringType: + try: + return str.decode('utf-8') + except: + return str.decode('latin-1') + else: + return str + +def utf8ify(str): + """encode unicode object or string into byte string in utf-8 representation""" + if not str: + return "" + if type(str) is StringType: + return 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): @@ -328,7 +358,8 @@ class ZSQLExtendFolder(Folder,Persistent 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, + 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. @@ -342,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 ''' @@ -370,11 +402,31 @@ class ZSQLExtendFolder(Folder,Persistent 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) os.remove(filename) + if RESPONSE and log_to_response: + loghandler.flush() + RESPONSE.write("\n\n DONE!") + return + if RESPONSE and redirect_url: RESPONSE.redirect(redirect_url) @@ -422,6 +474,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={} @@ -476,13 +549,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) @@ -491,7 +564,11 @@ class ZSQLExtendFolder(Folder,Persistent @param str: string der Formatiert werden soll. @param url: (optional) default ist "None", sonderfall erzeugt einen Link aus String mit unterliegender url """ - #url=None + #logging.debug("formatascii str=%s url=%s"%(repr(str),repr(url))) + + if not str: + return "" + str=str.rstrip().lstrip() if url and str: @@ -505,7 +582,9 @@ class ZSQLExtendFolder(Folder,Persistent retStr+="""%s
"""%(strUrl,word) str=retStr if str: - return re.sub(r"[\n]","
",str) + retStr = re.sub(r"[\n]","
",str) + #logging.debug("formatascii out=%s"%(repr(retStr))) + return retStr else: return "" @@ -878,11 +957,14 @@ class ZSQLExtendFolder(Folder,Persistent if (hasattr(self,"_v_searchSQL") and (self._v_searchSQL == None)) or (not hasattr(self,"_v_searchSQL")): self._v_searchSQL=Shared.DC.ZRDB.DA.DA("_v_searchSQL","_v_searchSQL",self.getConnectionObj().getId(),"var","") + #self._v_searchSQL=self.getConnectionObj()() self._v_searchSQL.max_rows_=max_rows + #self._v_searchSQL.set_client_encoding('UNICODE') try: logging.error("I am here") t=self._v_searchSQL.__call__(var=query) + #t=self._v_searchSQL.query(query) logging.error("I am here %s"%t) return t except : @@ -896,8 +978,10 @@ class ZSQLExtendFolder(Folder,Persistent try: self._v_searchSQL.max_rows_=max_rows - + #self._v_searchSQL.set_client_encoding('UNICODE') + return self._v_searchSQL.__call__(var=query) + #return self._v_searchSQL.query(query) except : logger("ZSQLSimpleSearch ERROR2",logging.ERROR, '%s %s'%sys.exc_info()[:2]) if sys.exc_info()[0]=="Database Error": @@ -1184,30 +1268,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 "_" @@ -1219,6 +1298,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""" @@ -2047,4 +2127,4 @@ def manage_addZSQLBibliography(self, id, - \ No newline at end of file +