Diff for /ZSQLExtend/ZSQLExtend.py between versions 1.34 and 1.45

version 1.34, 2004/09/27 18:51:57 version 1.45, 2004/10/25 13:13:48
Line 5  from Globals import DTMLFile Line 5  from Globals import DTMLFile
 import urllib  import urllib
 import re  import re
 import string  import string
 from pyPgSQL import libpq  #from pyPgSQL import libpq
 from AccessControl import getSecurityManager  from AccessControl import getSecurityManager
 import os.path  import os.path
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile  from Products.PageTemplates.PageTemplateFile import PageTemplateFile
Line 13  from Products.PageTemplates.PageTemplate Line 13  from Products.PageTemplates.PageTemplate
 from Products.ZSQLMethods.SQL import SQLConnectionIDs  from Products.ZSQLMethods.SQL import SQLConnectionIDs
 import Shared.DC.ZRDB.DA  import Shared.DC.ZRDB.DA
   
   def analyseIntSearch(word):
       #analyse integer searches
   
       splitted=word.split("-")
   
       if len(splitted)==1:
           return "="+splitted[0]
       
       if splitted[0]=="":
           return "< "+splitted[1]
   
       if splitted[1]=='':
           return "> "+splitted[0]
       else:
           return "BETWEEN "+splitted[0]+" AND "+splitted[1]
   
           
   
   def sql_quote(v):
       # quote dictionary
       quote_dict = {"\'": "''", "\\": "\\\\"}
       for dkey in quote_dict.keys():
           if string.find(v, dkey) >= 0:
               v=join(split(v,dkey),quote_dict[dkey])
       return "'%s'" % v
   
 def showSQLConnectionIDs(self):  def showSQLConnectionIDs(self):
     return SQLConnectionIDs(self)      return SQLConnectionIDs(self)
   
Line 32  class ZSQLExtendFolder(Folder,Persistent Line 58  class ZSQLExtendFolder(Folder,Persistent
         """suche relative haufigkeiten"""          """suche relative haufigkeiten"""
         ret={}          ret={}
         allRecords=len(self.ZSQLSimpleSearch(statement + " where "+wherePart))          allRecords=len(self.ZSQLSimpleSearch(statement + " where "+wherePart))
         print statement + " where "+wherePart          
         for oneclass in classes:          for oneclass in classes:
             ret[oneclass]=len(self.ZSQLSimpleSearch(statement + " where ("+wherePart+") and "+ relStatement%oneclass))              ret[oneclass]=len(self.ZSQLSimpleSearch(statement + " where ("+wherePart+") and "+ relStatement%oneclass))
             print statement + " where ("+wherePart+") and "+ relStatement%oneclass          
         return (ret,allRecords)          return (ret,allRecords)
                                       
     def content_html(self):      def content_html(self):
Line 235  class ZSQLExtendFolder(Folder,Persistent Line 261  class ZSQLExtendFolder(Folder,Persistent
                   
     def ZSQLInlineSearch(self,storename=None,**argv):      def ZSQLInlineSearch(self,storename=None,**argv):
         """inlinesearch"""          """inlinesearch"""
           
         qs=[]          qs=[]
         if storename:          if storename:
             """store"""              """store"""
Line 245  class ZSQLExtendFolder(Folder,Persistent Line 272  class ZSQLExtendFolder(Folder,Persistent
   
         #print "INLINE:",argv          #print "INLINE:",argv
         for a in argv.keys():          for a in argv.keys():
               try:
                   qs.append(a+"="+urllib.quote(str(argv[a])))
               except:
                   import urllib
             qs.append(a+"="+urllib.quote(str(argv[a])))              qs.append(a+"="+urllib.quote(str(argv[a])))
                   
         #return []            #return []  
         return self.parseQueryString(string.join(qs,","),"_",storename=storename)          return self.parseQueryString(string.join(qs,","),"_",storename=storename)
   
Line 261  class ZSQLExtendFolder(Folder,Persistent Line 293  class ZSQLExtendFolder(Folder,Persistent
   
     def ZSQLSimpleSearch(self,query=None):      def ZSQLSimpleSearch(self,query=None):
         """ returrn SQLSearch"""          """ returrn SQLSearch"""
           #print "hi",query
         if not query:          if not query:
             query=self.query              query=self.query
           if getattr(self,'_v_search',None):
                         
         if self.search.meta_type=="Z SQL Method":              return self._v_search(var=query)
           
           if hasattr(self,'search') and (self.search.meta_type=="Z SQL Method"):
               self._v_search=self.search
             return self.search(var=query)              return self.search(var=query)
         else:          else:
             if self.aq_parent.aq_parent.search.meta_type=="Z SQL Method":              if hasattr(self.aq_parent.aq_parent,'search') and (self.aq_parent.aq_parent.search.meta_type=="Z SQL Method"):
                   self._v_search=self.aq_parent.aq_parent.search
                 return self.aq_parent.aq_parent.search(var=query)                  return self.aq_parent.aq_parent.search(var=query)
             else:              else:
                   search=self.ZopeFind(self,obj_metatypes=["Z SQL Method"],search_sub=1)
                   if search:
                       self._v_search=search[0][1]
                       return search[0][1](var=query)
                   else:
                 return []                  return []
           
                   
Line 294  class ZSQLExtendFolder(Folder,Persistent Line 337  class ZSQLExtendFolder(Folder,Persistent
         valueList=[]          valueList=[]
         for x in addList.keys():          for x in addList.keys():
             keyList.append("\""+x+"\"")              keyList.append("\""+x+"\"")
             valueList.append(libpq.PgQuoteString(addList[x]))              valueList.append(sql_quote(addList[x]))
   
         keyString=string.join(keyList,",")          keyString=string.join(keyList,",")
         valueString=string.join(valueList,",")          valueString=string.join(valueList,",")
Line 304  class ZSQLExtendFolder(Folder,Persistent Line 347  class ZSQLExtendFolder(Folder,Persistent
         return self.REQUEST.RESPONSE.redirect(format)          return self.REQUEST.RESPONSE.redirect(format)
                   
     def ZSQLChange(self,**argv):      def ZSQLChange(self,**argv):
         """Ändern von Einträgen"""          """change entries"""
         #qs=self.REQUEST['QUERY_STRING']          #qs=self.REQUEST['QUERY_STRING']
         # very bad hack          # very bad hack
         qs_temp=[]          qs_temp=[]
Line 327  class ZSQLExtendFolder(Folder,Persistent Line 370  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=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])                  identify=identify.split("=")[0]+"="+sql_quote(identify.split("=")[1])
             elif name=="-format":              elif name=="-format":
                 format=urllib.unquote(value)                  format=urllib.unquote(value)
             elif (not name[0]=="-") and (not len(value)==0):              elif (not name[0]=="-") and (not len(value)==0):
                 changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))                  changeList.append("\""+name+"\"="+sql_quote(urllib.unquote(value)))
         changeString=string.join(changeList,",")          changeString=string.join(changeList,",")
         queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)          queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
         self.ZSQLSimpleSearch(queryString)          self.ZSQLSimpleSearch(queryString)
         return self.REQUEST.RESPONSE.redirect(format)          return self.REQUEST.RESPONSE.redirect(format)
   
     def ZSQLChange_old(self):      def ZSQLChange_old(self):
         """Ändern von Einträgen"""          """change entries"""
         qs=self.REQUEST['QUERY_STRING']          qs=self.REQUEST['QUERY_STRING']
         #print "CHANGE QS",self.REQUEST          #print "CHANGE QS",self.REQUEST
         #return self.REQUEST          #return self.REQUEST
Line 352  class ZSQLExtendFolder(Folder,Persistent Line 395  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=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])                  identify=identify.split("=")[0]+"="+sql_quote(identify.split("=")[1])
             elif name=="-format":              elif name=="-format":
                 format=urllib.unquote(value)                  format=urllib.unquote(value)
             elif (not name[0]=="-") and (not len(value)==0):              elif (not name[0]=="-") and (not len(value)==0):
                 changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))                  changeList.append("\""+name+"\"="+sql_quote(urllib.unquote(value)))
         changeString=string.join(changeList,",")          changeString=string.join(changeList,",")
         queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)          queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
         self.ZSQLSimpleSearch(queryString)          self.ZSQLSimpleSearch(queryString)
Line 389  class ZSQLExtendFolder(Folder,Persistent Line 432  class ZSQLExtendFolder(Folder,Persistent
                     ret.append(x)                      ret.append(x)
             return ret              return ret
                   
         #self.REQUEST.SESSION['come_from_search']="no" # zurücksetzen          #self.REQUEST.SESSION['come_from_search']="no" # zuruecksetzen
         if qs=="":          if qs=="":
                         
            if self.REQUEST['QUERY_STRING']:             if self.REQUEST['QUERY_STRING']:
Line 499  class ZSQLExtendFolder(Folder,Persistent Line 542  class ZSQLExtendFolder(Folder,Persistent
         opfields={}          opfields={}
         lopfields={} #Verknüpfung bei mehrfachauswahl von einem feld          lopfields={} #Verknüpfung bei mehrfachauswahl von einem feld
         sortfields={} #order of sortfields          sortfields={} #order of sortfields
           sortAllFields=None
         skip=""          skip=""
         rangeStart=0          rangeStart=0
         limit=0          limit=0
Line 537  class ZSQLExtendFolder(Folder,Persistent Line 581  class ZSQLExtendFolder(Folder,Persistent
                     lopfields[field]=lop                      lopfields[field]=lop
                                           
                 if name[0:10]==iCT+"sortorder":                  if name[0:10]==iCT+"sortorder":
                     sort=value                      #sort=value
   
                     field=name[11:]                      field=name[11:]
                     sortfields[field]=sort                      sortAllFields=None
                       #no field selected
                       if field=="":
                           sortAllFields=value
                       else:
                           sortfields[field]=value
                                           
                     #print "HI",op,field                      #print "HI",op,field
     #print opfieldsa      #print opfieldsa
Line 556  class ZSQLExtendFolder(Folder,Persistent Line 605  class ZSQLExtendFolder(Folder,Persistent
             except:              except:
                 value=""                  value=""
                                   
             #value=libpq.PgQuoteString(value)              #value=sql_quote(value)
                           
                           
             if name==iCT+"lop":              if name==iCT+"lop":
Line 580  class ZSQLExtendFolder(Folder,Persistent Line 629  class ZSQLExtendFolder(Folder,Persistent
                 sortstrs=[]                  sortstrs=[]
                 for word in value.split(','):                  for word in value.split(','):
                     wordstr=word.lstrip().rstrip()                      wordstr=word.lstrip().rstrip()
                       if sortAllFields:
                           order=sortAllFields
                       else:
                     order=sortfields.get(wordstr,'ASC')                      order=sortfields.get(wordstr,'ASC')
                           
                       if not (wordstr == ""):
                     sortstrs.append(wordstr+" "+order)                      sortstrs.append(wordstr+" "+order)
                 if len(sortstrs)>0:                  if len(sortstrs)>0:
                     sort="ORDER BY "+string.join(sortstrs,',')                      sort="ORDER BY "+string.join(sortstrs,',')
                                   
                       
             elif name==iCT+"token":              elif name==iCT+"token":
                 if not nostore=="yes":                  if not nostore=="yes":
                     self.REQUEST.SESSION['token']=value                      self.REQUEST.SESSION['token']=value
Line 606  class ZSQLExtendFolder(Folder,Persistent Line 661  class ZSQLExtendFolder(Folder,Persistent
                 namealt=name                  namealt=name
                 name="LOWER("+name+")"                      name="LOWER("+name+")"    
                 if op=="ct":                  if op=="ct":
                     tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))                      tmp=(name+" LIKE "+sql_quote("%"+value+"%"))
                 elif op=="gt":                  elif op=="gt":
                     tmp=(name+">"+libpq.PgQuoteString(value))                      tmp=(name+">"+sql_quote(value))
                 elif op=="lt":                  elif op=="lt":
                     tmp=(name+"<"+libpq.PgQuoteString(value))                      tmp=(name+"<"+sql_quote(value))
                 elif op=="eq":                  elif op=="eq":
                     tmp=(name+"="+libpq.PgQuoteString(value))                      tmp=(name+"="+sql_quote(value))
                 elif op=="bw":                  elif op=="bw":
                     tmp=(name+" LIKE "+libpq.PgQuoteString(value+"%"))                      tmp=(name+" LIKE "+sql_quote(value+"%"))
                 elif op=="ew":                  elif op=="ew":
                     tmp=(name+" LIKE "+libpq.PgQuoteString("%"+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(" "):
                         tmps.append(name+" LIKE "+libpq.PgQuoteString("%"+word+"%"))                          tmps.append(name+" LIKE "+sql_quote("%"+word+"%"))
                                                   
                     tmp=string.join(tmps,' AND ')                      tmp=string.join(tmps,' AND ')
                                           
                   elif op=="numerical":
                       term=analyseIntSearch(value)
                       tmp=(name+" "+term)
                   elif op=="grep":
                       tmp=(name+" ~* "+sql_quote(value))
                   elif op=="one":
                       tmps=[]
                       for word in value.split(" "):
                           tmps.append(name+" LIKE "+sql_quote("%"+word+"%"))
                           
                       tmp=string.join(tmps,' OR ')
   
                 op="ct"                  op="ct"
   
                 if (not tableExt) or (namealt.split('.')[0]==tableExt):                  if (not tableExt) or (namealt.split('.')[0]==tableExt):
Line 634  class ZSQLExtendFolder(Folder,Persistent Line 701  class ZSQLExtendFolder(Folder,Persistent
                         searchFields[name]=tmp                          searchFields[name]=tmp
                         searchFieldsOnly[name]=value                          searchFieldsOnly[name]=value
   
               
        ##  for name in searchFields.keys():  
 ##             value=searchFields[name]  
                   
 ##             if opfields.has_key(name):  
 ##                 op=opfields[name]  
 ##             else:  
 ##                 op="ct"  
 ##             name="LOWER("+name+")"      
 ##             if op=="ct":  
 ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))  
 ##             elif op=="gt":  
 ##                 whereList.append(name+">"+libpq.PgQuoteString(value))  
 ##             elif op=="lt":  
 ##                 whereList.append(name+"<"+libpq.PgQuoteString(value))  
 ##             elif op=="eq":  
 ##                 whereList.append(name+"="+libpq.PgQuoteString(value))  
 ##             elif op=="bw":  
 ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString(value+"%"))  
 ##             elif op=="ew":  
 ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value))  
 ##             op="ct"  
               
 ##             #except:  
 ##             #    print "END",value,name,Exception        
   
         whereList=["("+searchFields[x]+")" for x in searchFields.keys()]          whereList=["("+searchFields[x]+")" for x in searchFields.keys()]
   
         if len(whereList)>0:          if len(whereList)>0:
Line 682  class ZSQLExtendFolder(Folder,Persistent Line 723  class ZSQLExtendFolder(Folder,Persistent
                 where+="and "+restrictConnect[0]+" in ("+restrictConnect[1]+")"                  where+="and "+restrictConnect[0]+" in ("+restrictConnect[1]+")"
                                   
         #print "QE",table          #print "QE",table
                   #print (select,table,where,sort,maxstr,skip)
         query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)          query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)
                   
         if not nostore=="yes":          if not nostore=="yes":
Line 730  class ZSQLExtendFolder(Folder,Persistent Line 771  class ZSQLExtendFolder(Folder,Persistent
                           
     def ZSQLQuery(self,query):      def ZSQLQuery(self,query):
         """query"""          """query"""
           #print "hi",query
         return self.ZSQLSimpleSearch(query)          return self.ZSQLSimpleSearch(query)
           
     def ZSQLSearch(self):      def ZSQLSearch(self):
Line 774  class ZSQLExtendFolder(Folder,Persistent Line 816  class ZSQLExtendFolder(Folder,Persistent
                                                                                                   
     def nextLink(self,html,storename="foundCount"):      def nextLink(self,html,storename="foundCount"):
         """nextLink"""          """nextLink"""
   
         try:          try:
             limit=self.REQUEST.SESSION[storename]['rangeSize']              limit=self.REQUEST.SESSION[storename]['rangeSize']
             if int(limit)==0 :              if int(limit)==0 :
Line 792  class ZSQLExtendFolder(Folder,Persistent Line 835  class ZSQLExtendFolder(Folder,Persistent
         if self.REQUEST['QUERY_STRING']=="":          if self.REQUEST['QUERY_STRING']=="":
             qs=self.REQUEST.SESSION['query']              qs=self.REQUEST.SESSION['query']
                           
             queries=string.split(qs,",")              queries=string.split(qs,",")[0:]
                           
                           
         else:          else:
             qs=self.REQUEST['QUERY_STRING']              qs=self.REQUEST['QUERY_STRING']
             queries=string.split(qs,"&")              queries=string.split(qs,"&")[0:]
                           
                           
                           
Line 807  class ZSQLExtendFolder(Folder,Persistent Line 850  class ZSQLExtendFolder(Folder,Persistent
                   
         for query in queries:          for query in queries:
                           
             #print query.split("=")[0]              if query[0]=="_" : query="-"+query[1:]
             if query[0]=="_" : query[0]="-"  
   
             if query.split("=")[0].lower()=="-skip":              if query.split("=")[0].lower()=="-skip":
   
Line 821  class ZSQLExtendFolder(Folder,Persistent Line 863  class ZSQLExtendFolder(Folder,Persistent
             newquery.append(query)              newquery.append(query)
                                   
         newquerystring=string.join(newquery,"&")          newquerystring=string.join(newquery,"&")
       return "<a href='%s'>%s</a>"%(self.REQUEST['URL']+"?"+newquerystring,html)
           
         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)  
                           
                   
     def prevLink(self,html,storename="foundCount"):      def prevLink(self,html,storename="foundCount"):
         """prev link"""          """prev link"""
   
         try:          try:
             limit=self.REQUEST.SESSION[storename]['rangeSize']              limit=self.REQUEST.SESSION[storename]['rangeSize']
             if int(limit)==0 :              if int(limit)==0 :
Line 878  class ZSQLExtendFolder(Folder,Persistent Line 921  class ZSQLExtendFolder(Folder,Persistent
                           
         newquerystring=string.join(newquery,"&")          newquerystring=string.join(newquery,"&")
   
         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)          return "<a href='%s'>%s</a>"%(self.REQUEST['URL']+"?"+newquerystring,html)
   
   
           
Line 1119  class ZSQLBibliography(Folder,ZSQLExtend Line 1162  class ZSQLBibliography(Folder,ZSQLExtend
   
     def getMetaDatasXML(self):      def getMetaDatasXML(self):
         """index"""          """index"""
           # check if the request's host part was OK
           http_host = self.REQUEST['HTTP_HOST']
           host_port = self.REQUEST['SERVER_PORT']
           fix_host = None
           if http_host and http_host.rfind(host_port) == -1:
               print "HTTP_HOST needs fixing!"
               fix_host = http_host + ":" + host_port
           
         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 oid from %s limit ALL"%self.tableName):
             link=self.absolute_url()+"/"+"record.html?oid=%i"%found.oid              base_url = self.absolute_url()
             metalink=self.absolute_url()+"/"+"getMetaDataXML?oid=%i"%found.oid              if fix_host:
                   #print "replacing ", http_host, " by ", fix_host
                   base_url = string.replace(base_url, http_host, fix_host, 1)
                   
               link=base_url+"/"+"record.html?oid=%i"%found.oid
               metalink=base_url+"/"+"getMetaDataXML?oid=%i"%found.oid
                           
             ret+="""<resource resourceLink="%s" metaLink="%s"/>\n"""%(link,metalink)              ret+="""<resource resourceLink="%s" metaLink="%s"/>\n"""%(link,metalink)
                           

Removed from v.1.34  
changed lines
  Added in v.1.45


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