--- ZSQLExtend/ZSQLExtend.py 2012/02/15 08:08:42 1.143 +++ ZSQLExtend/ZSQLExtend.py 2012/09/03 13:06:11 1.144 @@ -99,8 +99,8 @@ def sql_quote(v): v=string.join(string.split(v,dkey),quote_dict[dkey]) return "'%s'" % v -def showSQLConnectionIDs(self): - return SQLConnectionIDs(self) +#def showSQLConnectionIDs(self): +# return SQLConnectionIDs(self) class Options: """options class""" @@ -126,6 +126,41 @@ class ZSQLExtendFolder(Folder,Persistent """ meta_type="ZSQLExtendFolder" + #primaryKeys={} + #primaryKey= + + def getSQLConnectionIDs(self): + logging.debug(SQLConnectionIDs(self)) + return SQLConnectionIDs(self) + + def getPrimaryKey(self,table=None): + """returns primary key for the database""" + if table is None: + return getattr(self,'primaryKey','oid') + + + + pks= getattr(self, "primaryKeys",{}) + + k = pks.get(table,None) + + if k is None: + logging.debug("getPrimaryKey: no primary key for table %s stored use standard key %s"%(table,getattr(self,'primaryKey','oid'))) + logging.debug(pks) + return getattr(self,'primaryKey','oid') + + return k + + + def getPrimaryKeysAsString(self): + """get all keys""" + + if not hasattr(self, 'primaryKeys'): + return "" + + return ";".join(["%s:%s"%val for val in self.primaryKeys.items()]) + + def ZSQLQuote(self,str): """quote str for sql""" return sql_quote(str) @@ -163,11 +198,11 @@ class ZSQLExtendFolder(Folder,Persistent qstr="""alter table %s add %s %s""" self.ZSQLSimpleSearch(qstr%(table,newFieldName,'text')) - qstr="select oid,%s from %s"%(fieldname,table) + qstr="select %s from %s"%(fieldname,table) for result in self.ZSQLSimpleSearch(qstr): - qstr="update %s set %s = %s where oid = %s" + qstr="update %s set %s = %s where "+self.getPrimaryKey()+" = %s" - self.ZSQLSimpleSearch(qstr%(table,newFieldName,self.ZSQLQuote(normal(getattr(result,fieldname))),result.oid)) + self.ZSQLSimpleSearch(qstr%(table,newFieldName,self.ZSQLQuote(normal(getattr(result,fieldname))),getattr(result,self.getPrimaryKey))) def importAccessModell(self,configFileName,RESPONSE=None): """import tables from access @@ -479,7 +514,7 @@ class ZSQLExtendFolder(Folder,Persistent index={} - founds=self.ZSQLSimpleSearch("""SELECT %s,oid FROM %s """%(field,table)) + founds=self.ZSQLSimpleSearch("""SELECT %s FROM %s """%(field,table)) for found in founds: tmp=getattr(found,field,None) @@ -487,9 +522,9 @@ class ZSQLExtendFolder(Folder,Persistent strings=tmp.split(" ") for string in strings: if index.get(string): - index[string].append(found.oid) + index[string].append(gettr(found,self.getPrimaryKey())) else: - index[string]=[found.oid] + index[string]=[gettr(found,self.getPrimaryKey())] RESPONSE.write(string+"\n") if not hasattr(self,index_name): @@ -589,14 +624,29 @@ class ZSQLExtendFolder(Folder,Persistent return pt() - def changeZSQLExtend(self,label,description,weight=0,connection_id=None,autocommit=None,REQUEST=None,): + def changeZSQLExtend(self,label,description,primaryKey,primaryKeys="",weight=0,connection_id=None,autocommit=None,REQUEST=None,): """change the Konfiguration""" self.connection_id=connection_id self.weight=weight self.label=label self.description=description self.autocommit = (autocommit == "on") + self.primaryKey=primaryKey + if primaryKeys.lstrip().rstrip()!="": + + for vals in primaryKeys.split(";"): + splitted=vals.split(":") + if len(splitted)<2: + if REQUEST is not None: + return """Wrong Syntax of keystring: %s
%s is not of the form TABLE:key."""%(primaryKeys,vals) + + self.primaryKeys[splitted[0]]=splitted[1] + + + + + if REQUEST is not None: return self.manage_main(self, REQUEST) @@ -1244,7 +1294,7 @@ class ZSQLExtendFolder(Folder,Persistent return True - def ZSQLFindIndexed(self,tableList=[],qs="",select="oid,*",storename=None,indexedFields=['data_line'],restrictField='id_text',**argv): + def ZSQLFindIndexed(self,tableList=[],qs="",select="*",storename=None,indexedFields=['data_line'],restrictField='id_text',**argv): """find2""" for index in self.ZopeFind(self,obj_ids=indexedFields): @@ -1257,7 +1307,7 @@ class ZSQLExtendFolder(Folder,Persistent search2 = self.ZSQLFind(tableExt=tableList[0],qs=qs,select=select,storename=storename,restrictConnect=(tableList[0]+"."+restrictField,search1),**argv) return search2 - def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv): + def ZSQLFind2(self,qs="",select="*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv): """find2""" search1= self.ZSQLFind(qs=qs,select=select,storename=storename,tableExt=tableList[1],restrictField=restrictField,NoQuery='yes',NoLimit='yes',**argv) @@ -1267,7 +1317,7 @@ class ZSQLExtendFolder(Folder,Persistent - def ZSQLFind(self,qs="",select="oid,*",storename="foundCount",tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv): + def ZSQLFind(self,qs="",select="*",storename="foundCount",tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv): """search in database""" def delEmpty(list): @@ -1430,7 +1480,7 @@ class ZSQLExtendFolder(Folder,Persistent debug=None if not select: - select="oid,*" + select="*" #check for op splitted=qs.split(",") @@ -1442,17 +1492,41 @@ class ZSQLExtendFolder(Folder,Persistent select=restrictField - #erster durchgang suche operatoren + params={} 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: + value="" - name=re.sub("r'+'"," ",q.split("=")[0].lower()) - if name=="_debug": - debug=True + params[name]=value + + + + #set table + primaryKey="" + if not tableExt: + table=params.get(iCT+'table') + primaryKey=self.getPrimaryKey(table) + logging.debug("table:"+table) + logging.debug("primkey:"+primaryKey); - try: - value=urllib.unquote(q.split("=",1)[1]) - except: - value="" + + #erster durchgang suche operatoren + for name,value in params.items(): + +# name=re.sub("r'+'"," ",q.split("=")[0].lower()) +# if name=="_debug": +# debug=True +# +# try: +# value=urllib.unquote(q.split("=",1)[1]) +# except: +# value="" #print "Hi",name[0:3],q if name[0:3]==iCT+"op": op=value @@ -1482,18 +1556,18 @@ class ZSQLExtendFolder(Folder,Persistent sortfields[field]=value #zweiter durchgang analysiere felder - for q in qs.split(","): + for name,value in params.items(): - - name=re.sub("r'+'"," ",q.split("=")[0].lower()) - - try: - value=urllib.unquote(q.split("=",1)[1]) - - except: - value="" - +# +# name=re.sub("r'+'"," ",q.split("=")[0].lower()) +# +# try: +# value=urllib.unquote(q.split("=",1)[1]) +# +# except: +# value="" +# punktsplit=name.split(".") #sonderfall feld mit punkten(tabelle.suchFeld.ausgewaehltesFeld,feldinoriginal), d.h. suche in anderer tabelle: #analysiere alle anderen faelle @@ -1614,7 +1688,18 @@ class ZSQLExtendFolder(Folder,Persistent else: op="ct" namealt=name - name="LOWER("+name+")" + ##DW hack 29-8-12 lower(oid) funktioniert nicht, generell muss oid handling noch korrigiert werden. + + + + + if not name==primaryKey: + name="LOWER("+name+")" #immer lower key nicht definiert fuer keys. + else: + op="eq" # bei keys immer eq benutzen + + logging.debug("NAME: %s"%name) + if op=="ct": tmp=(name+" LIKE "+sql_quote("%"+value+"%")) elif op=="gt": @@ -1625,8 +1710,7 @@ class ZSQLExtendFolder(Folder,Persistent tmp=(name+"="+sql_quote(value)) elif op=="bw": tmp=(name+" LIKE "+sql_quote(value+"%")) - elif op=="ew": - tmp=(name+" LIKE "+sql_quote("%"+value)) + #tmp=(name+" LIKE "+sql_quote("%"+value)) elif op=="all": tmps=[] for word in value.split(" "): @@ -1648,7 +1732,7 @@ class ZSQLExtendFolder(Folder,Persistent op="all" - if (value!='') and ((not tableExt) or (namealt.split('.')[0]==tableExt)): #keine leeren werde und keine auschluss + if (value!='') and ((not tableExt) or (namealt.split('.')[0]==tableExt)): #keine leeren werte und keine auschluss if searchFields.has_key(namealt): searchFields[namealt]+=lopfields.get(name,'OR')+" "+tmp searchFieldsOnly[namealt]+=lopfields.get(name,'OR')+" "+value @@ -2002,12 +2086,30 @@ class ZSQLBibliography(Folder,ZSQLExtend pt.content_type="text/html" return pt() - def changeZSQLBibliography(self,tableName,label,description,connection_id=None,REQUEST=None): + def changeZSQLBibliography(self,tableName,label,description,primaryKey="",primaryKeys="",connection_id=None,REQUEST=None): """change it""" self.connection_id=connection_id self.tableName=tableName self.label=label self.description=description + self.primaryKey=primaryKey + + self.primaryKeys={} + if primaryKeys.lstrip().rstrip()!="": + + for vals in primaryKeys.split(";"): + splitted=vals.split(":") + if len(splitted)<2: + if REQUEST is not None: + return """Wrong Syntax of keystring: %s
%s is not of the form TABLE:key."""%(primaryKeys,vals) + + logging.debug(splitted) + self.primaryKeys[splitted[0]]=splitted[1] + + + + + if REQUEST is not None: return self.manage_main(self, REQUEST) @@ -2041,44 +2143,74 @@ class ZSQLBibliography(Folder,ZSQLExtend except: return None + + def getMetaDataManager(self): + return self.metadata + def findTagsFromMapping(self,referenceType): """gib hash mit label -> generic zurueck""" - self.referencetypes=self.ZopeFind(self.standardMD) + self.referencetypes=self.ZopeFind(self.getMetaDataManager(),search_sub=1) bibdata={} retdata={} - fieldlist=self.standardMD.fieldList + #fieldlist=self.standardMD.fieldList for referenceTypeF in self.referencetypes: #print referenceType,referenceTypeF[1].title - if referenceTypeF[1].title == referenceType: + if referenceTypeF[1].title.lower() == referenceType.lower(): bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields bibdata['data']=referenceTypeF[1] - self.fields=bibdata[referenceType] - for field in fieldlist: + self.fields=bibdata[referenceTypeF[1].title] + + + + for field in referenceTypeF[1].getFieldList(): if referenceTypeF[1].getValue(field)[0]==None: retdata[field]=field else: retdata[field]=referenceTypeF[1].getValue(field)[0] - return retdata,fieldlist + return retdata,referenceTypeF[1].getFieldList() def findLabelsFromMapping(self,referenceType): - """gib hash mit label -> generic zurueck""" - self.referencetypes=self.ZopeFind(self.standardMD) - bibdata={} - retdata={} - fieldlist=self.standardMD.fieldList + """gib hash mit tagname -> lalbe zurueck""" - for referenceTypeF in self.referencetypes: - #print referenceType,referenceTypeF[1].title - if referenceTypeF[1].title == referenceType: - bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields - bibdata['data']=referenceTypeF[1] - self.fields=bibdata[referenceType] - for field in fieldlist: - retdata[field]=referenceTypeF[1].getValue(field)[1] + + + mapping= self.getMetaDataManager().getBibMapping(referenceType) + + + + fields=mapping.getFields() + + + + + fieldlist=fields.keys() + + retdata={} + for field in fieldlist: + retdata[field]=fields[field]['label'] + +# self.referencetypes=self.ZopeFind(self.getMetaDataManager(),search_sub=1) +# +# bibdata={} +# retdata={} +# #fieldlist=self.standardMD.fieldList +# logging.debug("XX") +# for referenceTypeF in self.referencetypes: +# #print referenceType,referenceTypeF[1].title +# logging.debug("%s=%s"%(referenceTypeF[1].title,referenceType)) +# if referenceTypeF[1].title.lower() == referenceType.lower(): +# +# bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields +# bibdata['data']=referenceTypeF[1] +# self.fields=bibdata[referenceTypeF[1].title] +# for field in referenceTypeF[1].getFieldList(): +# retdata[field]=referenceTypeF[1].getValue(field)[1] + return retdata,fieldlist + def createRDFTag(self,tag,content,namespace="cdli"): """create RDF""" @@ -2174,14 +2306,14 @@ class ZSQLBibliography(Folder,ZSQLExtend ret=""" """ - for found in self.ZSQLSimpleSearch("select oid from %s limit ALL"%self.tableName): + for found in self.ZSQLSimpleSearch("select % from %s limit ALL"%(self.getPrimaryKey,self.tableName)): 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 + link=base_url+"/"+"record.html?oid=%i"%getattr(found,self.getPrimaryKey()) + metalink=base_url+"/"+"getMetaDataXML?oid=%i"%getattr(found,self.getPrimaryKey()) ret+="""\n"""%(link,metalink)