--- ZSQLExtend/ZSQLExtend.py 2004/09/12 11:05:43 1.33
+++ ZSQLExtend/ZSQLExtend.py 2004/10/29 13:40:24 1.48
@@ -5,7 +5,7 @@ from Globals import DTMLFile
import urllib
import re
import string
-from pyPgSQL import libpq
+#from pyPgSQL import libpq
from AccessControl import getSecurityManager
import os.path
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
@@ -13,6 +13,32 @@ from Products.PageTemplates.PageTemplate
from Products.ZSQLMethods.SQL import SQLConnectionIDs
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):
return SQLConnectionIDs(self)
@@ -32,10 +58,10 @@ class ZSQLExtendFolder(Folder,Persistent
"""suche relative haufigkeiten"""
ret={}
allRecords=len(self.ZSQLSimpleSearch(statement + " where "+wherePart))
- print statement + " where "+wherePart
+
for oneclass in classes:
ret[oneclass]=len(self.ZSQLSimpleSearch(statement + " where ("+wherePart+") and "+ relStatement%oneclass))
- print statement + " where ("+wherePart+") and "+ relStatement%oneclass
+
return (ret,allRecords)
def content_html(self):
@@ -45,7 +71,7 @@ class ZSQLExtendFolder(Folder,Persistent
obj=getattr(self,"ZSQLBibliography_template")
return obj()
except:
- pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt',content_type='text/htm').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ZSQLBibliography_template_standard.zpt'),content_type='text/html').__of__(self)
pt.content_type="text/html"
return pt()
@@ -78,7 +104,7 @@ class ZSQLExtendFolder(Folder,Persistent
def changeZSQLExtendForm(self):
"""change folder config"""
- pt=PageTemplateFile('Products/ZSQLExtend/zpt/changeZSQLExtendForm.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeZSQLExtendForm.zpt')).__of__(self)
return pt()
@@ -235,6 +261,7 @@ class ZSQLExtendFolder(Folder,Persistent
def ZSQLInlineSearch(self,storename=None,**argv):
"""inlinesearch"""
+
qs=[]
if storename:
"""store"""
@@ -245,7 +272,12 @@ class ZSQLExtendFolder(Folder,Persistent
#print "INLINE:",argv
for a in argv.keys():
- qs.append(a+"="+urllib.quote(str(argv[a])))
+ try:
+ qs.append(a+"="+urllib.quote(str(argv[a])))
+ except:
+ import urllib
+ qs.append(a+"="+urllib.quote(str(argv[a])))
+
#return []
return self.parseQueryString(string.join(qs,","),"_",storename=storename)
@@ -254,23 +286,34 @@ class ZSQLExtendFolder(Folder,Persistent
qs=[]
-
+
#print "INLINE:",query
return self.ZSQLSimpleSearch(query)
def ZSQLSimpleSearch(self,query=None):
""" returrn SQLSearch"""
+ #print "hi",query
if not query:
query=self.query
-
- if self.search.meta_type=="Z SQL Method":
+ if getattr(self,'_v_search',None):
+
+ 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)
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)
else:
- return []
+ 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 []
@@ -294,7 +337,7 @@ class ZSQLExtendFolder(Folder,Persistent
valueList=[]
for x in addList.keys():
keyList.append("\""+x+"\"")
- valueList.append(libpq.PgQuoteString(addList[x]))
+ valueList.append(sql_quote(addList[x]))
keyString=string.join(keyList,",")
valueString=string.join(valueList,",")
@@ -304,7 +347,7 @@ class ZSQLExtendFolder(Folder,Persistent
return self.REQUEST.RESPONSE.redirect(format)
def ZSQLChange(self,**argv):
- """Ändern von Einträgen"""
+ """change entries"""
#qs=self.REQUEST['QUERY_STRING']
# very bad hack
qs_temp=[]
@@ -327,42 +370,17 @@ class ZSQLExtendFolder(Folder,Persistent
table=urllib.unquote(value)
elif name=="-identify":
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":
format=urllib.unquote(value)
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,",")
queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
self.ZSQLSimpleSearch(queryString)
return self.REQUEST.RESPONSE.redirect(format)
- def ZSQLChange_old(self):
- """Ändern von Einträgen"""
- qs=self.REQUEST['QUERY_STRING']
- #print "CHANGE QS",self.REQUEST
- #return self.REQUEST
- changeList=[]
- for q in qs.split("&"):
- name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
- value=q.split("=")[1]
- value=re.sub(r'\+'," ",value)
- value=urllib.unquote(value)
- if name=="-table":
- table=urllib.unquote(value)
- elif name=="-identify":
- identify=urllib.unquote(value)
- identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
- elif name=="-format":
- format=urllib.unquote(value)
- elif (not name[0]=="-") and (not len(value)==0):
- changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
- changeString=string.join(changeList,",")
- queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
- self.ZSQLSimpleSearch(queryString)
- return self.REQUEST.RESPONSE.redirect(format)
-
-
+
def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],**argv):
"""find2"""
@@ -389,7 +407,7 @@ class ZSQLExtendFolder(Folder,Persistent
ret.append(x)
return ret
- #self.REQUEST.SESSION['come_from_search']="no" # zurücksetzen
+ #self.REQUEST.SESSION['come_from_search']="no" # zuruecksetzen
if qs=="":
if self.REQUEST['QUERY_STRING']:
@@ -486,18 +504,72 @@ class ZSQLExtendFolder(Folder,Persistent
storename="foundCount"
return str(min(int(self.REQUEST.SESSION[storename]['rangeEnd']),int(self.REQUEST.SESSION[storename]['count'])))
+
+ def ZSQLNewQuery(self,linkText,storename=None,**argv):
+ """suche neu"""
+ return self.ZSQLNewSearch(linkText,storename,url=self.REQUEST['URL'],args=argv)
+
+ def ZSQLNewSearch(self,linkText,storename=None,url=None,args=None,**argv):
+ """suche mit alten parametern bis auf die in argv getauschten"""
+
+ if storename:
+ """store"""
+ else:
+ storename="foundCount"
+ qs=self.REQUEST.SESSION[storename]['qs']
+
+ if args:
+ argv=args
+
+ querys=qs.split(",")
+ argList=[]
+ arg=""
+ queryList=[x.split("=")[0] for x in querys]
+
+ for argTmp in argv.keys():
+
+
+ arg=argTmp[0:]
+ if arg[0]=="_":arg="-"+argTmp[1:] # aender _ in - als standard
+
+ if arg not in queryList: # noch nicht drin
+ querys.append("%s=%s"%(arg,argv[argTmp]))
+ argList.append(arg)
+
+
+
+ newquery=[]
+ for query in querys:
+ queryArg=query.split("=")[0]
+ qarg=queryArg[0:]
+ if qarg[0]=="-":qarg="_"+queryArg[1:] # aender _ in - als standard
+
+ if queryArg in argList:
+ newquery.append("%s=%s"%(queryArg,argv[qarg]))
+ else:
+ newquery.append(query)
+
+ if url:
+ str=url+"?"+"&".join(newquery)
+ else:
+ str="ZSQLSearch?"+"&".join(newquery)
+
+ return """ %s"""%(str,linkText)
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"""
- #print "NO",nostore
+
+
lop="AND" # standardsuche mit and
- max="ALL" #standard alle auswählen
+ max="ALL" #standard alle auswaehlen
maxstr=""
whereList=[]
sort=""
op="bw"
opfields={}
- lopfields={} #Verknüpfung bei mehrfachauswahl von einem feld
+ lopfields={} #Verknuepfung bei mehrfachauswahl von einem feld
+ sortfields={} #order of sortfields
+ sortAllFields=None
skip=""
rangeStart=0
limit=0
@@ -507,6 +579,9 @@ class ZSQLExtendFolder(Folder,Persistent
select="oid,*"
#print "Q",nostore,qs
#check for op
+
+
+
splitted=qs.split(",")
if tableExt:
@@ -534,6 +609,18 @@ class ZSQLExtendFolder(Folder,Persistent
field=name[5:]
lopfields[field]=lop
+
+ if name[0:10]==iCT+"sortorder":
+ #sort=value
+
+ field=name[11:]
+ sortAllFields=None
+ #no field selected
+ if field=="":
+ sortAllFields=value
+ else:
+ sortfields[field]=value
+
#print "HI",op,field
#print opfieldsa
#now analyse the querystring
@@ -548,7 +635,7 @@ class ZSQLExtendFolder(Folder,Persistent
except:
value=""
- #value=libpq.PgQuoteString(value)
+ #value=sql_quote(value)
if name==iCT+"lop":
@@ -569,7 +656,20 @@ class ZSQLExtendFolder(Folder,Persistent
elif name==iCT+"join":
whereList.append(value)
elif name==iCT+"sort":
- sort="ORDER BY "+value.replace(' AND ',',')
+ sortstrs=[]
+ for word in value.split(','):
+ wordstr=word.lstrip().rstrip()
+ if sortAllFields:
+ order=sortAllFields
+ else:
+ order=sortfields.get(wordstr,'ASC')
+
+ if not (wordstr == ""):
+ sortstrs.append(wordstr+" "+order)
+ if len(sortstrs)>0:
+ sort="ORDER BY "+string.join(sortstrs,',')
+
+
elif name==iCT+"token":
if not nostore=="yes":
self.REQUEST.SESSION['token']=value
@@ -591,17 +691,36 @@ class ZSQLExtendFolder(Folder,Persistent
namealt=name
name="LOWER("+name+")"
if op=="ct":
- tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
+ tmp=(name+" LIKE "+sql_quote("%"+value+"%"))
elif op=="gt":
- tmp=(name+">"+libpq.PgQuoteString(value))
+ tmp=(name+">"+sql_quote(value))
elif op=="lt":
- tmp=(name+"<"+libpq.PgQuoteString(value))
+ tmp=(name+"<"+sql_quote(value))
elif op=="eq":
- tmp=(name+"="+libpq.PgQuoteString(value))
+ tmp=(name+"="+sql_quote(value))
elif op=="bw":
- tmp=(name+" LIKE "+libpq.PgQuoteString(value+"%"))
+ tmp=(name+" LIKE "+sql_quote(value+"%"))
elif op=="ew":
- tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value))
+ tmp=(name+" LIKE "+sql_quote("%"+value))
+ elif op=="all":
+ tmps=[]
+ for word in value.split(" "):
+ tmps.append(name+" LIKE "+sql_quote("%"+word+"%"))
+
+ 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"
if (not tableExt) or (namealt.split('.')[0]==tableExt):
@@ -612,32 +731,6 @@ class ZSQLExtendFolder(Folder,Persistent
searchFields[name]=tmp
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()]
if len(whereList)>0:
@@ -660,7 +753,7 @@ class ZSQLExtendFolder(Folder,Persistent
where+="and "+restrictConnect[0]+" in ("+restrictConnect[1]+")"
#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)
if not nostore=="yes":
@@ -674,6 +767,9 @@ class ZSQLExtendFolder(Folder,Persistent
#print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2']
if not self.REQUEST.SESSION.has_key(storename):
self.REQUEST.SESSION[storename]={}
+
+ self.REQUEST.SESSION[storename]['qs']=qs #sichere Querystring
+
if self.REQUEST.SESSION[storename].has_key('queryString2'):
if not self.REQUEST.SESSION[storename]['queryString2']==query2:
@@ -698,7 +794,7 @@ class ZSQLExtendFolder(Folder,Persistent
self.REQUEST.SESSION[storename]['rangeSize']=limit
self.REQUEST.SESSION[storename]['searchFields']=searchFields
self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly
-
+
if not NoQuery:
return self.ZSQLQuery(query)
@@ -708,6 +804,7 @@ class ZSQLExtendFolder(Folder,Persistent
def ZSQLQuery(self,query):
"""query"""
+ #print "hi",query
return self.ZSQLSimpleSearch(query)
def ZSQLSearch(self):
@@ -752,6 +849,7 @@ class ZSQLExtendFolder(Folder,Persistent
def nextLink(self,html,storename="foundCount"):
"""nextLink"""
+
try:
limit=self.REQUEST.SESSION[storename]['rangeSize']
if int(limit)==0 :
@@ -770,12 +868,12 @@ class ZSQLExtendFolder(Folder,Persistent
if self.REQUEST['QUERY_STRING']=="":
qs=self.REQUEST.SESSION['query']
- queries=string.split(qs,",")
+ queries=string.split(qs,",")[0:]
else:
qs=self.REQUEST['QUERY_STRING']
- queries=string.split(qs,"&")
+ queries=string.split(qs,"&")[0:]
@@ -784,10 +882,9 @@ class ZSQLExtendFolder(Folder,Persistent
skipFound=0
for query in queries:
+
+ if query[0]=="_" : query="-"+query[1:]
- #print query.split("=")[0]
- if query[0]=="_" : query[0]="-"
-
if query.split("=")[0].lower()=="-skip":
skipFound=1
@@ -799,12 +896,13 @@ class ZSQLExtendFolder(Folder,Persistent
newquery.append(query)
newquerystring=string.join(newquery,"&")
-
- return "%s"%(self.actualPath()+"?"+newquerystring,html)
+ return "%s"%(self.REQUEST['URL']+"?"+newquerystring,html)
+
def prevLink(self,html,storename="foundCount"):
"""prev link"""
+
try:
limit=self.REQUEST.SESSION[storename]['rangeSize']
if int(limit)==0 :
@@ -825,7 +923,7 @@ class ZSQLExtendFolder(Folder,Persistent
if self.REQUEST['QUERY_STRING']=="":
qs=self.REQUEST.SESSION['query']
- #qs=re.sub(r'_','-',qs) #aendern für query
+ #qs=re.sub(r'_','-',qs) #aendern fuer query
queries=string.split(qs,",")
@@ -856,7 +954,7 @@ class ZSQLExtendFolder(Folder,Persistent
newquerystring=string.join(newquery,"&")
- return "%s"%(self.actualPath()+"?"+newquerystring,html)
+ return "%s"%(self.REQUEST['URL']+"?"+newquerystring,html)
@@ -981,7 +1079,7 @@ class ZSQLBibliography(Folder,ZSQLExtend
def changeZSQLBibliographyForm(self):
"""change folder config"""
- pt=PageTemplateFile('Products/ZSQLExtend/zpt/changeZSQLBibliographyForm.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeZSQLBibliographyForm.zpt')).__of__(self)
return pt()
@@ -992,7 +1090,7 @@ class ZSQLBibliography(Folder,ZSQLExtend
obj=getattr(self,"ZSQLBibliography_template")
return obj()
except:
- pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ZSQLBibliography_template_standard.zpt')).__of__(self)
pt.content_type="text/html"
return pt()
@@ -1085,23 +1183,36 @@ class ZSQLBibliography(Folder,ZSQLExtend
fn=os.path.splitext(self.REQUEST['fn'])[0]+"."
self.REQUEST['fn']=fn
- pt=PageTemplateFile('Products/ZSQLExtend/zpt/record2.xml').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','record2.xml')).__of__(self)
pt.content_type="text/xml"
return pt()
def getMetaDataXML(self):
"""crate index meta"""
- pt=PageTemplateFile('Products/ZSQLExtend/zpt/record.xml').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','record.xml')).__of__(self)
pt.content_type="text/xml"
return pt()
def getMetaDatasXML(self):
"""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="""
"""
for found in self.ZSQLSimpleSearch("select oid from %s limit ALL"%self.tableName):
- link=self.absolute_url()+"/"+"record.html?oid=%i"%found.oid
- metalink=self.absolute_url()+"/"+"getMetaDataXML?oid=%i"%found.oid
+ base_url = self.absolute_url()
+ 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+="""\n"""%(link,metalink)