--- ZSQLExtend/ZSQLExtend.py 2003/11/28 15:03:10 1.1
+++ ZSQLExtend/ZSQLExtend.py 2004/02/09 14:22:30 1.11
@@ -5,21 +5,86 @@ from Globals import DTMLFile
import urllib
import re
import string
+from pyPgSQL import libpq
from AccessControl import getSecurityManager
+import os.path
+
+def quoteString(name):
+ #return re.sub(r'([\(\)\?])',"\\\1",name)
+ #return "Euklid"
+ return name
class ZSQLExtendFolder(Persistent, Implicit, Folder):
"""Folder"""
meta_type="ZSQLExtendFolder"
+
+ def actualPath(self,url=None):
+ """path"""
+
+ if self.REQUEST['HTTP_X_FORWARDED_SERVER']=='':
+ host=self.REQUEST['HTTP_HOST']
+ else:
+ host=self.REQUEST['HTTP_X_FORWARDED_SERVER']
+ if not url:
+ return "http://"+host+self.REQUEST['PATH_TRANSLATED']
+ else:
+ temp=self.REQUEST[url].split("/")
+ temp[2]=host
+ return string.join(temp,"/")
+
+ def getRequest(self):
+ """request"""
+ return self.REQUEST
+
+ def lowerEnd(self,path):
+ """oinly for demo"""
+ return os.path.splitext(path)[0]+".jpg"
+
+ def ZSQLisEmpty(self,field):
+ """Teste ob Treffer leer"""
+ #print "field",field
+ if not field:
+ return 1
+ if field=="":
+ return 1
+ return 0
+
+ def ZSQLsearchOptions(self,fieldname=""):
+ """return HTML Fragment with search options"""
+
+ ret=""""""%fieldname
+ return ret
- def ZSQLInlineSearch(self,**argv):
+ def ZSQLInlineSearch(self,storename=None,**argv):
"""inlinesearch"""
qs=[]
-
+ if storename:
+ """store"""
+ else:
+ storename="foundCount"
+
+
+ #print "INLINE:",argv
for a in argv.keys():
qs.append(a+"="+urllib.quote(str(argv[a])))
+ #return []
+ return self.parseQueryString(string.join(qs,","),"_",storename=storename)
- return self.parseQueryString(string.join(qs,","),"_")
+ def ZSQLInlineSearch2(self,query):
+ """inlinesearch"""
+ qs=[]
+
+
+
+ #print "INLINE:",query
+
+ return self.search(var=query)
def ZSQLAdd(self):
"""Neuer Eintrag"""
@@ -41,7 +106,7 @@ class ZSQLExtendFolder(Persistent, Impli
valueList=[]
for x in addList.keys():
keyList.append("\""+x+"\"")
- valueList.append("\'"+addList[x]+"\'")
+ valueList.append(libpq.PgQuoteString(addList[x]))
keyString=string.join(keyList,",")
valueString=string.join(valueList,",")
@@ -50,7 +115,41 @@ class ZSQLExtendFolder(Persistent, Impli
self.search(var=queryString)
return self.REQUEST.RESPONSE.redirect(format)
- def ZSQLChange(self):
+ def ZSQLChange(self,**argv):
+ """Ändern von Einträgen"""
+ #qs=self.REQUEST['QUERY_STRING']
+ # very bad hack
+ qs_temp=[]
+
+ for a in self.REQUEST.form.keys():
+ qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a])))
+
+ qs=string.join(qs_temp,"&")
+
+
+ #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.search(var=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
@@ -65,97 +164,239 @@ class ZSQLExtendFolder(Persistent, Impli
table=urllib.unquote(value)
elif name=="-identify":
identify=urllib.unquote(value)
- identify=identify.split("=")[0]+"=\'"+identify.split("=")[1]+"\'"
+ 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+"\"=\'"+urllib.unquote(value)+"\'")
+ changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
changeString=string.join(changeList,",")
queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
self.search(var=queryString)
return self.REQUEST.RESPONSE.redirect(format)
- def ZSQLFind(self,qs="",select="*"):
+ def ZSQLFind(self,qs="",select="oid,*",storename=None):
"""Find"""
if qs=="":
if self.REQUEST['QUERY_STRING']:
qs=self.REQUEST['QUERY_STRING']
+
+
qs=string.join(qs.split("&"),",")
else:
+
qs=self.REQUEST.SESSION['query']
else:
qs=string.join(qs.split("&"),",")
- return self.parseQueryString(qs,"-",select=select,storemax="yes")
+
- def ZSQLFoundCount(self,founds):
- try:
- return len(founds)
- except:
- return 0
+ qs=re.sub("\\+"," ",qs)# Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular.
+ #print "QS",qs
+ if storename:
+ """store"""
+ else:
+ storename="foundCount"
+
+ ret=self.parseQueryString(qs,"-",select=select,storemax="yes",storename=storename)
+ #print self.REQUEST.SESSION["foundCount"]
+
+ return ret
+
+ def ZSQLFoundCountLen(self,var):
+ return len(var)
+
+ def ZSQLFoundCount(self,qs="",select="*",storename=None):
+
+ ## if qs=="":
+
+## if self.REQUEST['QUERY_STRING']:
+
+## qs=self.REQUEST['QUERY_STRING']
+## qs=string.join(qs.split("&"),",")
+## else:
+
+## qs=self.REQUEST.SESSION['query']
+## else:
+## qs=string.join(qs.split("&"),",")
+
+
+## temp= self.parseQueryString(qs,"-",select=select,storemax="yes",nostore="yes")
+ if storename:
+ """store"""
+ else:
+ storename="foundCount"
+
+ return self.REQUEST.SESSION[storename]['count']
- def parseQueryString(self,qs,iCT,storemax="no",select=None):
- """analysierren den QueryString"""
+ def ZSQLRangeStart(self,storename=None):
+
+ if storename:
+ """store"""
+ else:
+ storename="foundCount"
+
+ return self.REQUEST.SESSION[storename]['rangeStart']
+
+ def ZSQLRangeSize(self,storename=None):
+
+ if storename:
+ """store"""
+ else:
+ storename="foundCount"
+
+ return self.REQUEST.SESSION[storename]['rangeSize']
+
+ def ZSQLRangeEnd(self,storename=None):
+
+ if storename:
+ """store"""
+ else:
+ storename="foundCount"
+
+ return self.REQUEST.SESSION[storename]['rangeEnd']
+
+ def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None):
+ """analysieren den QueryString"""
+ #print "NO",nostore
lop="AND" # standardsuche mit and
max="ALL" #standard alle auswählen
+ maxstr=""
whereList=[]
sort=""
op="bw"
-
+ opfields={}
+ skip=""
+ rangeStart=0
+ limit=0
+ searchFields={}
+
if not select:
- select="*"
+ select="oid,*"
+ #print "Q",nostore,qs
+ #check for op in the case of inline search
- for q in qs.split(","):
- try:
-
+ splitted=qs.split(",")
+
+
+ for q in splitted:
+
name=re.sub("r'+'"," ",q.split("=")[0].lower())
value=urllib.unquote(q.split("=")[1])
- if name==iCT+"lop":
- lop=value
- elif name==iCT+"table":
- table=value
- elif name==iCT+"select":
- select=value
- elif name==iCT+"max":
- max=str(value)
-
- elif name==iCT+"join":
- whereList.append(value)
- elif name==iCT+"sort":
- sort="ORDER BY "+value
- elif name==iCT+"token":
+ if name[0:3]==iCT+"op":
+ op=value
+ field=name[4:]
+ opfields[field]=op
+
+ #print opfieldsa
+ #now analyse the querystring
+ for q in qs.split(","):
+
+
+ #try:
+
+ name=re.sub("r'+'"," ",q.split("=")[0].lower())
+ value=urllib.unquote(q.split("=")[1])
+ #value=libpq.PgQuoteString(value)
+
+
+ if name==iCT+"lop":
+ lop=value
+ elif name==iCT+"table":
+ table=value
+ elif name==iCT+"select":
+ select=value
+ elif name==iCT+"max":
+ maxstr="LIMIT "+str(value)
+ limit=str(value)
+ elif name==iCT+"skip":
+ skip="OFFSET "+str(value)
+ rangeStart=str(value)
+ elif name==iCT+"join":
+ whereList.append(value)
+ elif name==iCT+"sort":
+ sort="ORDER BY "+value
+ elif name==iCT+"token":
+ if not nostore=="yes":
self.REQUEST.SESSION['token']=value
- elif name==iCT+"op":
- op=value
+ elif name==iCT+"op":
+ op=value
- elif (not name[0]==iCT) and (not len(value)==0):
- if op=="ct":
- whereList.append(name+"~\'.*"+value+".*\'")
- elif op=="gt":
- whereList.append(name+">\'"+value+"\'")
- elif op=="lt":
- whereList.append(name+"<\'"+value+"\'")
- elif op=="eq":
- whereList.append(name+"=\'"+value+"\'")
- elif op=="bw":
- whereList.append(name+"~\'"+value+".*\'")
- elif op=="ew":
- whereList.append(name+"~\'.*"+value+"\'")
- op="ct"
- except:
- print "END"
+
+
+ elif (not name[0]==iCT) and (not len(value)==0):
+
+ #print "OP",op,name
+ value=value.lower()
+
+ searchFields[name]=value
+
+ 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
if len(whereList)>0:
where="WHERE "+string.join(whereList," "+lop+" ")
else:
where=""
#print "QE",table
- query="SELECT %s FROM %s %s %s"%(select,table,where,sort)
+ query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)
+ if not nostore=="yes":
+
+ self.REQUEST.SESSION['qs']=opfields
+ #print "IAMHERE again:", query
+ if storename:
+ query2="SELECT count(*) FROM %s %s"%(table,where)
+ #print "storing",query2
+ #print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2']
+ if not self.REQUEST.SESSION.has_key(storename):
+ self.REQUEST.SESSION[storename]={}
+ if self.REQUEST.SESSION[storename].has_key('queryString2'):
+ #print "HI",storename
+ if not self.REQUEST.SESSION[storename]['queryString2']==query2:
+ #print "HOOOOO",storename
+ self.REQUEST.SESSION[storename]['queryString2']=query2
+ self.REQUEST.SESSION[storename]['count']=self.search(var=query2)[0].count
+ #print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2']
+
+ else:
+ self.REQUEST.SESSION[storename]['queryString2']=query2
+ self.REQUEST.SESSION[storename]['count']=self.search(var=query2)[0].count
+ #print "QUERYNEW",self.REQUEST.SESSION[storename]['queryString2']
+
+
+ self.REQUEST.SESSION[storename]['rangeStart']=rangeStart
+ if limit=="all":
+ self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
+ else:
+ self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)
+ self.REQUEST.SESSION[storename]['rangeSize']=limit
+ self.REQUEST.SESSION[storename]['searchFields']=searchFields
+
+ #print query
return self.search(var=query)
+
def ZSQLSearch(self):
"""To be done"""
@@ -181,7 +422,121 @@ class ZSQLExtendFolder(Persistent, Impli
return(int(string))
except:
return 0
- def prevLink(self,html):
+
+ def getZSQLSearchFieldsList(self,storename="foundCount"):
+ """get searchfieldList"""
+ print self.REQUEST.SESSION[storename]['searchFields'].keys()
+ return self.REQUEST.SESSION[storename]['searchFields'].keys()
+
+ def getZSQLSearchFields(self,storename="foundCount"):
+ """get searchfield"""
+ print "SF",self.REQUEST.SESSION[storename]['searchFields']
+ return self.REQUEST.SESSION[storename]['searchFields']
+
+
+ def nextLink(self,html,storename="foundCount"):
+ """nextLink"""
+ try:
+ limit=self.REQUEST.SESSION[storename]['rangeSize']
+ newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])+int(limit)
+ except:
+ limit=0
+ newRangeStart=0
+
+ if newRangeStart>self.REQUEST.SESSION[storename]['count']:
+ newRangeStart=self.REQUEST.SESSION[storename]['count']-10
+
+
+ #create new query string
+
+ if self.REQUEST['QUERY_STRING']=="":
+ qs=self.REQUEST.SESSION['query']
+
+ queries=string.split(qs,",")
+
+
+ else:
+ qs=self.REQUEST['QUERY_STRING']
+ queries=string.split(qs,"&")
+
+
+
+ newquery=[]
+
+ skipFound=0
+
+ for query in queries:
+ #print query.split("=")[0]
+ if query[0]=="_" : query[0]="-"
+
+ if query.split("=")[0].lower()=="-skip":
+ skipFound=1
+ query="-skip=%i"%newRangeStart
+ newquery.append(query)
+
+ if skipFound==0 :
+ query="-skip=%i"%newRangeStart
+ newquery.append(query)
+
+ newquerystring=string.join(newquery,"&")
+
+ return "%s"%(self.actualPath()+"?"+newquerystring,html)
+
+
+ def prevLink(self,html,storename="foundCount"):
+ """prev link"""
+ try:
+ limit=self.REQUEST.SESSION[storename]['rangeSize']
+ newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])-int(limit)
+ except:
+ limit=0
+ newRangeStart=0
+
+ #print "limit",limit,newRangeStart,int(self.REQUEST.SESSION[storename]['rangeStart'])
+
+ if newRangeStart<0:
+ newRangeStart=0
+
+ #create new query string
+
+ if self.REQUEST['QUERY_STRING']=="":
+ qs=self.REQUEST.SESSION['query']
+ #qs=re.sub(r'_','-',qs) #aendern für query
+ queries=string.split(qs,",")
+
+
+ else:
+ qs=self.REQUEST['QUERY_STRING']
+ queries=string.split(qs,"&")
+
+
+
+ newquery=[]
+
+ skipFound=0
+
+ for query in queries:
+ #print query.split("=")[0]
+
+ if query[0]=="_" : query[0]="-"
+
+ if query.split("=")[0].lower()=="-skip":
+ #print"HI"
+ query="-skip=%i"%newRangeStart
+ skipFound=1
+ newquery.append(query)
+
+ if skipFound==0 :
+ query="-skip=%i"%newRangeStart
+ newquery.append(query)
+
+ newquerystring=string.join(newquery,"&")
+
+ return "%s"%(self.actualPath()+"?"+newquerystring,html)
+
+
+
+ def prevLink_old(self,html):
"""prev link"""
if self.REQUEST['QUERY_STRING']=="":
qs=self.REQUEST.SESSION['query']
@@ -206,9 +561,9 @@ class ZSQLExtendFolder(Persistent, Impli
else:
queries.append("-offset=%i"%offsetnew)
newquerystring=string.join(queries,"&")
- return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html)
+ return "%s"%(self.actualPath()+"?"+newquerystring,html)
- def nextLink(self,html):
+ def nextLink_old(self,html):
"""prev link"""
if self.REQUEST['QUERY_STRING']=="":
qs=self.REQUEST.SESSION['query']
@@ -236,22 +591,9 @@ class ZSQLExtendFolder(Persistent, Impli
queries.append("-offset=%i"%offsetnew)
newquerystring=string.join(queries,"&")
- return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html)
+ return "%s"%(self.actualPath()+"?"+newquerystring,html)
- def ZSQLrangeStart(self):
- if self.REQUEST['QUERY_STRING']=="":
- qs=self.REQUEST.SESSION['query']
- else:
- qs=self.REQUEST['QUERY_STRING']
- offset=re.search(r'offset\=(.*)\,',qs.lower())
- if not offset:
- offset=1
- return offset
-# def search(self,**argv):
-# """to be done"""
-
-
-
+
manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
def manage_addZSQLExtendFolder(self, id, title='',