Diff for /ZSQLExtend/ZSQLExtend.py between versions 1.81 and 1.103

version 1.81, 2006/04/20 17:40:11 version 1.103, 2007/02/20 16:00:03
Line 14  from Products.ZSQLMethods.SQL import SQL Line 14  from Products.ZSQLMethods.SQL import SQL
 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
 import zLOG  import logging
 import os.path  import os.path
 import os  import os
   import copy
   import unicodedata
   
   import logging
   
   #ersetzt logging
   def logger(txt,method,txt2):
       """logging"""
       logging.info(txt+ txt2)
   
   
 from OFS.SimpleItem import SimpleItem  from OFS.SimpleItem import SimpleItem
   
 def getTextFromNode(nodename):  def getTextFromNode(nodename):
       """get the cdata content of a node"""
       if nodename is None:
           return ""
     nodelist=nodename.childNodes      nodelist=nodename.childNodes
     rc = ""      rc = ""
     for node in nodelist:      for node in nodelist:
Line 27  def getTextFromNode(nodename): Line 41  def getTextFromNode(nodename):
            rc = rc + node.data             rc = rc + node.data
     return rc      return rc
   
       
 def analyseIntSearch(word):  def analyseIntSearch(word):
     #analyse integer searches      #analyse integer searches
   
Line 80  class ZSQLExtendFolder(Folder,Persistent Line 93  class ZSQLExtendFolder(Folder,Persistent
         """quote str for sql"""          """quote str for sql"""
         return sql_quote(str)          return sql_quote(str)
           
       
       def normalizeField(self,table,fieldname, newFieldName=None,mode="alter", RESPONSE=None):
           """normalize a field"""
           import unicodedata
           
           if not newFieldName:
               newFieldName=fieldname+"_normal"
               
           def normal(str):
               if str:
                   return unicodedata.normalize('NFKD', str.decode('utf-8')).encode('ASCII', 'ignore')
               else:
                   return ""
           if mode=="create": # create the field
               qstr="""alter table %s add %s %s"""
               self.ZSQLSimpleSearch(qstr%(table,newFieldName,'text'))
           
           qstr="select oid,%s from %s"%(fieldname,table)
           for result in self.ZSQLSimpleSearch(qstr):
               qstr="update %s set %s = %s where oid = %s"
   
               self.ZSQLSimpleSearch(qstr%(table,newFieldName,self.ZSQLQuote(normal(getattr(result,fieldname))),result.oid))
           
     def importAccessModell(self,configFileName,RESPONSE=None):      def importAccessModell(self,configFileName,RESPONSE=None):
         """import tables from access          """import tables from access
         @param configFileName: xml-configfile          @param configFileName: xml-configfile
Line 102  class ZSQLExtendFolder(Folder,Persistent Line 138  class ZSQLExtendFolder(Folder,Persistent
             containers=db.xpath("./@container")              containers=db.xpath("./@container")
             identifiers=db.xpath("./@identify")              identifiers=db.xpath("./@identify")
                           
             print containers  
             if not (len(containers)==1):              if not (len(containers)==1):
                 return False                  return False
             else:              else:
Line 124  class ZSQLExtendFolder(Folder,Persistent Line 160  class ZSQLExtendFolder(Folder,Persistent
         @param elementNameForTable: must be a element of type complex type. the element of the sequence in the complex type          @param elementNameForTable: must be a element of type complex type. the element of the sequence in the complex type
                                     define the columns of the table >table<                                      define the columns of the table >table<
         @param data (optional): data to be imported          @param data (optional): data to be imported
       
         @param filename (optional) or filename          @param filename (optional) or filename
         @param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes.          @param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes.
         @param RESPONSE: (optional)          @param RESPONSE: (optional)
Line 132  class ZSQLExtendFolder(Folder,Persistent Line 169  class ZSQLExtendFolder(Folder,Persistent
         #from xml.dom.minidom import parseString,parse          #from xml.dom.minidom import parseString,parse
                   
         from Ft.Xml import Parse          from Ft.Xml import Parse
         zLOG.LOG("import xsd",zLOG.INFO,"called")          logger("import xsd",logging.INFO,"called")
         #fh=file("/tmp/fmpxml.xml")          #fh=file("/tmp/fmpxml.xml")
         import bz2          import bz2
         import base64          import base64
Line 142  class ZSQLExtendFolder(Folder,Persistent Line 179  class ZSQLExtendFolder(Folder,Persistent
         if data:          if data:
           data=bz2.decompress(base64.decodestring(data))            data=bz2.decompress(base64.decodestring(data))
                   
           #zLOG.LOG("import xsd",zLOG.INFO,"received file")            #logger("import xsd",logging.INFO,"received file")
           doc=Parse(data)            doc=Parse(data)
           #zLOG.LOG("import xsd",zLOG.INFO,"parsed file")            #logger("import xsd",logging.INFO,"parsed file")
                   
         elif filename:          elif filename:
           fh=file(filename)            fh=file(filename)
           txt=fh.read()            txt=fh.read()
                       
           doc=Parse(txt)            doc=Parse(txt)
           #zLOG.LOG("import xsd",zLOG.INFO,"parsed file")            #logger("import xsd",logging.INFO,"parsed file")
                   
                   
         Nss={'xsd':'http://www.w3.org/2001/XMLSchema'}          Nss={'xsd':'http://www.w3.org/2001/XMLSchema'}
Line 164  class ZSQLExtendFolder(Folder,Persistent Line 201  class ZSQLExtendFolder(Folder,Persistent
         #check if table exists          #check if table exists
                   
         qstr="""select relname from pg_class where relname = '%s'"""%table          qstr="""select relname from pg_class where relname = '%s'"""%table
         if len (self.ZSQLSimpleSearch(qstr))<1: # if not the create the table          if not(self.ZSQLSimpleSearch(qstr)) or (len (self.ZSQLSimpleSearch(qstr))<1): # if not the create the table
             columns=[]              columns=[]
             create=True                  create=True    
         else:          else:
             create=False              create=False
                           
             zLOG.LOG("update xsd: fieldnames",zLOG.INFO,repr(fieldNames))                                     logger("update xsd: fieldnames",logging.INFO,repr(fieldNames))                       
             qstr="""select attname from pg_attribute, pg_class where attrelid = pg_class.oid and relname = '%s' """              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)]                          columns=[x.attname for x in self.ZSQLSimpleSearch(qstr%table)]            
                   
Line 185  class ZSQLExtendFolder(Folder,Persistent Line 222  class ZSQLExtendFolder(Folder,Persistent
         for fieldName in fieldNames:          for fieldName in fieldNames:
             if type(fieldName) is UnicodeType:              if type(fieldName) is UnicodeType:
                 fieldName=fieldName.encode('utf-8')                  fieldName=fieldName.encode('utf-8')
             zLOG.LOG("update xml: fieldname",zLOG.INFO,repr(fieldName))                                   logging.info("update xml: fieldname",logging.INFO,repr(fieldName))                     
             if fieldName.lower() not in columns:              if fieldName.lower() not in columns:
                                   
                 if create:# table does not exist therefore create with one column                  if create:# table does not exist therefore create with one column
Line 195  class ZSQLExtendFolder(Folder,Persistent Line 232  class ZSQLExtendFolder(Folder,Persistent
                     qstr="""alter table %s add %s %s"""                      qstr="""alter table %s add %s %s"""
                                   
                 self.ZSQLSimpleSearch(qstr%(table,fieldName,'text'))                  self.ZSQLSimpleSearch(qstr%(table,fieldName,'text'))
                 zLOG.LOG("update xsd: fieldname add",zLOG.INFO,qstr%(table,fieldName,'text'))                                         logger("update xsd: fieldname add",logging.INFO,qstr%(table,fieldName,'text'))                       
         
   
     def importXMLFileAccess(self,table,container,data=None,identify=None,filename=None,RESPONSE=None):      def importXMLFileAccess(self,table,container,data=None,identify=None,filename=None,RESPONSE=None):
Line 209  class ZSQLExtendFolder(Folder,Persistent Line 246  class ZSQLExtendFolder(Folder,Persistent
         '''          '''
         from xml.dom.pulldom import parseString,parse          from xml.dom.pulldom import parseString,parse
                   
         zLOG.LOG("import xml",zLOG.INFO,"called")          logger("import xml",logging.INFO,"called")
         #fh=file("/tmp/fmpxml.xml")          #fh=file("/tmp/fmpxml.xml")
         import bz2          import bz2
         import base64          import base64
Line 218  class ZSQLExtendFolder(Folder,Persistent Line 255  class ZSQLExtendFolder(Folder,Persistent
         if data:          if data:
           data=bz2.decompress(base64.decodestring(data))            data=bz2.decompress(base64.decodestring(data))
                   
           zLOG.LOG("import xml",zLOG.INFO,"received file")            logger("import xml",logging.INFO,"received file")
           doc=parseString(data)            doc=parseString(data)
           zLOG.LOG("import xml",zLOG.INFO,"parsed file")            logger("import xml",logging.INFO,"parsed file")
   
         elif filename:          elif filename:
           fh=file(filename)            fh=file(filename)
           doc=parse(fh)            doc=parse(fh)
           zLOG.LOG("import xml",zLOG.INFO,"parsed file")            logger("import xml",logging.INFO,"parsed file")
         while 1:          while 1:
             node=doc.getEvent()              node=doc.getEvent()
   
Line 240  class ZSQLExtendFolder(Folder,Persistent Line 277  class ZSQLExtendFolder(Folder,Persistent
                         if col.nodeType is col.ELEMENT_NODE:                           if col.nodeType is col.ELEMENT_NODE: 
                             data=col.nodeName                              data=col.nodeName
                             dataSet[data]=getTextFromNode(col)                              dataSet[data]=getTextFromNode(col)
                     print dataSet.keys()  
                     update=False                      update=False
                                           
                     if identify:                      if identify:
Line 248  class ZSQLExtendFolder(Folder,Persistent Line 285  class ZSQLExtendFolder(Folder,Persistent
                         field=dataSet[identify]                          field=dataSet[identify]
   
                         searchStr="""select %s from %s where %s = '%s'"""%(identify,table,identify,field)                          searchStr="""select %s from %s where %s = '%s'"""%(identify,table,identify,field)
                         zLOG.LOG("import xml",zLOG.INFO,searchStr)                          logger("import xml",logging.INFO,searchStr)
                         search=self.ZSQLSimpleSearch(searchStr)                          search=self.ZSQLSimpleSearch(searchStr)
                         if search:                          if search:
                             update=True                              update=True
Line 262  class ZSQLExtendFolder(Folder,Persistent Line 299  class ZSQLExtendFolder(Folder,Persistent
                         field=dataSet[identify]                          field=dataSet[identify]
                                       
                         queryStr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,identify,field)                          queryStr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,identify,field)
                         zLOG.LOG("update xml",zLOG.INFO,queryStr)                          logger("update xml",logging.INFO,queryStr)
                         self.ZSQLSimpleSearch(queryStr)                          self.ZSQLSimpleSearch(queryStr)
                         ret+="ud: %s \n"%field                          ret+="ud: %s \n"%field
                     else:                      else:
   
                                                 
                         fields=",".join(dataSet.keys())                          fields=",".join(dataSet.keys())
                         values=",".join([""" %s """%self.ZSQLQuote(x) for x in dataSet.keys()])                          values=",".join([""" %s """%self.ZSQLQuote(dataSet[x]) for x in dataSet.keys()])
                                       
                                                   
                         queryStr="""INSERT INTO %s  (%s) VALUES (%s)"""%(table,fields,values)                          queryStr="""INSERT INTO %s  (%s) VALUES (%s)"""%(table,fields,values)
                         self.ZSQLSimpleSearch(queryStr)                          self.ZSQLSimpleSearch(queryStr)
                         zLOG.LOG("update xml",zLOG.INFO,queryStr)                          logger("update xml",logging.INFO,queryStr)
                                                   
                                                   
                                                   
Line 288  class ZSQLExtendFolder(Folder,Persistent Line 325  class ZSQLExtendFolder(Folder,Persistent
         Import XML file into the table          Import XML file into the table
         @param table: name of the table the xml shall be imported into          @param table: name of the table the xml shall be imported into
         @param containerTagName: XML-Tag which describes a dataset          @param containerTagName: XML-Tag which describes a dataset
         @param data: data to be imported          @param file: xmlfile handle
         @param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes.          @param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes.
         @param RESPONSE: (optional)          @param RESPONSE: (optional)
         '''          '''
         from xml.dom.pulldom import parseString,parse          from xml.dom.pulldom import parseString
                   
         zLOG.LOG("import xml",zLOG.INFO,"called")          doc=parseString(file.read())
         #fh=file("/tmp/fmpxml.xml")  
         import bz2  
         import base64  
           
         ret=""  
         if data:  
           data=bz2.decompress(base64.decodestring(data))  
           
           zLOG.LOG("import xml",zLOG.INFO,"received file")  
           doc=parseString(data)  
           zLOG.LOG("import xml",zLOG.INFO,"parsed file")  
   
         elif filename:  
           fh=file(filename)  
           doc=parse(fh)  
           zLOG.LOG("import xml",zLOG.INFO,"parsed file")  
         while 1:          while 1:
             node=doc.getEvent()              node=doc.getEvent()
                           
             if node is None:              if node is None:
                 break;                  break;
             else:              else:
                 if node[1].nodeName=='ROW':                  if node[1].nodeName==containerTagName:
                     doc.expandNode(node[1])                      doc.expandNode(node[1])
                     cols=node[1].getElementsByTagName('COL')                      cols=node[1].getElementsByTagName('COL')
                     dataSet=[]                      dataSet=[]
Line 331  class ZSQLExtendFolder(Folder,Persistent Line 352  class ZSQLExtendFolder(Folder,Persistent
                         field=dataSet[nr]                          field=dataSet[nr]
   
                         searchStr="""select %s from %s where %s = '%s'"""%(identify,table,identify,field)                          searchStr="""select %s from %s where %s = '%s'"""%(identify,table,identify,field)
                         zLOG.LOG("import xml",zLOG.INFO,searchStr)                          logger("import xml",logging.INFO,searchStr)
                         search=self.ZSQLSimpleSearch(searchStr)                          search=self.ZSQLSimpleSearch(searchStr)
                         if search:                          if search:
                             update=True                              update=True
Line 345  class ZSQLExtendFolder(Folder,Persistent Line 366  class ZSQLExtendFolder(Folder,Persistent
                         field=dataSet[nr]                          field=dataSet[nr]
                                       
                         queryStr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,identify,field)                          queryStr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,identify,field)
                         zLOG.LOG("update xml",zLOG.INFO,queryStr)                          logger("update xml",logging.INFO,queryStr)
                         self.ZSQLSimpleSearch(queryStr)                          self.ZSQLSimpleSearch(queryStr)
                         ret+="ud: %s \n"%field                          ret+="ud: %s \n"%field
                     else:                      else:
Line 357  class ZSQLExtendFolder(Folder,Persistent Line 378  class ZSQLExtendFolder(Folder,Persistent
                                                   
                         queryStr="""INSERT INTO %s  (%s) VALUES (%s)"""%(table,fields,values)                          queryStr="""INSERT INTO %s  (%s) VALUES (%s)"""%(table,fields,values)
                         self.ZSQLSimpleSearch(queryStr)                          self.ZSQLSimpleSearch(queryStr)
                         zLOG.LOG("update xml",zLOG.INFO,queryStr)                          logger("update xml",logging.INFO,queryStr)
                         ret+="ad: %s \n"%field                          ret+="ad: %s \n"%field
                                                   
                 elif node[1].nodeName=="METADATA":                  elif node[1].nodeName=="METADATA":
Line 369  class ZSQLExtendFolder(Folder,Persistent Line 390  class ZSQLExtendFolder(Folder,Persistent
                     for name in names:                      for name in names:
                         fieldNames.append(name.getAttribute('NAME'))                          fieldNames.append(name.getAttribute('NAME'))
                                           
                     zLOG.LOG("update xml: fieldnames",zLOG.INFO,repr(fieldNames))                                             logger("update xml: fieldnames",logging.INFO,repr(fieldNames))                       
                     qstr="""select attname from pg_attribute, pg_class where attrelid = pg_class.oid and relname = '%s' """                      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)]                      columns=[x.attname for x in self.ZSQLSimpleSearch(qstr%table)]
                                     
                     for fieldName in fieldNames:                      for fieldName in fieldNames:
                         zLOG.LOG("update xml: fieldname",zLOG.INFO,repr(fieldName))                                               logger("update xml: fieldname",logging.INFO,repr(fieldName))                     
                         if fieldName not in columns:                          if fieldName not in columns:
                             qstr="""alter table %s add %s %s"""                              qstr="""alter table %s add %s %s"""
                             self.ZSQLSimpleSearch(qstr%(table,fieldName,'text'))                              self.ZSQLSimpleSearch(qstr%(table,fieldName,'text'))
                             zLOG.LOG("update xml: fieldname add",zLOG.INFO,qstr%(table,fieldName,'text'))                                                     logger("update xml: fieldname add",logging.INFO,qstr%(table,fieldName,'text'))                       
                 #fn=node[1].getAttribute("xml:id")                  #fn=node[1].getAttribute("xml:id")
                 #nf=file("xtf/"+fn+".xtf",'w')                  #nf=file("xtf/"+fn+".xtf",'w')
                 #nf.write("""<texts xmlns="http://emegir.info/xtf" xmlns:lem="http://emegir.info/lemma" >"""+node[1].toxml()+"</texts>")                  #nf.write("""<texts xmlns="http://emegir.info/xtf" xmlns:lem="http://emegir.info/lemma" >"""+node[1].toxml()+"</texts>")
                 #print "wrote: %s"%fn                  #print "wrote: %s"%fn
   
   
       def importXMLFileFMP(self,table,data=None,filename=None,update_fields=None,id_field=None,sync_mode=False,RESPONSE=None):
           '''
           Import FileMaker XML file (FMPXMLRESULT format) into the table.
           @param table: name of the table the xml shall be imported into
           @param data: xml data as bz2 string
           @param filename: xmlfile filename
           @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 RESPONSE: (optional)
           '''
           from xml.dom.pulldom import parseString,parse
           import transaction
   
           ret = ""
   
           if data:
               data=bz2.decompress(base64.decodestring(data))
               logger("fmpxml",logging.INFO,"received file")
               doc=parseString(data)
               logger("fmpxml",logging.INFO,"parsed file")
   
           elif filename:
               fh=file(filename)
               logger("fmpxml",logging.INFO,"reading file")
               doc=parse(fh)
               logger("fmpxml",logging.INFO,"parsed file")
   
           dbIDs = {}
           rowcnt = 0
           
           if id_field is not None:
               # prepare a list of ids for sync mode
               qstr="select %s from %s"%(id_field,table)
               for id in self.ZSQLSimpleSearch(qstr):
                   # value 0: not updated
                   dbIDs[id[0]] = 0;
                   rowcnt += 1
                   
               logger("fmpxml",logging.INFO,"%d entries in DB to sync"%rowcnt)
           
           fieldNames = []
           rowcnt = 0
           id_val = ''
           
           while 1:
               node=doc.getEvent()
           
               if node is None:
                   break;
               
               # METADATA tag defines number and names of fields in FMPXMLRESULT
               if node[1].nodeName == 'METADATA':
                   doc.expandNode(node[1])
               
                   names=node[1].getElementsByTagName('FIELD')
   
                   for name in names:
                       fn = name.getAttribute('NAME')
                       fieldNames.append(fn)
                   
                   if update_fields is None:
                       # update all fields
                       update_fields = fieldNames
                   
                   logger("fmpxml fieldnames:",logging.INFO,repr(fieldNames))
                   # get list of fields in db table
                   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)]
                   
                   # adjust db table to fields in XML and fieldlist
                   for fieldName in fieldNames:
                       logger("fmpxml fieldname:",logging.INFO,repr(fieldName))                     
                       if (fieldName not in columns) and (fieldName in update_fields):
                           qstr="""alter table %s add %s %s"""
                           self.ZSQLSimpleSearch(qstr%(table,fieldName,'text'))
                           logger("fmpxml add field:",logging.INFO,qstr%(table,fieldName,'text'))
                           
               # ROW tags (in RESULTSET tag) hold data
               elif node[1].nodeName == 'ROW':
                   rowcnt += 1
                   
                   doc.expandNode(node[1])
                   cols=node[1].getElementsByTagName('COL')
                   dataSet={}
                   i = 0
                   # populate with data
                   for col in cols:
                       data=col.getElementsByTagName('DATA')
                       dataSet[fieldNames[i]] = getTextFromNode(data[0])
                       i += 1
                       
                   update=False
                   
                   # synchronize by id_field
                   if id_field:
                       id_val=dataSet[id_field]
                       if id_val in dbIDs:
                           dbIDs[id_val] += 1
                           update=True
                   
                   if update:
                       # update existing row (by id_field)
                       setvals=[]
                       for fieldName in update_fields:
                           setvals.append("%s = %s"%(fieldName,self.ZSQLQuote(dataSet[fieldName])))
                       setStr=string.join(setvals, ',')
                       id_val=dataSet[id_field]
                       qstr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,id_field,id_val)
                       #logger("fmpxml update:",logging.INFO,queryStr)
                       self.ZSQLSimpleSearch(qstr)
                       ret+="up: %s \n"%id_val
                   else:
                       # create new row
                       fields=string.join(update_fields, ',')
                       values=string.join([" %s "%self.ZSQLQuote(dataSet[x]) for x in update_fields], ',')
                       qstr="""INSERT INTO %s (%s) VALUES (%s)"""%(table,fields,values)
                       self.ZSQLSimpleSearch(qstr)
                       #logger("fmpxml: insert",logging.INFO,queryStr)
                       ret+="ad: %s \n"%dataSet.get(id_field, rowcnt)
   
                   #logger("fmpxml row:",logging.INFO,"%d (%s)"%(rowcnt,id_val))
                   if (rowcnt % 10) == 0:
                       logger("fmpxml row:",logging.INFO,"%d (%s)"%(rowcnt,id_val))
                       transaction.commit()
   
           transaction.commit()
           if sync_mode:
               # delete unmatched entries in db
               for id in dbIDs.keys():
                   # find all not-updated fields
                   if dbIDs[id] == 0:
                       logger("fmpxml delete:",logging.INFO,id)
                       qstr = "DELETE FROM %s WHERE %s = '%s'"
                       self.ZSQLSimpleSearch(qstr%(table,id_field,id))
                       
                   elif dbIDs[id] > 1:
                       logger("fmpxml sync:",logging.INFO,"id used more than once?"+id)
               
               transaction.commit()
               
         return ret          return ret
                             
     def generateIndex(self,field,index_name,table,RESPONSE=None):      def generateIndex(self,field,index_name,table,RESPONSE=None):
Line 457  class ZSQLExtendFolder(Folder,Persistent Line 621  class ZSQLExtendFolder(Folder,Persistent
             return ""              return ""
   
     def getLabel(self):      def getLabel(self):
         """getLabel"""          """getLabe"""
         try:          try:
             return self.label              return self.label
         except:          except:
             return ""              return ""
     
     def getTitle(self):  
         """getTitle"""  
         try:  
             return self.title  
         except:  
             return ""  
   
   
     def getDescription(self):      def getDescription(self):
         """getDescription"""          """getLabe"""
         try:          try:
             return self.description              return self.description
         except:          except:
Line 501  class ZSQLExtendFolder(Folder,Persistent Line 657  class ZSQLExtendFolder(Folder,Persistent
     def formatAscii(self,str,url=None):      def formatAscii(self,str,url=None):
         """ersetze ascii umbrueche durch <br>"""          """ersetze ascii umbrueche durch <br>"""
         #url=None          #url=None
           
         if not str:  
             return ""  
           
         str=str.rstrip().lstrip()          str=str.rstrip().lstrip()
                   
         if url and str:          if url and str:
Line 565  class ZSQLExtendFolder(Folder,Persistent Line 717  class ZSQLExtendFolder(Folder,Persistent
         #print "field",field          #print "field",field
         if not field:          if not field:
             return 1              return 1
         if field=="":          if field.strip()=="":
             return 1              return 1
         return 0          return 0
   
Line 632  class ZSQLExtendFolder(Folder,Persistent Line 784  class ZSQLExtendFolder(Folder,Persistent
         ret+="""</select>"""          ret+="""</select>"""
         return ret          return ret
   
     def ZSQLOptionsFromSearchList(self,fieldname,results,fieldName,valueName=None,start=None, multiple='',startValue=None,additionalSelect="",size=None,linelen=None):      def ZSQLOptionsFromSearchList(self,fieldname,results,fieldName,valueName=None,start=None, multiple='',startValue=None,additionalSelect="",size=None,linelen=None,selected=None):
         """generate select options form a search list          """generate select options form a search list
         es wird          es wird
         <select name=fieldname mutiple>          <select name=fieldname mutiple>
Line 666  class ZSQLExtendFolder(Folder,Persistent Line 818  class ZSQLExtendFolder(Folder,Persistent
         for result in results:          for result in results:
             field=getattr(result,fieldName)              field=getattr(result,fieldName)
             fieldValue=getattr(result,valueName)              fieldValue=getattr(result,valueName)
   
             if fieldValue:              if fieldValue:
                  
                 if not linelen:                  if not linelen:
   
                       
                       if field == selected:
   
                           ret+="""<option value="%s" selected>%s</option>"""%(field,fieldValue)
                       else:
                     ret+="""<option value="%s">%s</option>"""%(field,fieldValue)                      ret+="""<option value="%s">%s</option>"""%(field,fieldValue)
   
                 else:                  else:
                     mist = """%s"""%(fieldValue)                      mist = """%s"""%(fieldValue)
                     if len(mist) > string.atoi(linelen):                      if len(mist) > string.atoi(linelen):
Line 678  class ZSQLExtendFolder(Folder,Persistent Line 839  class ZSQLExtendFolder(Folder,Persistent
         return ret          return ret
   
                           
     def ZSQLInlineSearchU(self,storename=None,**argv):      def ZSQLInlineSearchU(self,storename=None,args=None,**argv):
         """one element if exists"""          """one element if exists"""
         qs=[]          qs=[]
         if storename:          if storename:
Line 687  class ZSQLExtendFolder(Folder,Persistent Line 848  class ZSQLExtendFolder(Folder,Persistent
         else:          else:
             storename="foundCount"              storename="foundCount"
                           
           if args:
               argTmp=args
           else:
               argTmp=argv
           
   
         #print "INLINE:",argv          #print "INLINE:",argv
         for a in argv.keys():          for a in argTmp.keys():
             qs.append(a+"="+urllib.quote(str(argv[a])))          aFiltered=re.sub(r"^-","_",a) # beginning of a command should always be "_"
               qs.append(aFiltered+"="+urllib.quote(str(argTmp[a])))
         #return []            #return []  
         ret = self.parseQueryString(string.join(qs,","),"_",storename=storename)          ret = self.parseQueryString(string.join(qs,","),"_",storename=storename)
   
Line 700  class ZSQLExtendFolder(Folder,Persistent Line 866  class ZSQLExtendFolder(Folder,Persistent
         except:          except:
             return None              return None
                   
     def ZSQLInlineSearch(self,storename=None,**argv):       
       def ZSQLSequentialSearch(self,_fieldlist,_searchTerm,storename=None,args=None,**argv):
           """get a list of tuples (fields,searchoptions,table) to search the searchTerm in, returns dictionary. """
           #print "do search with:",_fieldlist,_searchTerm,storename,args,argv
           ret={} 
           if args:
               argTmp=args
           else:
               argTmp=argv
   
           for field in _fieldlist:
   
               argTmp2=copy.deepcopy(argTmp)
               argTmp2[field[0]]=_searchTerm
               argTmp2['_op_'+field[0]]=field[1]
               argTmp2['_table']=field[2]
               
               ret[field[0]]=(self.ZSQLInlineSearch(storename=storename,args=argTmp2),field[3],field[4],field[5],field[6])
           
           return ret
       
       
       def ZSQLInlineSearch(self,storename=None,args=None,**argv):
         """inlinesearch"""          """inlinesearch"""
                   
         qs=[]          qs=[]
Line 711  class ZSQLExtendFolder(Folder,Persistent Line 899  class ZSQLExtendFolder(Folder,Persistent
                           
           
   
           if args:
               argTmp=args
           else:
               argTmp=argv
   
   
         #print "INLINE:",argv          #print "INLINE:",argv
         for a in argv.keys():          for a in argTmp.keys():
             try:              aFiltered=re.sub(r"^-","_",a) # beginning of a command should always be "_"
                 qs.append(a+"="+urllib.quote(str(argv[a])))              qs.append(aFiltered+"="+urllib.quote(str(argTmp[a])))
             except:              
                 import urllib  
                 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)
   
     def ZSQLInlineSearch2(self,query):      def ZSQLInlineSearch2(self,query):
Line 735  class ZSQLExtendFolder(Folder,Persistent Line 928  class ZSQLExtendFolder(Folder,Persistent
         try:          try:
             self.getConnectionObj().manage_close_connection()              self.getConnectionObj().manage_close_connection()
         except:          except:
             zLOG.LOG("ZSQLResetConnection",zLOG.ERROR, '%s %s'%sys.exc_info()[:2])              logger("ZSQLResetConnection",logging.ERROR, '%s %s'%sys.exc_info()[:2])
         try:          try:
             self.getConnectionObj().manage_open_connection()              self.getConnectionObj().manage_open_connection()
         except:          except:
             zLOG.LOG("ZSQLResetConnection",zLOG.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,debug=None):      def ZSQLSimpleSearch(self,query=None,max_rows=1000000):
         """simple search"""          """simple search"""
   
           #print query
         if not query:          if not query:
             query=self.query              query=self.query
                   
         if debug:          
                 print "DEBUG: ZSQLSimpleSearch:", query  
         if (hasattr(self,"_v_searchSQL") and (self._v_searchSQL == None)) or (not hasattr(self,"_v_searchSQL")):          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","<dtml-var var>")              self._v_searchSQL=Shared.DC.ZRDB.DA.DA("_v_searchSQL","_v_searchSQL",self.getConnectionObj().getId(),"var","<dtml-var var>")
Line 763  class ZSQLExtendFolder(Folder,Persistent Line 955  class ZSQLExtendFolder(Folder,Persistent
                     try:                      try:
                         self.getConnectionObj().manage_open_connection()                          self.getConnectionObj().manage_open_connection()
                     except:                      except:
                         zLOG.LOG("ZSQLSimpleSearch",zLOG.ERROR, '%s %s'%sys.exc_info()[:2])                          logger("ZSQLSimpleSearch",logging.ERROR, '%s %s'%sys.exc_info()[:2])
         else:          else:
             try:              try:
   
Line 776  class ZSQLExtendFolder(Folder,Persistent Line 968  class ZSQLExtendFolder(Folder,Persistent
                     try:                      try:
                         self.getConnectionObj().manage_open_connection()                          self.getConnectionObj().manage_open_connection()
                     except:                      except:
                         zLOG.LOG("ZSQLSimpleSearch",zLOG.ERROR, '%s %s'%sys.exc_info()[:2])                          logger("ZSQLSimpleSearch",logging.ERROR, '%s %s'%sys.exc_info()[:2])
   
     def getConnectionObj(self):      def getConnectionObj(self):
         if hasattr(self,'connection_id'):          if hasattr(self,'connection_id'):
Line 809  class ZSQLExtendFolder(Folder,Persistent Line 1001  class ZSQLExtendFolder(Folder,Persistent
           
                   
                   
     def ZSQLAdd(self,format=None,RESPONSE=None,**argv):      def ZSQLAdd(self,format=None,RESPONSE=None,args=None,**argv):
         """Neuer Eintrag"""          """Neuer Eintrag"""
                           
       if args:
               argTmp=args
           else:
               argTmp=argv
   
         qs_temp=[]          qs_temp=[]
           
         for a in self.REQUEST.form.keys():          for a in self.REQUEST.form.keys():
Line 819  class ZSQLExtendFolder(Folder,Persistent Line 1016  class ZSQLExtendFolder(Folder,Persistent
   
         qs=string.join(qs_temp,",")          qs=string.join(qs_temp,",")
                   
         for field in argv.keys():          for field in argTmp.keys():
                    if field[0]=="_":                     if field[0]=="_":
                        fieldTmp="-"+field[1:]                         fieldTmp="-"+field[1:]
                    else:                     else:
                        fieldTmp=field                         fieldTmp=field
                                                 
                    qs+=",%s=%s"%(fieldTmp,argv[field])                     qs+=",%s=%s"%(fieldTmp,argTmp[field])
                   
                   
         addList={}          addList={}
Line 859  class ZSQLExtendFolder(Folder,Persistent Line 1056  class ZSQLExtendFolder(Folder,Persistent
         else:          else:
             return True              return True
                   
     def ZSQLChange(self,format=None,RESPONSE=None,USE_FORM=None,**argv):      def ZSQLChange(self,format=None,RESPONSE=None,USE_FORM=None,args=None,**argv):
         """change entries"""          """change entries"""
         #qs=self.REQUEST['QUERY_STRING']          #qs=self.REQUEST['QUERY_STRING']
         # very bad hack          # very bad hack
Line 867  class ZSQLExtendFolder(Folder,Persistent Line 1064  class ZSQLExtendFolder(Folder,Persistent
         qs_temp=[]          qs_temp=[]
         if USE_FORM or RESPONSE:          if USE_FORM or RESPONSE:
             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])))
   
                   
           if args:
               arg_tmp=args
           else:
               arg_tmp=argv
                   
         for field in argv.keys():          for field in arg_tmp.keys():
                                   
                    if field[0]=="_":                     if field[0]=="_":
                        fieldTmp="-"+field[1:]                         fieldTmp="-"+field[1:]
                    else:                     else:
                        fieldTmp=field                         fieldTmp=field
                                                 
                    qs_temp.append("%s=%s"%(fieldTmp,argv[field]))                     qs_temp.append("%s=%s"%(fieldTmp,arg_tmp[field]))
                   
                   
         changeList=[]          changeList=[]
                   logging.info("ZSQLChange qs_temp: %s"%repr(qs_temp))
         for q in qs_temp:          for q in qs_temp:
                           
             name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))              name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
Line 897  class ZSQLExtendFolder(Folder,Persistent Line 1099  class ZSQLExtendFolder(Folder,Persistent
                 identify=identify.split("=")[0]+"="+sql_quote(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]=="-" or name[0]=="_")) and (not len(value)==0):              #elif (not (name[0]=="-" or name[0]=="_")) and (not len(value)==0):
               elif (not (name[0]=="-" or name[0]=="_")):
   
           if value=="":
                       changeList.append("\""+name+"\"=null")
           else:
                 changeList.append("\""+name+"\"="+sql_quote(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)
           logger("ZSQLExtend",logging.INFO,"CHANGE: "+queryString)
   
         self.ZSQLSimpleSearch(queryString)          self.ZSQLSimpleSearch(queryString)
                   
Line 960  class ZSQLExtendFolder(Folder,Persistent Line 1167  class ZSQLExtendFolder(Folder,Persistent
                    if field[0]=="_":                     if field[0]=="_":
                        fieldTmp="-"+field[1:]                         fieldTmp="-"+field[1:]
                    else:                     else:
                        fieldTmp=urllib.unqoute(field)                         fieldTmp=field
                                                 
                    qs+=",%s=%s"%(fieldTmp,argv[field])                     qs+=",%s=%s"%(fieldTmp,argv[field])
                                         
Line 1064  class ZSQLExtendFolder(Folder,Persistent Line 1271  class ZSQLExtendFolder(Folder,Persistent
           
     def ZSQLNewSearch(self,linkText,storename=None,url=None,args=None,**argv):      def ZSQLNewSearch(self,linkText,storename=None,url=None,args=None,**argv):
         """suche mit alten parametern bis auf die in argv getauschten"""          """suche mit alten parametern bis auf die in argv getauschten"""
           str = self.ZSQLNewSearchURL(storename, url, args, **argv)
           return """<a href="%s"> %s</a>"""%(str,linkText)
           
   
       def ZSQLNewSearchURL(self, storename=None,url=None,args=None,**argv):
           """suche mit alten parametern bis auf die in argv getauschten"""
   
         if storename:           if storename: 
             """store"""                """store"""  
Line 1083  class ZSQLExtendFolder(Folder,Persistent Line 1296  class ZSQLExtendFolder(Folder,Persistent
                           
                           
             arg=argTmp[0:]              arg=argTmp[0:]
             if arg[0]=="_":arg="-"+argTmp[1:] # aender _ in - als standard              
   
             if arg not in queryList: # noch nicht drin              if arg not in queryList: # noch nicht drin
                 querys.append("%s=%s"%(arg,argv[argTmp]))                  querys.append("%s=%s"%(arg,argv[argTmp]))
Line 1107  class ZSQLExtendFolder(Folder,Persistent Line 1320  class ZSQLExtendFolder(Folder,Persistent
         else:          else:
             str="ZSQLSearch?"+"&".join(newquery)              str="ZSQLSearch?"+"&".join(newquery)
                   
         return """<a href="%s"> %s</a>"""%(str,linkText)          return str
           
     def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None):      def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None):
         """analysieren den QueryString"""          """analysieren den QueryString"""
Line 1124  class ZSQLExtendFolder(Folder,Persistent Line 1337  class ZSQLExtendFolder(Folder,Persistent
         opfields={}          opfields={}
         lopfields={} #Verknuepfung bei mehrfachauswahl von einem feld          lopfields={} #Verknuepfung bei mehrfachauswahl von einem feld
         sortfields={} #order of sortfields          sortfields={} #order of sortfields
           diacritics={} #diacritische zeichen, falls "no", dann werden diese fuer das feld gefiltert.
         sortAllFields=None          sortAllFields=None
         skip=""          skip=""
         rangeStart=0          rangeStart=0
Line 1131  class ZSQLExtendFolder(Folder,Persistent Line 1345  class ZSQLExtendFolder(Folder,Persistent
         searchFields={}          searchFields={}
         searchFieldsOnly={}          searchFieldsOnly={}
         queryTemplate=[]          queryTemplate=[]
           outerjoin=""
                   
         if not select:          if not select:
             select="oid,*"              select="oid,*"
Line 1166  class ZSQLExtendFolder(Folder,Persistent Line 1381  class ZSQLExtendFolder(Folder,Persistent
                     field=name[5:]                      field=name[5:]
                     lopfields[field]=lop                      lopfields[field]=lop
                                           
                   if name[0:11]==iCT+"diacritics":
                       field=name[12:]
                       diacritics[field]=value
                       
                 if name[0:10]==iCT+"sortorder":                  if name[0:10]==iCT+"sortorder":
                     #sort=value                      #sort=value
                                           
Line 1191  class ZSQLExtendFolder(Folder,Persistent Line 1410  class ZSQLExtendFolder(Folder,Persistent
             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
               
               if diacritics.get(name,'yes')=='no':
                   """filter diacritische zeichen"""
                   value=unicodedata.normalize('NFKD', value.decode('utf-8')).encode('ASCII', 'ignore')
                   
             if name==iCT+"lop":              if name==iCT+"lop":
                 lop=value                  lop=value
             elif name==iCT+"table":              elif name==iCT+"table":
Line 1207  class ZSQLExtendFolder(Folder,Persistent Line 1431  class ZSQLExtendFolder(Folder,Persistent
                 skip="OFFSET "+str(value)                  skip="OFFSET "+str(value)
                 rangeStart=str(value)                  rangeStart=str(value)
             elif name==iCT+"join":              elif name==iCT+"join":
                   
                 whereList.append(value)                  whereList.append(value)
               elif name==iCT+"outerjoin":
                   
                   outerjoin=value
             elif name==iCT+"sort":              elif name==iCT+"sort":
                 sortstrs=[]                  sortstrs=[]
            
                 for word in value.split(','):                  for word in value.split(','):
                     wordstr=word.lstrip().rstrip()                      wordstr=word.lstrip().rstrip()
                     if sortAllFields:                      if sortAllFields:
Line 1231  class ZSQLExtendFolder(Folder,Persistent Line 1460  class ZSQLExtendFolder(Folder,Persistent
                 op=value                  op=value
   
   
               #sonderfall Name hat das Format: 
               #TABELLE.SUCHFELD_IN_DIESER_TABELLE.SELECT_FIELD.IDENTIFIER_IN_TABELLE_-table
               #i.e. erzeugt wird
               #das Statement 
               #WHERE IDENTIFIER_IN_TABELLE in (select * from SELECT_FIELD
               #where LOWER(SUCHFELD_IN_DIESER_TABELLE) something  value)
               #something is defined by _op_TABELLE.SUCHFELD_IN_DIESER_TABELLE.SELECT_FIELD.IDENTIFIER_IN_TABELLE
                           
             elif (not name[0]==iCT) and len(punktsplit)==4:              elif (not name[0]==iCT) and len(punktsplit)==4:
                 if opfields.has_key(name):                  if opfields.has_key(name):
Line 1239  class ZSQLExtendFolder(Folder,Persistent Line 1475  class ZSQLExtendFolder(Folder,Persistent
                     op="ct"                      op="ct"
                 namealt=name                  namealt=name
                 name="LOWER("+punktsplit[1]+")"                   name="LOWER("+punktsplit[1]+")" 
                   value=value.lower()
                 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 1355  class ZSQLExtendFolder(Folder,Persistent Line 1591  class ZSQLExtendFolder(Folder,Persistent
                                   
         #print "QE",table          #print "QE",table
         #print (select,table,where,sort,maxstr,skip)          #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 %s"%(select,table,outerjoin,where,sort,maxstr,skip)
   
         if not nostore=="yes":          if not nostore=="yes":
                           
Line 1400  class ZSQLExtendFolder(Folder,Persistent Line 1636  class ZSQLExtendFolder(Folder,Persistent
                 self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)                  self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)
             self.REQUEST.SESSION[storename]['rangeSize']=limit              self.REQUEST.SESSION[storename]['rangeSize']=limit
             self.REQUEST.SESSION[storename]['searchFields']=searchFields              self.REQUEST.SESSION[storename]['searchFields']=searchFields
             self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly  
   
               self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly
                   
         if not NoQuery:          if not NoQuery:
   
Line 1425  class ZSQLExtendFolder(Folder,Persistent Line 1661  class ZSQLExtendFolder(Folder,Persistent
     def ZSQLQuery(self,query,debug=None):      def ZSQLQuery(self,query,debug=None):
         """query"""          """query"""
         if debug:          if debug:
             zLOG.LOG("ZSQLQuery", zLOG.INFO, query)              logger("ZSQLQuery", logging.INFO, query)
                           
         return self.ZSQLSimpleSearch(query)          return self.ZSQLSimpleSearch(query)
   
Line 1453  class ZSQLExtendFolder(Folder,Persistent Line 1689  class ZSQLExtendFolder(Folder,Persistent
         self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")          self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
         self.REQUEST.SESSION['come_from_search']="yes"          self.REQUEST.SESSION['come_from_search']="yes"
                   
         return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))          return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile)+"?"+rq)
   
           
     def ZSQLint(self,string):      def ZSQLint(self,string):

Removed from v.1.81  
changed lines
  Added in v.1.103


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