Diff for /ZSQLExtend/ZSQLExtend.py between versions 1.121 and 1.144

version 1.121, 2007/11/13 19:29:02 version 1.144, 2012/09/03 13:06:11
Line 5  import urllib Line 5  import urllib
 import re  import re
 import string  import string
 #from pyPgSQL import libpq  #from pyPgSQL import libpq
   import psycopg2
 from AccessControl import getSecurityManager,Unauthorized  from AccessControl import getSecurityManager,Unauthorized
 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate  from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile  from Products.PageTemplates.PageTemplateFile import PageTemplateFile
   
 from Products.ZSQLMethods.SQL import SQLConnectionIDs  from Products.ZSQLMethods.SQL import SQLConnectionIDs
   from Shared.DC.ZRDB.Results import Results
   
 from xml.sax.saxutils import escape  from xml.sax.saxutils import escape
 from types import *  from types import *
 import Shared.DC.ZRDB.DA  import Shared.DC.ZRDB.DA
Line 96  def sql_quote(v): Line 99  def sql_quote(v):
             v=string.join(string.split(v,dkey),quote_dict[dkey])              v=string.join(string.split(v,dkey),quote_dict[dkey])
     return "'%s'" % v      return "'%s'" % v
   
 def showSQLConnectionIDs(self):  #def showSQLConnectionIDs(self):
     return SQLConnectionIDs(self)  #    return SQLConnectionIDs(self)
   
 class Options:  class Options:
     """options class"""      """options class"""
Line 123  class ZSQLExtendFolder(Folder,Persistent Line 126  class ZSQLExtendFolder(Folder,Persistent
     """      """
     meta_type="ZSQLExtendFolder"      meta_type="ZSQLExtendFolder"
           
       #primaryKeys={}
       #primaryKey=
       
       def getSQLConnectionIDs(self):
           logging.debug(SQLConnectionIDs(self))
           return SQLConnectionIDs(self)
       
       def getPrimaryKey(self,table=None):
           """returns primary key for the database"""
           if table is None:
               return getattr(self,'primaryKey','oid')
           
           
           
           pks= getattr(self, "primaryKeys",{})
           
           k = pks.get(table,None)
           
           if k is None:
               logging.debug("getPrimaryKey: no primary key for table %s stored use standard key %s"%(table,getattr(self,'primaryKey','oid')))
               logging.debug(pks)
               return getattr(self,'primaryKey','oid')
           
           return k
       
   
       def getPrimaryKeysAsString(self):
           """get all keys"""
           
           if not hasattr(self, 'primaryKeys'):
               return ""
       
           return ";".join(["%s:%s"%val for val in self.primaryKeys.items()])
           
       
     def ZSQLQuote(self,str):      def ZSQLQuote(self,str):
         """quote str for sql"""          """quote str for sql"""
         return sql_quote(str)          return sql_quote(str)
           
       def unicodify(self, s):
           """return unicode object for string (utf-8 or latin1) or unicode object s"""
           return unicodify(s)
       
       def utf8ify(self, s):
           """return utf-8 encoded string object for string or unicode object s"""
           return utf8ify(s)
   
           
     def normalizeField(self,table,fieldname, newFieldName=None,mode="alter", RESPONSE=None):      def normalizeField(self,table,fieldname, newFieldName=None,mode="alter", RESPONSE=None):
         """normalize a field, d.h. entfernt alle diakritischen Zeichen und ersetzt diese           """normalize a field, d.h. entfernt alle diakritischen Zeichen und ersetzt diese 
Line 152  class ZSQLExtendFolder(Folder,Persistent Line 198  class ZSQLExtendFolder(Folder,Persistent
             qstr="""alter table %s add %s %s"""              qstr="""alter table %s add %s %s"""
             self.ZSQLSimpleSearch(qstr%(table,newFieldName,'text'))              self.ZSQLSimpleSearch(qstr%(table,newFieldName,'text'))
                   
         qstr="select oid,%s from %s"%(fieldname,table)          qstr="select %s from %s"%(fieldname,table)
         for result in self.ZSQLSimpleSearch(qstr):          for result in self.ZSQLSimpleSearch(qstr):
             qstr="update %s set %s = %s where oid = %s"              qstr="update %s set %s = %s where "+self.getPrimaryKey()+" = %s"
   
             self.ZSQLSimpleSearch(qstr%(table,newFieldName,self.ZSQLQuote(normal(getattr(result,fieldname))),result.oid))              self.ZSQLSimpleSearch(qstr%(table,newFieldName,self.ZSQLQuote(normal(getattr(result,fieldname))),getattr(result,self.getPrimaryKey)))
                   
     def importAccessModell(self,configFileName,RESPONSE=None):      def importAccessModell(self,configFileName,RESPONSE=None):
         """import tables from access          """import tables from access
Line 361  class ZSQLExtendFolder(Folder,Persistent Line 407  class ZSQLExtendFolder(Folder,Persistent
                          lc_names=True,keep_fields=False,ascii_db=False,replace=False,backup=False,                           lc_names=True,keep_fields=False,ascii_db=False,replace=False,backup=False,
                          debug=False,log_to_response=False,                           debug=False,log_to_response=False,
                          redirect_url=None,RESPONSE=None):                           redirect_url=None,RESPONSE=None):
         '''          """
         Import FileMaker XML file (FMPXMLRESULT format) into the table.          Import FileMaker XML file (FMPXMLRESULT format) into the table.
         @param dsn: database connection string          @param dsn: database connection string
         @param table: name of the table the xml shall be imported into          @param table: name of the table the xml shall be imported into (may be comma-separated list)
         @param uploadfile: xmlfile file          @param uploadfile: xmlfile file
         @param update_fields: (optional) list of fields to update; default is to create all fields          @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 id_field: (optional) field which uniquely identifies an entry for updating purposes.
Line 376  class ZSQLExtendFolder(Folder,Persistent Line 422  class ZSQLExtendFolder(Folder,Persistent
         @param backup: (optional) create backup of old table (breaks indices)          @param backup: (optional) create backup of old table (breaks indices)
         @param RESPONSE: (optional)          @param RESPONSE: (optional)
         @param redirect_url: (optional) url for redirecting after the upload is done          @param redirect_url: (optional) url for redirecting after the upload is done
         '''          """
                   
         tfilehd,filename=tempfile.mkstemp()          tfilehd,filename=tempfile.mkstemp()
         tfile=os.fdopen(tfilehd,'w')          tfile=os.fdopen(tfilehd,'w')
         logging.info("import %s"%uploadfile)          logging.info("importXMLFileFMP: importing %s"%uploadfile)
         for c in uploadfile.read():          for c in uploadfile.read():
             tfile.write(c)              tfile.write(c)
         tfile.close()            tfile.close()  
Line 390  class ZSQLExtendFolder(Folder,Persistent Line 436  class ZSQLExtendFolder(Folder,Persistent
         if not dsn:          if not dsn:
             dsn=self.getConnectionObj().connection_string              dsn=self.getConnectionObj().connection_string
                           
           logging.debug("dsn: %s"%dsn)
           logging.debug("table: %s"%table)
           logging.debug("update_fields: %s"%update_fields)
           logging.debug("id_field: %s"%id_field)
           logging.debug("sync_mode: %s"%sync_mode)
           logging.debug("lc_names: %s"%lc_names)
           logging.debug("keep_fields: %s"%keep_fields)
           logging.debug("ascii_db: %s"%ascii_db)
           logging.debug("replace: %s"%replace)
           logging.debug("backup: %s"%backup)
           logging.debug("debug: %s"%debug)
           logging.debug("log_to_response: %s"%log_to_response)
           logging.debug("RESPONSE: %s"%repr(RESPONSE))
   
           tablelist=table.split(',')
           logging.debug("tablelist: %s"%tablelist)
           #table=tables
           
           for t in tablelist :   
               logging.debug("table: %s"%table)  
         options=Options()          options=Options()
         options.dsn=dsn          options.dsn=dsn
         options.table=table              options.table=t
         options.filename=filename          options.filename=filename
         options.update_fields=update_fields          options.update_fields=update_fields
         options.id_field=id_field          options.id_field=id_field
Line 404  class ZSQLExtendFolder(Folder,Persistent Line 470  class ZSQLExtendFolder(Folder,Persistent
         options.replace_table=replace          options.replace_table=replace
         options.backup_table=backup          options.backup_table=backup
         options.debug=debug          options.debug=debug
                       logging.debug(options)
         if RESPONSE and log_to_response:          if RESPONSE and log_to_response:
             # set up logging to response as plain text              # set up logging to response as plain text
                   logging.debug("Setting up logging to RESPONSE")
             RESPONSE.setHeader("Content-Type","text/plain; charset=utf-8")              RESPONSE.setHeader("Content-Type","text/plain; charset=utf-8")
             RESPONSE.write("Import FMPXML file...\n\n")              RESPONSE.write("Import FMPXML file...\n\n")
                   RESPONSE.flush()
             loghandler = logging.StreamHandler(RESPONSE)              loghandler = logging.StreamHandler(RESPONSE)
             if debug:              if debug:
                 loghandler.setLevel(logging.DEBUG)                  loghandler.setLevel(logging.DEBUG)
Line 418  class ZSQLExtendFolder(Folder,Persistent Line 486  class ZSQLExtendFolder(Folder,Persistent
             logger.addHandler(loghandler)              logger.addHandler(loghandler)
             options.use_logger_instance = logger              options.use_logger_instance = logger
   
               try:
                   err = None
         importFMPXML(options)          importFMPXML(options)
                           logging.info("importXMLFileFMP: done")
         os.remove(filename)              except Exception, err:
                   logging.error("Error importing: %s"%err)                                    
                   
         if RESPONSE and log_to_response:          if RESPONSE and log_to_response:
             loghandler.flush()              loghandler.flush()
                   if err is not None:
                       RESPONSE.write("\n\nERROR while importing: %s"%err)
                   else:
             RESPONSE.write("\n\n DONE!")              RESPONSE.write("\n\n DONE!")
             return  
                   
         if RESPONSE and redirect_url:              elif RESPONSE and redirect_url:
             RESPONSE.redirect(redirect_url)              RESPONSE.redirect(redirect_url)
   
           os.remove(filename)
   
                           
     def generateIndex(self,field,index_name,table,RESPONSE=None):      def generateIndex(self,field,index_name,table,RESPONSE=None):
         """erzeuge ein Index Objekt einem Feld (experimental)          """erzeuge ein Index Objekt einem Feld (experimental)
Line 439  class ZSQLExtendFolder(Folder,Persistent Line 514  class ZSQLExtendFolder(Folder,Persistent
                   
                   
         index={}          index={}
         founds=self.ZSQLSimpleSearch("""SELECT %s,oid FROM %s """%(field,table))          founds=self.ZSQLSimpleSearch("""SELECT %s FROM %s """%(field,table))
   
         for found in founds:          for found in founds:
             tmp=getattr(found,field,None)              tmp=getattr(found,field,None)
Line 447  class ZSQLExtendFolder(Folder,Persistent Line 522  class ZSQLExtendFolder(Folder,Persistent
                 strings=tmp.split(" ")                  strings=tmp.split(" ")
                 for string in strings:                  for string in strings:
                     if index.get(string):                      if index.get(string):
                         index[string].append(found.oid)                          index[string].append(gettr(found,self.getPrimaryKey()))
                     else:                      else:
                         index[string]=[found.oid]                          index[string]=[gettr(found,self.getPrimaryKey())]
                     RESPONSE.write(string+"\n")                      RESPONSE.write(string+"\n")
                           
         if not hasattr(self,index_name):          if not hasattr(self,index_name):
Line 469  class ZSQLExtendFolder(Folder,Persistent Line 544  class ZSQLExtendFolder(Folder,Persistent
           
                           
     def URLquote(self,txt):      def URLquote(self,txt):
         """urlquote"          """urlquote
         @param txt: text der urlgequoted werden soll.          @param txt: text der urlgequoted werden soll.
         """          """
         return urllib.quote(txt)          return urllib.quote(txt)
Line 477  class ZSQLExtendFolder(Folder,Persistent Line 552  class ZSQLExtendFolder(Folder,Persistent
           
     def createIdSet(self, resultset, idField=None):      def createIdSet(self, resultset, idField=None):
         """returns a (frozen)set of IDs from a SQL-resultset (using idField) or a list (if 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:          if idField is None:
             return frozenset(resultset)              return frozenset(resultset)
         else:          else:
Line 485  class ZSQLExtendFolder(Folder,Persistent Line 561  class ZSQLExtendFolder(Folder,Persistent
                   
     def opIdSet(self, a, b, op):      def opIdSet(self, a, b, op):
         """operate on sets a and b"""          """operate on sets a and b"""
           logging.debug("opidset with op %s"%op)
         if (op == 'intersect'):          if (op == 'intersect'):
             return a.intersection(b)              return a.intersection(b)
         elif (op == 'union'):          elif (op == 'union'):
Line 547  class ZSQLExtendFolder(Folder,Persistent Line 624  class ZSQLExtendFolder(Folder,Persistent
         return pt()          return pt()
   
   
     def changeZSQLExtend(self,label,description,weight=0,connection_id=None,REQUEST=None,):      def changeZSQLExtend(self,label,description,primaryKey,primaryKeys="",weight=0,connection_id=None,autocommit=None,REQUEST=None,):
         """change the Konfiguration"""          """change the Konfiguration"""
         self.connection_id=connection_id          self.connection_id=connection_id
         self.weight=weight          self.weight=weight
         self.label=label          self.label=label
         self.description=description          self.description=description
           self.autocommit = (autocommit == "on")
           self.primaryKey=primaryKey 
                       
           if primaryKeys.lstrip().rstrip()!="":
               
               for vals in primaryKeys.split(";"):
                   splitted=vals.split(":")
                   if len(splitted)<2:
                         if REQUEST is not None:
                             return """<html><body>Wrong Syntax of keystring: %s<br/> %s is not of the form TABLE:key.</body></html>"""%(primaryKeys,vals)
                   
                   self.primaryKeys[splitted[0]]=splitted[1]
                   
                            
               
               
                                           
         if REQUEST is not None:          if REQUEST is not None:
             return self.manage_main(self, REQUEST)              return self.manage_main(self, REQUEST)
Line 637  class ZSQLExtendFolder(Folder,Persistent Line 730  class ZSQLExtendFolder(Folder,Persistent
     def ZSQLMultiSearch(self,_table,_searchField,_value,_idField,_additionalStatement="",_select=None,_subselectAddition="",_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           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          von Worten in value und gibt alle Werte mit gleichem id field zurueck, d.h. es wird die "und" suche ueber mehrere Eintrsege in einer
         Tabelle mit gleichem idField werd realisiert,           Tabelle mit gleichem idField werd realisiert, 
         z.B. fŸr simplesearch ueber mehrere Felder          z.B. fuer simplesearch ueber mehrere Felder
         @param _table: Tabelle, die durchsucht werden soll.          @param _table: Tabelle, die durchsucht werden soll.
         @param _searchField: Feld, das durchsucht wird          @param _searchField: Feld, das durchsucht wird
         @param _value: String der gesucht werden soll, gesucht wird nach allen Worten des Strings, die durch " "-getrennt sind.          @param _value: String der gesucht werden soll, gesucht wird nach allen Worten des Strings, die durch " "-getrennt sind.
         @param _idField: Feld mit id fŸr die identifikation gleicher EintrŠge          @param _idField: Feld mit id fuer die identifikation gleicher Eintraege
         @param _additionalStatement: (optional) Zusaetzliches SQL Statement, dass zwischen dem ersten "select from" und dem ersten "where" eingegefŸgt wird.          @param _additionalStatement: (optional) Zusaetzliches SQL Statement, dass zwischen dem ersten "select from" und dem ersten "where" eingegefuegt wird.
         @param _select: (optional) Alternativer Wert fŸr den ersten SELECT Aufruf.          @param _subselectAddition: (optiona) Zusaetliche SQL Statement die hinter das select statement der subselects eingefuegt werde.
           @param _select: (optional) Alternativer Wert fuer den ersten SELECT Aufruf.
         @param _storename: (optional) Name fuer die Zwischenspeicherung von Werten in der Session          @param _storename: (optional) Name fuer die Zwischenspeicherung von Werten in der Session
         """          """
         if _storename:          if _storename:
Line 890  class ZSQLExtendFolder(Folder,Persistent Line 984  class ZSQLExtendFolder(Folder,Persistent
           
     def ZSQLInlineSearch(self,storename=None,args=None,**argv):      def ZSQLInlineSearch(self,storename=None,args=None,**argv):
         """inlinesearch"""          """inlinesearch"""
                  #logging.debug("ZSQLInlineSearch args=%s argv=%s"%(args,argv))
         qs=[]          qs=[]
         if storename:          if storename:
             """store"""              """store"""
         else:          else:
             storename="foundCount"              storename="foundCount"
                           
       
   
         if args:          if args:
             argTmp=args              argTmp=args
         else:          else:
Line 912  class ZSQLExtendFolder(Folder,Persistent Line 1004  class ZSQLExtendFolder(Folder,Persistent
             if type(argTmp[a]) is ListType: # ein parameter zweimal              if type(argTmp[a]) is ListType: # ein parameter zweimal
                     value=""                      value=""
                     #TODO find a better solution, currently only the last non empty entry is used.                      #TODO find a better solution, currently only the last non empty entry is used.
                     for x in argTmp[a]:                      #for x in argTmp[a]:
                         if x:                      #    if x:
                             value=x                      #        value=x
                       # version: join with spaces (makes sense with checkbox and -op=all)
                       value = " ".join(argTmp[a])
             else:              else:
                                 try:
                 value=str(argTmp[a])                  value=str(argTmp[a])
             qs.append(aFiltered+"="+urllib.quote(value))                 except:
                   value=utf8ify(argTmp[a])
                           
               qs.append(aFiltered+"="+urllib.quote(value))
               #logging.debug("InlineSearch:"+string.join(qs,","))
                                   
         #return []            #return []  
   
Line 944  class ZSQLExtendFolder(Folder,Persistent Line 1041  class ZSQLExtendFolder(Folder,Persistent
         except:          except:
             logger("ZSQLResetConnection",logging.ERROR, '%s %s'%sys.exc_info()[:2])              logger("ZSQLResetConnection",logging.ERROR, '%s %s'%sys.exc_info()[:2])
   
   
     def ZSQLSimpleSearch(self,query=None,max_rows=1000000):      def ZSQLSimpleSearch(self,query=None,max_rows=1000000):
           """new simple search"""
           logging.debug("new ZSQLSimpleSearch %s"%query)
           # get Connection instance
           con = self.getConnectionObj()
           # call to get db object
           dbc = con()
           if getattr(self, 'autocommit', False):
               # force transaction isolation level (for psycopg2 0=autocommit)
               logging.debug("  old tilevel=%s"%dbc.tilevel)
               dbc.tilevel = 0
               # modified code from ZPsycopgDA.db without _register:
               c = dbc.getcursor()
               desc = ()
               r = []
               try:
                   try:
                       c.execute(query)
                       
                   except psycopg2.OperationalError:
                       #logging.exception("Operational error on connection, closing it.")
                       try:
                           # Only close our connection
                           dbc.putconn(True)
                       except:
                           #logging.debug("Something went wrong when we tried to close the pool", exc_info=True)
                           pass
                       
                   if c.description is not None:
                       if max_rows:
                           r = c.fetchmany(max_rows)
                       else:
                           r = c.fetchall()
                       desc = c.description
                       
                   dbc.failures = 0
       
               except StandardError, err:
                   raise err
               
               res = (dbc.convert_description(desc), r)
               
           else:
               logging.debug("  no autocommit")
               # just use DA's query method
               res = dbc.query(query, max_rows=max_rows)
               
           # return result set as Result object with Brains
           return Results(res)
           
       def oldZSQLSimpleSearch(self,query=None,max_rows=1000000):
         """simple search"""          """simple search"""
         logging.error("ZSQLSimpleSearch X %s"%query)          logging.error("ZSQLSimpleSearch X %s"%query)
         #print query          #print query
Line 1019  class ZSQLExtendFolder(Folder,Persistent Line 1167  class ZSQLExtendFolder(Folder,Persistent
           
                   
                   
     def ZSQLAdd(self,format=None,RESPONSE=None,args=None,**argv):      def ZSQLAdd(self,format=None,RESPONSE=None,args=None,_useRequest=True,**argv):
         """Neuer Eintrag"""          """Neuer Eintrag"""
                           
     if args:      if args:
Line 1029  class ZSQLExtendFolder(Folder,Persistent Line 1177  class ZSQLExtendFolder(Folder,Persistent
   
         qs_temp=[]          qs_temp=[]
           
           if  _useRequest:
         for a in self.REQUEST.form.keys():          for a in self.REQUEST.form.keys():
             qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a])))              qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a])))
   
Line 1045  class ZSQLExtendFolder(Folder,Persistent Line 1194  class ZSQLExtendFolder(Folder,Persistent
                   
         addList={}          addList={}
         for q in qs.split(","):          for q in qs.split(","):
               if len(q.split("="))<2:
                   continue
             name=re.sub("r'+'"," ",q.split("=")[0].lower())              name=re.sub("r'+'"," ",q.split("=")[0].lower())
          
             value=q.split("=")[1]              value=q.split("=")[1]
             value=re.sub(r'\+'," ",value)              value=re.sub(r'\+'," ",value)
             value=urllib.unquote(value)               value=urllib.unquote(value) 
Line 1114  class ZSQLExtendFolder(Folder,Persistent Line 1266  class ZSQLExtendFolder(Folder,Persistent
                     table=urllib.unquote(value)                      table=urllib.unquote(value)
             elif name=="-identify":              elif name=="-identify":
                 identify=urllib.unquote(value)                  identify=urllib.unquote(value)
                 identify="lower("+identify.split("=")[0]+")="+sql_quote(identify.split("=")[1].lower())                  # old code did identify with lower() which doesn't work for oids
                   #identify="lower("+identify.split("=")[0]+")="+sql_quote(identify.split("=")[1].lower())
                   (k,v) = identify.split("=")
                   identify="%s=%s"%(k,sql_quote(v))
             elif name=="-format":              elif name=="-format":
                 format=urllib.unquote(value)                  format=urllib.unquote(value)
             #elif (not (name[0]=="-" or name[0]=="_")) and (not len(value)==0):              #elif (not (name[0]=="-" or name[0]=="_")) and (not len(value)==0):
Line 1139  class ZSQLExtendFolder(Folder,Persistent Line 1294  class ZSQLExtendFolder(Folder,Persistent
             return True              return True
         
   
     def ZSQLFindIndexed(self,tableList=[],qs="",select="oid,*",storename=None,indexedFields=['data_line'],restrictField='id_text',**argv):      def ZSQLFindIndexed(self,tableList=[],qs="",select="*",storename=None,indexedFields=['data_line'],restrictField='id_text',**argv):
         """find2"""          """find2"""
                   
         for index in self.ZopeFind(self,obj_ids=indexedFields):          for index in self.ZopeFind(self,obj_ids=indexedFields):
Line 1152  class ZSQLExtendFolder(Folder,Persistent Line 1307  class ZSQLExtendFolder(Folder,Persistent
         search2 = self.ZSQLFind(tableExt=tableList[0],qs=qs,select=select,storename=storename,restrictConnect=(tableList[0]+"."+restrictField,search1),**argv)          search2 = self.ZSQLFind(tableExt=tableList[0],qs=qs,select=select,storename=storename,restrictConnect=(tableList[0]+"."+restrictField,search1),**argv)
         return search2          return search2
           
     def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv):      def ZSQLFind2(self,qs="",select="*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv):
         """find2"""          """find2"""
                   
         search1= self.ZSQLFind(qs=qs,select=select,storename=storename,tableExt=tableList[1],restrictField=restrictField,NoQuery='yes',NoLimit='yes',**argv)          search1= self.ZSQLFind(qs=qs,select=select,storename=storename,tableExt=tableList[1],restrictField=restrictField,NoQuery='yes',NoLimit='yes',**argv)
Line 1162  class ZSQLExtendFolder(Folder,Persistent Line 1317  class ZSQLExtendFolder(Folder,Persistent
           
               
           
     def ZSQLFind(self,qs="",select="oid,*",storename="foundCount",tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv):      def ZSQLFind(self,qs="",select="*",storename="foundCount",tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv):
         """search in database"""          """search in database"""
   
         def delEmpty(list):          def delEmpty(list):
             """"loesche leere elemente aus der liste"""              """loesche leere elemente aus der liste"""
             ret=[]              ret=[]
             for x in list:              for x in list:
                 splitted=x.split("=")                  splitted=x.split("=")
Line 1272  class ZSQLExtendFolder(Folder,Persistent Line 1427  class ZSQLExtendFolder(Folder,Persistent
         querys=qs.split(",")          querys=qs.split(",")
                   
         #which arguments are in the old query string          #which arguments are in the old query string
           
         queryList={}          queryList={}
         for query in querys:          for query in querys:
             arg=query.split("=")[0]              arg=query.split("=")[0]
Line 1284  class ZSQLExtendFolder(Folder,Persistent Line 1438  class ZSQLExtendFolder(Folder,Persistent
                                   
         argList=[]          argList=[]
         arg=""          arg=""
           
           
           
         #gehe durch die zu aendernden Argumente          #gehe durch die zu aendernden Argumente
         for argTmp in argv.keys():          for argTmp in argv.keys():
               
             arg=argTmp[0:]# sicherstellen, dass der string auh kopiert wird              arg=argTmp[0:]# sicherstellen, dass der string auh kopiert wird
             if arg[0]=="_": arg="-"+arg[1:] # sicherstellen, dass an Anfang stets "_"                          if arg[0]=="_": arg="-"+arg[1:] # sicherstellen, dass an Anfang stets "_"            
   
Line 1302  class ZSQLExtendFolder(Folder,Persistent Line 1452  class ZSQLExtendFolder(Folder,Persistent
                   
         return str          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):      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"""          """analysieren den QueryString"""
                  logging.debug("parseQueryString qs=%s"%qs)
                 
         #setzte generische werte          #setzte generische werte
                   
Line 1329  class ZSQLExtendFolder(Folder,Persistent Line 1480  class ZSQLExtendFolder(Folder,Persistent
         debug=None          debug=None
                   
         if not select:          if not select:
             select="oid,*"              select="*"
   
         #check for op           #check for op 
         splitted=qs.split(",")          splitted=qs.split(",")
Line 1341  class ZSQLExtendFolder(Folder,Persistent Line 1492  class ZSQLExtendFolder(Folder,Persistent
                     select=restrictField                      select=restrictField
                   
                   
         #erster durchgang suche operatoren              params={}
         for q in splitted:          for q in splitted:
               
                 name=re.sub("r'+'"," ",q.split("=")[0].lower())                  name=re.sub("r'+'"," ",q.split("=")[0].lower())
                 if name=="_debug":                  if name=="_debug":
                     debug=True                      debug=True
Line 1352  class ZSQLExtendFolder(Folder,Persistent Line 1502  class ZSQLExtendFolder(Folder,Persistent
                     value=urllib.unquote(q.split("=",1)[1])                      value=urllib.unquote(q.split("=",1)[1])
                 except:                  except:
                     value=""                      value=""
               
               params[name]=value
           
           
           
           #set table
           primaryKey=""
           if not tableExt:
               table=params.get(iCT+'table')
               primaryKey=self.getPrimaryKey(table)
               logging.debug("table:"+table)
               logging.debug("primkey:"+primaryKey);
                       
                       
           #erster durchgang suche operatoren    
           for name,value in params.items():
               
   #                name=re.sub("r'+'"," ",q.split("=")[0].lower())
   #                if name=="_debug":
   #                    debug=True
   #                    
   #                try:
   #                    value=urllib.unquote(q.split("=",1)[1])
   #                except:
   #                    value=""
                 #print "Hi",name[0:3],q                  #print "Hi",name[0:3],q
                 if name[0:3]==iCT+"op":                  if name[0:3]==iCT+"op":
                     op=value                      op=value
Line 1381  class ZSQLExtendFolder(Folder,Persistent Line 1556  class ZSQLExtendFolder(Folder,Persistent
                         sortfields[field]=value                          sortfields[field]=value
                                                   
         #zweiter durchgang analysiere felder          #zweiter durchgang analysiere felder
         for q in qs.split(","):          for name,value in params.items():
          
                           
                       
             name=re.sub("r'+'"," ",q.split("=")[0].lower())  #          
              #            name=re.sub("r'+'"," ",q.split("=")[0].lower())
             try:  #           
                 value=urllib.unquote(q.split("=",1)[1])  #            try:
               #                value=urllib.unquote(q.split("=",1)[1])
             except:  #            
                 value=""  #            except:
               #                value=""
   #            
             punktsplit=name.split(".")   #sonderfall feld mit punkten(tabelle.suchFeld.ausgewaehltesFeld,feldinoriginal), d.h. suche in anderer tabelle:                                    punktsplit=name.split(".")   #sonderfall feld mit punkten(tabelle.suchFeld.ausgewaehltesFeld,feldinoriginal), d.h. suche in anderer tabelle:                      
                     
             #analysiere alle anderen faelle              #analysiere alle anderen faelle
Line 1460  class ZSQLExtendFolder(Folder,Persistent Line 1635  class ZSQLExtendFolder(Folder,Persistent
                     op=opfields[name]                      op=opfields[name]
                 else:                  else:
                     op="ct"                      op="ct"
   
                 namealt=name                  namealt=name
                 name="LOWER("+punktsplit[1]+")"                   name="LOWER("+punktsplit[1]+")" 
                 value=value.lower()                  value=value.lower()
Line 1484  class ZSQLExtendFolder(Folder,Persistent Line 1660  class ZSQLExtendFolder(Folder,Persistent
   
                 elif op=="numerical":                  elif op=="numerical":
                     term=analyseIntSearch(value)                      term=analyseIntSearch(value)
                     tmp=(name+" "+term)                      tmp=(namealt+" "+term) # take namealt without LOWER
                 elif op=="grep":                  elif op=="grep":
                     tmp=(name+" ~* "+sql_quote(value))                      tmp=(name+" ~* "+sql_quote(value))
                 elif op=="one":                  elif op=="one":
Line 1512  class ZSQLExtendFolder(Folder,Persistent Line 1688  class ZSQLExtendFolder(Folder,Persistent
                 else:                  else:
                     op="ct"                      op="ct"
                 namealt=name                  namealt=name
                 name="LOWER("+name+")"                      ##DW hack 29-8-12 lower(oid) funktioniert nicht, generell muss oid handling noch korrigiert werden.
                   
                   
                   
                  
                   if not name==primaryKey:
                       name="LOWER("+name+")" #immer lower key nicht definiert fuer keys.
                   else:
                       op="eq"   # bei keys immer eq benutzen
                   
                   logging.debug("NAME: %s"%name)
                       
                 if op=="ct":                  if op=="ct":
                     tmp=(name+" LIKE "+sql_quote("%"+value+"%"))                      tmp=(name+" LIKE "+sql_quote("%"+value+"%"))
                 elif op=="gt":                  elif op=="gt":
Line 1523  class ZSQLExtendFolder(Folder,Persistent Line 1710  class ZSQLExtendFolder(Folder,Persistent
                     tmp=(name+"="+sql_quote(value))                      tmp=(name+"="+sql_quote(value))
                 elif op=="bw":                  elif op=="bw":
                     tmp=(name+" LIKE "+sql_quote(value+"%"))                      tmp=(name+" LIKE "+sql_quote(value+"%"))
                 elif op=="ew":                      #tmp=(name+" LIKE "+sql_quote("%"+value))
                     tmp=(name+" LIKE "+sql_quote("%"+value))  
                 elif op=="all":                  elif op=="all":
                     tmps=[]                      tmps=[]
                     for word in value.split(" "):                      for word in value.split(" "):
Line 1534  class ZSQLExtendFolder(Folder,Persistent Line 1720  class ZSQLExtendFolder(Folder,Persistent
   
                 elif op=="numerical":                  elif op=="numerical":
                     term=analyseIntSearch(value)                      term=analyseIntSearch(value)
                     tmp=(name+" "+term)                      tmp=(namealt+" "+term) # take namealt without LOWER
                 elif op=="grep":                  elif op=="grep":
                     tmp=(name+" ~* "+sql_quote(value))                      tmp=(name+" ~* "+sql_quote(value))
                 elif op=="one":                  elif op=="one":
Line 1546  class ZSQLExtendFolder(Folder,Persistent Line 1732  class ZSQLExtendFolder(Folder,Persistent
   
                 op="all"                  op="all"
   
                 if (value!='') and ((not tableExt) or (namealt.split('.')[0]==tableExt)): #keine leeren werde und keine auschluss                  if (value!='') and ((not tableExt) or (namealt.split('.')[0]==tableExt)): #keine leeren werte und keine auschluss
                     if searchFields.has_key(namealt):                      if searchFields.has_key(namealt):
                         searchFields[namealt]+=lopfields.get(name,'OR')+" "+tmp                          searchFields[namealt]+=lopfields.get(name,'OR')+" "+tmp
                         searchFieldsOnly[namealt]+=lopfields.get(name,'OR')+" "+value                          searchFieldsOnly[namealt]+=lopfields.get(name,'OR')+" "+value
Line 1623  class ZSQLExtendFolder(Folder,Persistent Line 1809  class ZSQLExtendFolder(Folder,Persistent
                           
             self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']              self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
   
             logging.debug("parsequerystring: limit=%s"%repr(limit))  
             if (limit=="all") or (limit==int(limit)):              if (limit=="all") or (limit==int(limit)):
                 self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']                  self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
             else:              else:
Line 1817  class ZSQLExtendFolder(Folder,Persistent Line 2002  class ZSQLExtendFolder(Folder,Persistent
         return "<a href='%s'>%s</a>"%(self.REQUEST['URL']+"?"+newquerystring,html)          return "<a href='%s'>%s</a>"%(self.REQUEST['URL']+"?"+newquerystring,html)
   
   
       def pydev_settrace(self):
           """do settrace to start debugging"""
           import pydevd
           pydevd.settrace()
           
     
 manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())  manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
Line 1897  class ZSQLBibliography(Folder,ZSQLExtend Line 2086  class ZSQLBibliography(Folder,ZSQLExtend
             pt.content_type="text/html"              pt.content_type="text/html"
             return pt()              return pt()
   
     def changeZSQLBibliography(self,tableName,label,description,connection_id=None,REQUEST=None):      def changeZSQLBibliography(self,tableName,label,description,primaryKey="",primaryKeys="",connection_id=None,REQUEST=None):
         """change it"""          """change it"""
         self.connection_id=connection_id          self.connection_id=connection_id
         self.tableName=tableName          self.tableName=tableName
         self.label=label          self.label=label
         self.description=description          self.description=description
           self.primaryKey=primaryKey
           
           self.primaryKeys={}
           if primaryKeys.lstrip().rstrip()!="":
               
               for vals in primaryKeys.split(";"):
                   splitted=vals.split(":")
                   if len(splitted)<2:
                         if REQUEST is not None:
                             return """<html><body>Wrong Syntax of keystring: %s<br/> %s is not of the form TABLE:key.</body></html>"""%(primaryKeys,vals)
                   
                   logging.debug(splitted)
                   self.primaryKeys[splitted[0]]=splitted[1]
                   
                        
           
           
           
                   
         if REQUEST is not None:          if REQUEST is not None:
             return self.manage_main(self, REQUEST)              return self.manage_main(self, REQUEST)
Line 1936  class ZSQLBibliography(Folder,ZSQLExtend Line 2143  class ZSQLBibliography(Folder,ZSQLExtend
         except:          except:
             return None              return None
   
       
       def getMetaDataManager(self):
           return self.metadata
       
     def findTagsFromMapping(self,referenceType):      def findTagsFromMapping(self,referenceType):
         """gib hash mit label -> generic zurueck"""          """gib hash mit label -> generic zurueck"""
         self.referencetypes=self.ZopeFind(self.standardMD)          self.referencetypes=self.ZopeFind(self.getMetaDataManager(),search_sub=1)
         bibdata={}          bibdata={}
         retdata={}          retdata={}
         fieldlist=self.standardMD.fieldList          #fieldlist=self.standardMD.fieldList
                   
         for referenceTypeF in self.referencetypes:          for referenceTypeF in self.referencetypes:
                 #print referenceType,referenceTypeF[1].title                  #print referenceType,referenceTypeF[1].title
                 if referenceTypeF[1].title == referenceType:                   if referenceTypeF[1].title.lower() == referenceType.lower(): 
                         bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields                          bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
                         bibdata['data']=referenceTypeF[1]                          bibdata['data']=referenceTypeF[1]
                         self.fields=bibdata[referenceType]                          self.fields=bibdata[referenceTypeF[1].title]
                         for field in fieldlist:                          
                           
                           
                           for field in referenceTypeF[1].getFieldList():
                             if referenceTypeF[1].getValue(field)[0]==None:                              if referenceTypeF[1].getValue(field)[0]==None:
                                 retdata[field]=field                                  retdata[field]=field
                             else:                              else:
                                 retdata[field]=referenceTypeF[1].getValue(field)[0]                                  retdata[field]=referenceTypeF[1].getValue(field)[0]
   
         return retdata,fieldlist                          return retdata,referenceTypeF[1].getFieldList()
                   
     def findLabelsFromMapping(self,referenceType):      def findLabelsFromMapping(self,referenceType):
         """gib hash mit label -> generic zurueck"""          """gib hash mit tagname -> lalbe zurueck"""
         self.referencetypes=self.ZopeFind(self.standardMD)  
         bibdata={}  
         retdata={}  
         fieldlist=self.standardMD.fieldList  
                   
         for referenceTypeF in self.referencetypes:          
                 #print referenceType,referenceTypeF[1].title          
                 if referenceTypeF[1].title == referenceType:           mapping= self.getMetaDataManager().getBibMapping(referenceType)
                         bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields          
                         bibdata['data']=referenceTypeF[1]        
                         self.fields=bibdata[referenceType]          
           fields=mapping.getFields()
           
          
           
           
           fieldlist=fields.keys()
           
           retdata={}
                         for field in fieldlist:                          for field in fieldlist:
                             retdata[field]=referenceTypeF[1].getValue(field)[1]              retdata[field]=fields[field]['label']
               
   #        self.referencetypes=self.ZopeFind(self.getMetaDataManager(),search_sub=1)
   #      
   #        bibdata={}
   #        retdata={}
   #        #fieldlist=self.standardMD.fieldList
   #        logging.debug("XX")
   #        for referenceTypeF in self.referencetypes:
   #                #print referenceType,referenceTypeF[1].title
   #                logging.debug("%s=%s"%(referenceTypeF[1].title,referenceType))
   #                if referenceTypeF[1].title.lower() == referenceType.lower(): 
   #                        
   #                        bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
   #                        bibdata['data']=referenceTypeF[1]
   #                        self.fields=bibdata[referenceTypeF[1].title]
   #                        for field in referenceTypeF[1].getFieldList():
   #                            retdata[field]=referenceTypeF[1].getValue(field)[1]
   
   
         return retdata,fieldlist          return retdata,fieldlist
   
   
     def createRDFTag(self,tag,content,namespace="cdli"):      def createRDFTag(self,tag,content,namespace="cdli"):
         """create RDF"""          """create RDF"""
         if content:          if content:
Line 2069  class ZSQLBibliography(Folder,ZSQLExtend Line 2306  class ZSQLBibliography(Folder,ZSQLExtend
                   
         ret="""<?xml version="1.0" ?>          ret="""<?xml version="1.0" ?>
                      <index>"""                       <index>"""
         for found in self.ZSQLSimpleSearch("select oid from %s limit ALL"%self.tableName):          for found in self.ZSQLSimpleSearch("select % from %s limit ALL"%(self.getPrimaryKey,self.tableName)):
             base_url = self.absolute_url()              base_url = self.absolute_url()
             if fix_host:              if fix_host:
                 #print "replacing ", http_host, " by ", fix_host                  #print "replacing ", http_host, " by ", fix_host
                 base_url = string.replace(base_url, http_host, fix_host, 1)                  base_url = string.replace(base_url, http_host, fix_host, 1)
                                   
             link=base_url+"/"+"record.html?oid=%i"%found.oid              link=base_url+"/"+"record.html?oid=%i"%getattr(found,self.getPrimaryKey())
             metalink=base_url+"/"+"getMetaDataXML?oid=%i"%found.oid              metalink=base_url+"/"+"getMetaDataXML?oid=%i"%getattr(found,self.getPrimaryKey())
                           
             ret+="""<resource resourceLink="%s" metaLink="%s"/>\n"""%(link,metalink)              ret+="""<resource resourceLink="%s" metaLink="%s"/>\n"""%(link,metalink)
                           
Line 2130  def manage_addZSQLBibliography(self, id, Line 2367  def manage_addZSQLBibliography(self, id,
   
           
   
       

Removed from v.1.121  
changed lines
  Added in v.1.144


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>