--- ZSQLExtend/ZSQLExtend.py 2004/11/27 22:41:43 1.50 +++ ZSQLExtend/ZSQLExtend.py 2005/02/10 16:18:15 1.60 @@ -1,17 +1,20 @@ from OFS.Folder import Folder -from Globals import Persistent from Acquisition import Implicit -from Globals import DTMLFile,package_home +from Globals import DTMLFile,package_home,Persistent import urllib import re import string +import sys #from pyPgSQL import libpq from AccessControl import getSecurityManager -import os.path +from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.ZSQLMethods.SQL import SQLConnectionIDs import Shared.DC.ZRDB.DA +import zLOG +import os.path +import os def analyseIntSearch(word): #analyse integer searches @@ -53,7 +56,10 @@ class ZSQLExtendFolder(Folder,Persistent wherePart="museum_no like 'VAT%'" classes=['Uruk III','Uruk IV'] return self.searchRel(relStatement,statement,wherePart,classes) - + + def URLquote(self,txt): + """urlquote""" + return urllib.quote(txt) def searchRel(self,relStatement,statement,wherePart,classes): """suche relative haufigkeiten""" ret={} @@ -304,8 +310,33 @@ class ZSQLExtendFolder(Folder,Persistent #print "INLINE:",query return self.ZSQLSimpleSearch(query) + def ZSQLSimpleSearch(self,query=None,max_rows=1000000): + """simple search""" - def ZSQLSimpleSearch(self,query=None): + if not query: + query=self.query + + 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.connection_id,"var","") + self._v_searchSQL.max_rows_=max_rows + try: + return self._v_searchSQL.__call__(var=query) + except : + if sys.exc_info()[0]=="Database Error": + try: + getattr(self,self.connection_id).manage_open_connection() + except: pass + else: + try: + self._v_searchSQL.max_rows_=max_rows + return self._v_searchSQL.__call__(var=query) + except : + if sys.exc_info()[0]=="Database Error": + try: + getattr(self,self.connection_id).manage_open_connection() + except: pass + + def ZSQLSimpleSearch2(self,query=None): """ returrn SQLSearch""" #print "hi",query if not query: @@ -396,19 +427,15 @@ class ZSQLExtendFolder(Folder,Persistent - def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],**argv): + def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv): """find2""" - #search1= self.ZSQLFind(qs="",select="oid,*",storename=None,tableExt='cdli_translit',restrictField='id_text',NoQuery='yes',NoLimit='yes',**argv) - - - #search2 = self.ZSQLFind(tableExt='cdli_cat',qs="",select="oid,*",storename=None,restrictConnect=('cdli_cat.id_text',search1),**argv) - search1= self.ZSQLFind(qs="",select="oid,*",storename=None,tableExt='cdli_cat',restrictField='id_text',NoQuery='yes',NoLimit='yes',**argv) - - search2 = self.ZSQLFind(tableExt='cdli_translit',qs="",select="oid,*",storename=None,restrictConnect=('cdli_translit.id_text',search1),**argv) + search1= self.ZSQLFind(qs=qs,select=select,storename=storename,tableExt=tableList[1],restrictField=restrictField,NoQuery='yes',NoLimit='yes',**argv) + + search2 = self.ZSQLFind(tableExt=tableList[0],qs=qs,select=select,storename=storename,restrictConnect=(tableList[0]+"."+restrictField,search1),**argv) return search2 - #return self.ZSQLFind(qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,**argv) + def ZSQLFind(self,qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv): """Find""" @@ -441,7 +468,7 @@ class ZSQLExtendFolder(Folder,Persistent qs+=",%s=%s"%(fieldTmp,argv[field]) else: - + qs=self.REQUEST.SESSION.get('query','') for field in argv.keys(): @@ -452,6 +479,8 @@ class ZSQLExtendFolder(Folder,Persistent qs+=",%s=%s"%(fieldTmp,argv[field]) + + else: self.REQUEST['QUERY_STRING']=qs @@ -476,7 +505,7 @@ class ZSQLExtendFolder(Folder,Persistent #print self.REQUEST.SESSION["foundCount"] - + return ret def ZSQLFoundCountLen(self,var): @@ -585,8 +614,8 @@ class ZSQLExtendFolder(Folder,Persistent 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""" - - + + lop="AND" # standardsuche mit and max="ALL" #standard alle auswaehlen maxstr="" @@ -651,8 +680,9 @@ class ZSQLExtendFolder(Folder,Persistent #print "HI",op,field #print opfieldsa #now analyse the querystring + for q in qs.split(","): - + #try: @@ -661,10 +691,10 @@ class ZSQLExtendFolder(Folder,Persistent value=urllib.unquote(q.split("=",1)[1]) except: value="" - - #value=sql_quote(value) + #value=sql_quote(value) + if name==iCT+"lop": lop=value elif name==iCT+"table": @@ -707,7 +737,7 @@ class ZSQLExtendFolder(Folder,Persistent elif (not name[0]==iCT) and (not len(value)==0): - + #print "OP",op,name value=value.lower() tmp="" @@ -751,15 +781,16 @@ class ZSQLExtendFolder(Folder,Persistent op="all" if (not tableExt) or (namealt.split('.')[0]==tableExt): - if searchFields.has_key(name): - searchFields[name]+=lopfields.get(name,'OR')+" "+tmp - searchFieldsOnly[name]+=lopfields.get(name,'OR')+" "+value + if searchFields.has_key(namealt): + searchFields[namealt]+=lopfields.get(name,'OR')+" "+tmp + searchFieldsOnly[namealt]+=lopfields.get(name,'OR')+" "+value else: - searchFields[name]=tmp - searchFieldsOnly[name]=value + searchFields[namealt]=tmp + searchFieldsOnly[namealt]=value - whereList=["("+searchFields[x]+")" for x in searchFields.keys()] + whereList=["("+searchFields[x]+")" for x in searchFields.keys()] + if len(whereList)>0: if filter: whereStr="("+string.join(whereList," "+lop+" ")+") AND "+filter @@ -773,7 +804,7 @@ class ZSQLExtendFolder(Folder,Persistent where="" if restrictConnect: - + if len(where)==0: where="WHERE "+restrictConnect[0]+" in ("+restrictConnect[1]+")" else: @@ -809,7 +840,10 @@ class ZSQLExtendFolder(Folder,Persistent else: self.REQUEST.SESSION[storename]['queryString2']=query2 - self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count + if self.ZSQLSimpleSearch(query2): + self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count + else: + self.REQUEST.SESSION[storename]['count']=0 #print "QUERYNEW",self.REQUEST.SESSION[storename]['queryString2'] @@ -828,24 +862,39 @@ class ZSQLExtendFolder(Folder,Persistent else: return query - + + def ZSQLUniqueQuery(self,value,returns): + """unique relation""" + if returns: + statement="""select %s from %s where %s = '%s' """%(returns[1],returns[0],returns[2],value) + founds=self.ZSQLSimpleSearch(statement) + if founds: + return getattr(founds[0],returns[1]) + else: + return value + else: + return value + def ZSQLQuery(self,query): """query""" - #print "hi",query + return self.ZSQLSimpleSearch(query) + def ZSQLSearch(self): """To be done""" rq=self.REQUEST['QUERY_STRING'] + querys=rq.split("&") + formatfile=self.REQUEST['URL1'] #generisch redirect zur gleichen url for querytemp in querys: query=querytemp.split("=") - print "fmtfile",formatfile + try: if query[0].lower()=="-format": @@ -856,6 +905,7 @@ class ZSQLExtendFolder(Folder,Persistent #print formatfile + self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",") self.REQUEST.SESSION['come_from_search']="yes" @@ -1128,8 +1178,9 @@ class ZSQLBibliography(Folder,ZSQLExtend pt.content_type="text/html" return pt() - def changeZSQLBibliography(self,tableName,label,description,REQUEST=None): + def changeZSQLBibliography(self,tableName,label,description,connection_id=None,REQUEST=None): """change it""" + self.connection_id=connection_id self.tableName=tableName self.label=label self.description=description @@ -1139,6 +1190,8 @@ class ZSQLBibliography(Folder,ZSQLExtend manage_options=Folder.manage_options+( {'label':'Main Config','action':'changeZSQLBibliographyForm'}, + {'label':'Generate RDF Template','action':'generateRDFTemplate'}, + {'label':'Generate XML Template','action':'generateXMLTemplate'}, ) @@ -1203,8 +1256,17 @@ class ZSQLBibliography(Folder,ZSQLExtend return retdata,fieldlist + def createRDFTag(self,tag,content,namespace="ns"): + """create RDF""" + if content: + tag=namespace+":"+tag + ret=""" <%s>%s"""%(tag,content,tag) + return ret.decode('latin-1') + else: + return "" + def createIndexTag(self,tag,content): - """creste tag""" + """create tag""" if content: ret="""<%s>%s"""%(tag,content,tag) return ret @@ -1221,11 +1283,52 @@ class ZSQLBibliography(Folder,ZSQLExtend pt.content_type="text/xml" return pt() + + def generateRDFTemplate(self,REQUEST=None): + """generateRDFtemplate""" + zt=ZopePageTemplate('record.rdf') + self._setObject('record.rdf',zt) + default_content_fn = os.path.join(package_home(globals()), + 'zpt','record.rdf') + text = open(default_content_fn).read() + zt.pt_edit(text, 'text/xml') + + + if REQUEST is not None: + return self.manage_main(self, REQUEST) + + def generateXMLTemplate(self,REQUEST=None): + """generateXMLtemplate""" + zt=ZopePageTemplate('record.xml') + self._setObject('record.xml',zt) + default_content_fn = os.path.join(package_home(globals()), + 'zpt','record.xml') + text = open(default_content_fn).read() + zt.pt_edit(text, 'text/xml') + + + if REQUEST is not None: + return self.manage_main(self, REQUEST) + def getMetaDataRDF(self): + """crate index meta""" + find=self.ZopeFind(self,obj_ids=["record.rdf"]) + if not find: + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','record.rdf')).__of__(self) + pt.content_type="text/xml" + return pt() + else: + return find[0][1]() + def getMetaDataXML(self): """crate index meta""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','record.xml')).__of__(self) - pt.content_type="text/xml" - return pt() + find=self.ZopeFind(self,obj_ids=["record.xml"]) + if not find: + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','record.xml')).__of__(self) + pt.content_type="text/xml" + return pt() + else: + return find[0][1]() + def getMetaDatasXML(self): """index""" @@ -1258,6 +1361,7 @@ manage_addZSQLBibliographyForm=DTMLFile( def manage_addZSQLBibliography(self, id, tableName,label,description,title='', createPublic=0, createUserF=0, + connection_id=None, REQUEST=None): """Add a new Folder object with id *id*. @@ -1275,6 +1379,7 @@ def manage_addZSQLBibliography(self, id, setattr(ob,'tableName',tableName) setattr(ob,'label',label) setattr(ob,'description',description) + setattr(ob,'connection_id',connection_id) checkPermission=getSecurityManager().checkPermission