--- ZSQLExtend/ZSQLExtend.py 2007/02/09 17:39:44 1.102
+++ ZSQLExtend/ZSQLExtend.py 2007/03/08 17:00:48 1.106
@@ -424,15 +424,15 @@ class ZSQLExtendFolder(Folder,Persistent
if data:
data=bz2.decompress(base64.decodestring(data))
- zLOG.LOG("fmpxml",zLOG.INFO,"received file")
+ logger("fmpxml",logging.INFO,"received file")
doc=parseString(data)
- zLOG.LOG("fmpxml",zLOG.INFO,"parsed file")
+ logger("fmpxml",logging.INFO,"parsed file")
elif filename:
fh=file(filename)
- zLOG.LOG("fmpxml",zLOG.INFO,"reading file")
+ logger("fmpxml",logging.INFO,"reading file")
doc=parse(fh)
- zLOG.LOG("fmpxml",zLOG.INFO,"parsed file")
+ logger("fmpxml",logging.INFO,"parsed file")
dbIDs = {}
rowcnt = 0
@@ -445,7 +445,7 @@ class ZSQLExtendFolder(Folder,Persistent
dbIDs[id[0]] = 0;
rowcnt += 1
- zLOG.LOG("fmpxml",zLOG.INFO,"%d entries in DB to sync"%rowcnt)
+ logger("fmpxml",logging.INFO,"%d entries in DB to sync"%rowcnt)
fieldNames = []
rowcnt = 0
@@ -471,18 +471,18 @@ class ZSQLExtendFolder(Folder,Persistent
# update all fields
update_fields = fieldNames
- zLOG.LOG("fmpxml fieldnames:",zLOG.INFO,repr(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:
- zLOG.LOG("fmpxml fieldname:",zLOG.INFO,repr(fieldName))
+ 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'))
- zLOG.LOG("fmpxml add field:",zLOG.INFO,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':
@@ -515,7 +515,7 @@ class ZSQLExtendFolder(Folder,Persistent
setStr=string.join(setvals, ',')
id_val=dataSet[id_field]
qstr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,id_field,id_val)
- #zLOG.LOG("fmpxml update:",zLOG.INFO,queryStr)
+ #logger("fmpxml update:",logging.INFO,queryStr)
self.ZSQLSimpleSearch(qstr)
ret+="up: %s \n"%id_val
else:
@@ -524,12 +524,12 @@ class ZSQLExtendFolder(Folder,Persistent
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)
- #zLOG.LOG("fmpxml: insert",zLOG.INFO,queryStr)
+ #logger("fmpxml: insert",logging.INFO,queryStr)
ret+="ad: %s \n"%dataSet.get(id_field, rowcnt)
- #zLOG.LOG("fmpxml row:",zLOG.INFO,"%d (%s)"%(rowcnt,id_val))
+ #logger("fmpxml row:",logging.INFO,"%d (%s)"%(rowcnt,id_val))
if (rowcnt % 10) == 0:
- zLOG.LOG("fmpxml row:",zLOG.INFO,"%d (%s)"%(rowcnt,id_val))
+ logger("fmpxml row:",logging.INFO,"%d (%s)"%(rowcnt,id_val))
transaction.commit()
transaction.commit()
@@ -538,12 +538,12 @@ class ZSQLExtendFolder(Folder,Persistent
for id in dbIDs.keys():
# find all not-updated fields
if dbIDs[id] == 0:
- zLOG.LOG("fmpxml delete:",zLOG.INFO,id)
+ logger("fmpxml delete:",logging.INFO,id)
qstr = "DELETE FROM %s WHERE %s = '%s'"
self.ZSQLSimpleSearch(qstr%(table,id_field,id))
elif dbIDs[id] > 1:
- zLOG.LOG("fmpxml sync:",zLOG.INFO,"id used more than once?"+id)
+ logger("fmpxml sync:",logging.INFO,"id used more than once?"+id)
transaction.commit()
@@ -717,7 +717,7 @@ class ZSQLExtendFolder(Folder,Persistent
#print "field",field
if not field:
return 1
- if field=="":
+ if field.strip()=="":
return 1
return 0
@@ -784,7 +784,12 @@ class ZSQLExtendFolder(Folder,Persistent
ret+=""""""
return ret
- def ZSQLOptionsFromSearchList(self,fieldname,results,fieldName,valueName=None,start=None, multiple='',startValue=None,additionalSelect="",size=None,linelen=None,selected=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
es wird
"""
return ret
@@ -889,7 +896,7 @@ class ZSQLExtendFolder(Folder,Persistent
def ZSQLInlineSearch(self,storename=None,args=None,**argv):
"""inlinesearch"""
-
+
qs=[]
if storename:
"""store"""
@@ -906,8 +913,17 @@ class ZSQLExtendFolder(Folder,Persistent
#print "INLINE:",argv
for a in argTmp.keys():
- aFiltered=re.sub(r"^-","_",a) # beginning of a command should always be "_"
- qs.append(aFiltered+"="+urllib.quote(str(argTmp[a])))
+ aFiltered=re.sub(r"^-","_",a) # beginning of a command should always be "_"
+
+ if type(argTmp[a]) is ListType: # ein parameter zweimal
+ value=""
+ #TODO find a better solution, currently only the last non empty entry is used.
+ for x in argTmp[a]:
+ if x:
+ value=x
+ else:
+ value=str(argTmp[a])
+ qs.append(aFiltered+"="+urllib.quote(value))
#return []
@@ -1143,7 +1159,7 @@ class ZSQLExtendFolder(Folder,Persistent
- def ZSQLFind(self,qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv):
+ def ZSQLFind(self,qs="",select="oid,*",storename="foundCount",tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv):
"""search in database"""
def delEmpty(list):
@@ -1195,136 +1211,94 @@ class ZSQLExtendFolder(Folder,Persistent
qs=string.join(delEmpty(qs.split(",")),",")
- if storename:
- """store"""
- else:
- storename="foundCount"
#store query for further usage
+ #TODO: erste der beiden ist ueberfluessig
self.REQUEST.SESSION['query']=qs
-
+ if not self.REQUEST.SESSION.has_key(storename):
+ self.REQUEST.SESSION[storename]={}
+
+ self.REQUEST.SESSION[storename]['qs']=qs
+
+
#print "calling Query with",repr(NoQuery)
ret=self.parseQueryString(qs,"-",select=select,storemax="yes",storename=storename,tableExt=tableExt,NoQuery=NoQuery,NoLimit=NoLimit,restrictField=restrictField,restrictConnect=restrictConnect,filter=filter)
#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"
-
+ def ZSQLFoundCount(self,qs="",select="*",storename="foundCount"):
+
return self.REQUEST.SESSION[storename]['count']
- def ZSQLRangeStart(self,storename=None):
-
- if storename:
- """store"""
- else:
- storename="foundCount"
-
+ def ZSQLRangeStart(self,storename="foundCount"):
+
return int(self.REQUEST.SESSION[storename]['rangeStart'])+1
- def ZSQLRangeSize(self,storename=None):
+ def ZSQLRangeSize(self,storename="foundCount"):
- if storename:
- """store"""
- else:
- storename="foundCount"
-
return self.REQUEST.SESSION[storename]['rangeSize']
- def ZSQLRangeEnd(self,storename=None):
-
- if storename:
- """store"""
- else:
- storename="foundCount"
-
+ def ZSQLRangeEnd(self,storename="foundCount"):
+
return str(min(int(self.REQUEST.SESSION[storename]['rangeEnd']),int(self.REQUEST.SESSION[storename]['count'])))
- def ZSQLNewQuery(self,linkText,storename=None,**argv):
+ def ZSQLNewQuery(self,linkText,storename="foundCount",**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):
+ def ZSQLNewSearch(self,linkText,storename="foundCount",url=None,args=None,**argv):
"""suche mit alten parametern bis auf die in argv getauschten"""
str = self.ZSQLNewSearchURL(storename, url, args, **argv)
return """ %s"""%(str,linkText)
- def ZSQLNewSearchURL(self, storename=None,url=None,args=None,**argv):
+ def ZSQLNewSearchURL(self, storename="foundCount",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
-
+
+ #get the old queries
+ qs=self.REQUEST.SESSION[storename]['qs']
querys=qs.split(",")
+
+ #which arguments are in the old query string
+
+ queryList={}
+ for query in querys:
+ arg=query.split("=")[0]
+ if arg[0]=="_": arg="-"+arg[1:] # sicherstellen, dass an Anfang stets "_"
+ queryList[arg]=query.split("=")[1]
+
+
argList=[]
arg=""
- queryList=[x.split("=")[0] for x in querys]
+
+
+ #gehe durch die zu aendernden Argumente
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)
-
+ arg=argTmp[0:]# sicherstellen, dass der string auh kopiert wird
+ if arg[0]=="_": arg="-"+arg[1:] # sicherstellen, dass an Anfang stets "_"
-
- 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)
+ queryList[arg]=argv[argTmp]
if url:
- str=url+"?"+"&".join(newquery)
+ str=url+"?"+urllib.urlencode(queryList)
else:
- str="ZSQLSearch?"+"&".join(newquery)
+ str="ZSQLSearch?"+urllib.urlencode(queryList)
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="foundCount",tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None):
"""analysieren den QueryString"""
-
-
+
+
#setzte generische werte
lop="AND" # standardsuche mit and
@@ -1344,6 +1318,8 @@ class ZSQLExtendFolder(Folder,Persistent
searchFields={}
searchFieldsOnly={}
queryTemplate=[]
+ outerjoin=""
+ debug=None
if not select:
select="oid,*"
@@ -1360,8 +1336,11 @@ class ZSQLExtendFolder(Folder,Persistent
#erster durchgang suche operatoren
for q in splitted:
-
+
name=re.sub("r'+'"," ",q.split("=")[0].lower())
+ if name=="_debug":
+ debug=True
+
try:
value=urllib.unquote(q.split("=",1)[1])
except:
@@ -1400,8 +1379,10 @@ class ZSQLExtendFolder(Folder,Persistent
name=re.sub("r'+'"," ",q.split("=")[0].lower())
+
try:
value=urllib.unquote(q.split("=",1)[1])
+
except:
value=""
@@ -1429,9 +1410,14 @@ class ZSQLExtendFolder(Folder,Persistent
skip="OFFSET "+str(value)
rangeStart=str(value)
elif name==iCT+"join":
+
whereList.append(value)
+ elif name==iCT+"outerjoin":
+
+ outerjoin=value
elif name==iCT+"sort":
sortstrs=[]
+
for word in value.split(','):
wordstr=word.lstrip().rstrip()
if sortAllFields:
@@ -1511,6 +1497,7 @@ class ZSQLExtendFolder(Folder,Persistent
#print "OP",op,name
value=value.lower()
+
tmp=""
if opfields.has_key(name):
op=opfields[name]
@@ -1584,14 +1571,14 @@ class ZSQLExtendFolder(Folder,Persistent
#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 %s"%(select,table,outerjoin,where,sort,maxstr,skip)
if not nostore=="yes":
self.REQUEST.SESSION['qs']=opfields
#print "IAMHERE again:", query
- if storename and (not NoQuery):
+ if not NoQuery:
query2="SELECT count(*) FROM %s %s"%(table,where)
@@ -1600,9 +1587,9 @@ class ZSQLExtendFolder(Folder,Persistent
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:
#print "HOOOOO",storename
self.REQUEST.SESSION[storename]['queryString2']=query2
@@ -1613,9 +1600,10 @@ class ZSQLExtendFolder(Folder,Persistent
#print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2']
else:
-
+
self.REQUEST.SESSION[storename]['queryString2']=query2
if self.ZSQLSimpleSearch(query2):
+
self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
else:
self.REQUEST.SESSION[storename]['count']=0
@@ -1623,7 +1611,11 @@ class ZSQLExtendFolder(Folder,Persistent
self.REQUEST.SESSION[storename]['rangeStart']=rangeStart
- if limit=="all":
+
+
+ self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
+
+ if (limit=="all") or (limit==int(limit)):
self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
else:
self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)
@@ -1632,6 +1624,8 @@ class ZSQLExtendFolder(Folder,Persistent
self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly
+ if debug:
+ logging.error("ZSQLSimpleSearch %s"%query)
if not NoQuery:
return self.ZSQLQuery(query)
@@ -1655,7 +1649,7 @@ class ZSQLExtendFolder(Folder,Persistent
"""query"""
if debug:
logger("ZSQLQuery", logging.INFO, query)
-
+
return self.ZSQLSimpleSearch(query)
@@ -1716,7 +1710,7 @@ class ZSQLExtendFolder(Folder,Persistent
limit=1
newRangeStart=0
- if newRangeStart>=self.REQUEST.SESSION[storename]['count']:
+ if (newRangeStart>=self.REQUEST.SESSION[storename]['count']) or (self.REQUEST.SESSION[storename]['count']==self.REQUEST.SESSION[storename]['rangeEnd']):
#newRangeStart=self.REQUEST.SESSION[storename]['count']-1
return ""
@@ -1815,64 +1809,7 @@ class ZSQLExtendFolder(Folder,Persistent
- def prevLink_old(self,html):
- """prev link"""
- if self.REQUEST['QUERY_STRING']=="":
- qs=self.REQUEST.SESSION['query']
- else:
- qs=self.REQUEST['QUERY_STRING']
- max=re.search(r'max\=(.*)\,',qs.lower())
- offset=re.search(r'offset\=(.*)\,',qs.lower())
- if not offset:
- offsetnew=0
- else:
- offsetnew=int(offset)-max
- if offsetnew<0:
- offsetnew=0
- queries=string.split(qs,",")
- newquery=[]
- if offset:
- for query in queries:
- if query.split("=")[0].lower()=="offset":
- query="-offset=%i"%offsetnew
- newquery.append(query)
- newquerystring=string.join(newquery,"&")
- else:
- queries.append("-offset=%i"%offsetnew)
- newquerystring=string.join(queries,"&")
- return "%s"%(self.actualPath()+"?"+newquerystring,html)
-
- def nextLink_old(self,html):
- """prev link"""
- if self.REQUEST['QUERY_STRING']=="":
- qs=self.REQUEST.SESSION['query']
- else:
- qs=self.REQUEST['QUERY_STRING']
- max=re.search(r'max\=(.*)\,',qs.lower())
-
- offset=re.search(r'offset\=(.*)\,',qs.lower())
- if not offset:
- offsetnew=1
- else:
- offsetnew=int(offset)+int(max)
- if offsetnew<0:
- offsetnew=0
- queries=string.split(qs,",")
- newquery=[]
- if offset:
- for query in queries:
-
- if query.split("=")[0].lower()=="-offset":
- query="-offset=%i"%offsetnew
- newquery.append(query)
- newquerystring=string.join(newquery,"&")
- else:
- queries.append("-offset=%i"%offsetnew)
- newquerystring=string.join(queries,"&")
-
- return "%s"%(self.actualPath()+"?"+newquerystring,html)
-
-
+
manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
def manage_addZSQLExtendFolder(self, id, title='', label='', description='',