--- 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)