version 1.64, 2005/10/10 15:34:50
|
version 1.81, 2006/04/20 17:40:11
|
Line 17 import Shared.DC.ZRDB.DA
|
Line 17 import Shared.DC.ZRDB.DA
|
import zLOG |
import zLOG |
import os.path |
import os.path |
import os |
import os |
|
from OFS.SimpleItem import SimpleItem |
|
|
|
def getTextFromNode(nodename): |
|
nodelist=nodename.childNodes |
|
rc = "" |
|
for node in nodelist: |
|
if node.nodeType == node.TEXT_NODE: |
|
rc = rc + node.data |
|
return rc |
|
|
|
|
def analyseIntSearch(word): |
def analyseIntSearch(word): |
Line 42 def sql_quote(v):
|
Line 51 def sql_quote(v):
|
quote_dict = {"\'": "''", "\\": "\\\\"} |
quote_dict = {"\'": "''", "\\": "\\\\"} |
for dkey in quote_dict.keys(): |
for dkey in quote_dict.keys(): |
if string.find(v, dkey) >= 0: |
if string.find(v, dkey) >= 0: |
v=join(split(v,dkey),quote_dict[dkey]) |
v=string.join(string.split(v,dkey),quote_dict[dkey]) |
return "'%s'" % v |
return "'%s'" % v |
|
|
def showSQLConnectionIDs(self): |
def showSQLConnectionIDs(self): |
return SQLConnectionIDs(self) |
return SQLConnectionIDs(self) |
|
|
|
class ZSQLIndex(SimpleItem): |
|
"""index""" |
|
meta_type="ZSQLIndex" |
|
|
|
def __init__(self,index,id,table=''): |
|
self.index=[x for x in index] |
|
self.id=id |
|
self.table=table |
|
|
|
def setIndex(self,index): |
|
self.index=[x for x in index] |
|
|
|
def getIndex(self): |
|
return self.index |
|
|
class ZSQLExtendFolder(Folder,Persistent, Implicit): |
class ZSQLExtendFolder(Folder,Persistent, Implicit): |
"""Folder""" |
"""Folder""" |
meta_type="ZSQLExtendFolder" |
meta_type="ZSQLExtendFolder" |
|
|
|
def ZSQLQuote(self,str): |
|
"""quote str for sql""" |
|
return sql_quote(str) |
|
|
|
def importAccessModell(self,configFileName,RESPONSE=None): |
|
"""import tables from access |
|
@param configFileName: xml-configfile |
|
""" |
|
from Ft.Xml import Parse |
|
fh=file(configFileName) |
|
|
|
doc=Parse(fh) |
|
|
|
x=doc.xpath("//pathToFolder/@path") |
|
|
|
|
|
if not (len(x)==1): # tag ist nich eineindeutig |
|
return False |
|
|
|
pathToFolder=x[0].value |
|
|
|
for db in doc.xpath("//db"): |
|
|
|
containers=db.xpath("./@container") |
|
identifiers=db.xpath("./@identify") |
|
|
|
print containers |
|
if not (len(containers)==1): |
|
return False |
|
else: |
|
container=containers[0].value |
|
|
|
if not (len(identifiers)==1): |
|
identifier=None |
|
else: |
|
identifier=identifiers[0].value |
|
|
|
self.xsdToTable(container.lower(),container,modus="drop",filename=os.path.join(pathToFolder,container.lower()+".xsd")) |
|
self.importXMLFileAccess(container.lower(),container,filename=os.path.join(pathToFolder,container.lower()+".xml"),identify=identifier) |
|
|
|
return "<html><body>DONE</body></html>" |
|
|
|
def xsdToTable(self,table,elementNameForTable,modus="update", filename=None,data=None,RESPONSE=None): |
|
"""reads an xsd file an creates the columns of a table out of its structure |
|
@param table: name of the table the xml shall be imported into |
|
@param elementNameForTable: must be a element of type complex type. the element of the sequence in the complex type |
|
define the columns of the table >table< |
|
@param data (optional): data to be imported |
|
@param filename (optional) or filename |
|
@param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes. |
|
@param RESPONSE: (optional) |
|
|
|
""" |
|
#from xml.dom.minidom import parseString,parse |
|
|
|
from Ft.Xml import Parse |
|
zLOG.LOG("import xsd",zLOG.INFO,"called") |
|
#fh=file("/tmp/fmpxml.xml") |
|
import bz2 |
|
import base64 |
|
|
|
|
|
ret="" |
|
if data: |
|
data=bz2.decompress(base64.decodestring(data)) |
|
|
|
#zLOG.LOG("import xsd",zLOG.INFO,"received file") |
|
doc=Parse(data) |
|
#zLOG.LOG("import xsd",zLOG.INFO,"parsed file") |
|
|
|
elif filename: |
|
fh=file(filename) |
|
txt=fh.read() |
|
|
|
doc=Parse(txt) |
|
#zLOG.LOG("import xsd",zLOG.INFO,"parsed file") |
|
|
|
|
|
Nss={'xsd':'http://www.w3.org/2001/XMLSchema'} |
|
definingSequence=doc.xpath("""//xsd:element[@name='%s']/xsd:complexType/xsd:sequence/xsd:element/@name"""%elementNameForTable,explicitNss=Nss) |
|
|
|
fieldNames=[x.value for x in definingSequence] |
|
|
|
|
|
|
|
#check if table exists |
|
|
|
qstr="""select relname from pg_class where relname = '%s'"""%table |
|
if len (self.ZSQLSimpleSearch(qstr))<1: # if not the create the table |
|
columns=[] |
|
create=True |
|
else: |
|
create=False |
|
|
|
zLOG.LOG("update xsd: fieldnames",zLOG.INFO,repr(fieldNames)) |
|
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)] |
|
|
|
|
|
if (modus=="drop") and (not create): #table shall be deleted, therefore it should exist (not create) |
|
print "drop" |
|
qstr="""DROP TABLE %s """ |
|
self.ZSQLSimpleSearch(qstr%table) |
|
columns=[] |
|
create=True |
|
|
|
for fieldName in fieldNames: |
|
if type(fieldName) is UnicodeType: |
|
fieldName=fieldName.encode('utf-8') |
|
zLOG.LOG("update xml: fieldname",zLOG.INFO,repr(fieldName)) |
|
if fieldName.lower() not in columns: |
|
|
|
if create:# table does not exist therefore create with one column |
|
qstr="""create table %s (%s %s)""" |
|
create=False |
|
else:# otherwise add the field |
|
qstr="""alter table %s add %s %s""" |
|
|
|
self.ZSQLSimpleSearch(qstr%(table,fieldName,'text')) |
|
zLOG.LOG("update xsd: fieldname add",zLOG.INFO,qstr%(table,fieldName,'text')) |
|
|
|
|
|
def importXMLFileAccess(self,table,container,data=None,identify=None,filename=None,RESPONSE=None): |
|
''' |
|
Import XML file in access format into the table |
|
@param table: name of the table the xml shall be imported into |
|
@param containerTagName: XML-Tag which describes a dataset |
|
@param data: data to be imported |
|
@param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes. |
|
@param RESPONSE: (optional) |
|
''' |
|
from xml.dom.pulldom import parseString,parse |
|
|
|
zLOG.LOG("import xml",zLOG.INFO,"called") |
|
#fh=file("/tmp/fmpxml.xml") |
|
import bz2 |
|
import base64 |
|
|
|
ret="" |
|
if data: |
|
data=bz2.decompress(base64.decodestring(data)) |
|
|
|
zLOG.LOG("import xml",zLOG.INFO,"received file") |
|
doc=parseString(data) |
|
zLOG.LOG("import xml",zLOG.INFO,"parsed file") |
|
|
|
elif filename: |
|
fh=file(filename) |
|
doc=parse(fh) |
|
zLOG.LOG("import xml",zLOG.INFO,"parsed file") |
|
while 1: |
|
node=doc.getEvent() |
|
|
|
if node is None: |
|
break; |
|
else: |
|
if node[1].nodeName.lower()==container.lower(): # make everything case insensitive |
|
doc.expandNode(node[1]) |
|
|
|
dataSet={} |
|
for col in node[1].childNodes: |
|
if col.nodeType is col.ELEMENT_NODE: |
|
data=col.nodeName |
|
dataSet[data]=getTextFromNode(col) |
|
print dataSet.keys() |
|
update=False |
|
|
|
if identify: |
|
|
|
field=dataSet[identify] |
|
|
|
searchStr="""select %s from %s where %s = '%s'"""%(identify,table,identify,field) |
|
zLOG.LOG("import xml",zLOG.INFO,searchStr) |
|
search=self.ZSQLSimpleSearch(searchStr) |
|
if search: |
|
update=True |
|
|
|
if update: |
|
tmp=[] |
|
for fieldName in dataSet.keys(): |
|
tmp.append("""%s = %s"""%(fieldName,self.ZSQLQuote(dataSet[fieldName]))) |
|
setStr=",".join(tmp) |
|
|
|
field=dataSet[identify] |
|
|
|
queryStr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,identify,field) |
|
zLOG.LOG("update xml",zLOG.INFO,queryStr) |
|
self.ZSQLSimpleSearch(queryStr) |
|
ret+="ud: %s \n"%field |
|
else: |
|
|
|
|
|
fields=",".join(dataSet.keys()) |
|
values=",".join([""" %s """%self.ZSQLQuote(x) for x in dataSet.keys()]) |
|
|
|
|
|
queryStr="""INSERT INTO %s (%s) VALUES (%s)"""%(table,fields,values) |
|
self.ZSQLSimpleSearch(queryStr) |
|
zLOG.LOG("update xml",zLOG.INFO,queryStr) |
|
|
|
|
|
|
|
|
|
return ret |
|
|
|
|
|
def importXMLFile(self,table,data=None,identify=None,filename=None,RESPONSE=None): |
|
#TODO: finish importXMLFile |
|
''' |
|
Import XML file into the table |
|
@param table: name of the table the xml shall be imported into |
|
@param containerTagName: XML-Tag which describes a dataset |
|
@param data: data to be imported |
|
@param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes. |
|
@param RESPONSE: (optional) |
|
''' |
|
from xml.dom.pulldom import parseString,parse |
|
|
|
zLOG.LOG("import xml",zLOG.INFO,"called") |
|
#fh=file("/tmp/fmpxml.xml") |
|
import bz2 |
|
import base64 |
|
|
|
ret="" |
|
if data: |
|
data=bz2.decompress(base64.decodestring(data)) |
|
|
|
zLOG.LOG("import xml",zLOG.INFO,"received file") |
|
doc=parseString(data) |
|
zLOG.LOG("import xml",zLOG.INFO,"parsed file") |
|
|
|
elif filename: |
|
fh=file(filename) |
|
doc=parse(fh) |
|
zLOG.LOG("import xml",zLOG.INFO,"parsed file") |
|
while 1: |
|
node=doc.getEvent() |
|
|
|
if node is None: |
|
break; |
|
else: |
|
if node[1].nodeName=='ROW': |
|
doc.expandNode(node[1]) |
|
cols=node[1].getElementsByTagName('COL') |
|
dataSet=[] |
|
for col in cols: |
|
data=col.getElementsByTagName('DATA') |
|
dataSet.append(getTextFromNode(data[0])) |
|
update=False |
|
if identify: |
|
|
|
nr=fieldNames.index(identify) |
|
field=dataSet[nr] |
|
|
|
searchStr="""select %s from %s where %s = '%s'"""%(identify,table,identify,field) |
|
zLOG.LOG("import xml",zLOG.INFO,searchStr) |
|
search=self.ZSQLSimpleSearch(searchStr) |
|
if search: |
|
update=True |
|
|
|
if update: |
|
tmp=[] |
|
for fieldName in fieldNames: |
|
tmp.append("""%s = %s"""%(fieldName,self.ZSQLQuote(dataSet[fieldNames.index(fieldName)]))) |
|
setStr=",".join(tmp) |
|
nr=fieldNames.index(identify) |
|
field=dataSet[nr] |
|
|
|
queryStr="""UPDATE %s SET %s WHERE %s = '%s' """%(table,setStr,identify,field) |
|
zLOG.LOG("update xml",zLOG.INFO,queryStr) |
|
self.ZSQLSimpleSearch(queryStr) |
|
ret+="ud: %s \n"%field |
|
else: |
|
|
|
|
|
fields=",".join(fieldNames) |
|
values=",".join([""" %s """%self.ZSQLQuote(x) for x in dataSet]) |
|
|
|
|
|
queryStr="""INSERT INTO %s (%s) VALUES (%s)"""%(table,fields,values) |
|
self.ZSQLSimpleSearch(queryStr) |
|
zLOG.LOG("update xml",zLOG.INFO,queryStr) |
|
ret+="ad: %s \n"%field |
|
|
|
elif node[1].nodeName=="METADATA": |
|
fieldNames=[] |
|
doc.expandNode(node[1]) |
|
|
|
names=node[1].getElementsByTagName('FIELD') |
|
|
|
for name in names: |
|
fieldNames.append(name.getAttribute('NAME')) |
|
|
|
zLOG.LOG("update xml: fieldnames",zLOG.INFO,repr(fieldNames)) |
|
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)] |
|
|
|
for fieldName in fieldNames: |
|
zLOG.LOG("update xml: fieldname",zLOG.INFO,repr(fieldName)) |
|
if fieldName not in columns: |
|
qstr="""alter table %s add %s %s""" |
|
self.ZSQLSimpleSearch(qstr%(table,fieldName,'text')) |
|
zLOG.LOG("update xml: fieldname add",zLOG.INFO,qstr%(table,fieldName,'text')) |
|
#fn=node[1].getAttribute("xml:id") |
|
#nf=file("xtf/"+fn+".xtf",'w') |
|
#nf.write("""<texts xmlns="http://emegir.info/xtf" xmlns:lem="http://emegir.info/lemma" >"""+node[1].toxml()+"</texts>") |
|
#print "wrote: %s"%fn |
|
return ret |
|
|
|
def generateIndex(self,field,index_name,table,RESPONSE=None): |
|
"""erzeuge index aus feld""" |
|
index={} |
|
founds=self.ZSQLSimpleSearch("""SELECT %s,oid FROM %s LIMIT 2000"""%(field,table)) |
|
|
|
for found in founds: |
|
tmp=getattr(found,field,None) |
|
if tmp: |
|
strings=tmp.split(" ") |
|
for string in strings: |
|
if index.get(string): |
|
index[string].append(found.oid) |
|
else: |
|
index[string]=[found.oid] |
|
RESPONSE.write(string+"\n") |
|
|
|
if not hasattr(self,index_name): |
|
obj=ZSQLIndex(index,index_name,table) |
|
self._setObject(index_name,obj) |
|
|
|
self._getOb(index_name).setIndex(index) |
|
|
|
def getIndex(self,index_name): |
|
"""getIndex""" |
|
founds=self.ZopeFind(self,obj_ids=[index_name]) |
|
|
|
return founds[0][1].getIndex() |
|
|
|
|
def testneu(self): |
def testneu(self): |
"""test""" |
"""test""" |
Line 64 class ZSQLExtendFolder(Folder,Persistent
|
Line 425 class ZSQLExtendFolder(Folder,Persistent
|
def URLquote(self,txt): |
def URLquote(self,txt): |
"""urlquote""" |
"""urlquote""" |
return urllib.quote(txt) |
return urllib.quote(txt) |
|
|
def searchRel(self,relStatement,statement,wherePart,classes): |
def searchRel(self,relStatement,statement,wherePart,classes): |
"""suche relative haufigkeiten""" |
"""suche relative haufigkeiten""" |
ret={} |
ret={} |
Line 95 class ZSQLExtendFolder(Folder,Persistent
|
Line 457 class ZSQLExtendFolder(Folder,Persistent
|
return "" |
return "" |
|
|
def getLabel(self): |
def getLabel(self): |
"""getLabe""" |
"""getLabel""" |
try: |
try: |
return self.label |
return self.label |
except: |
except: |
return "" |
return "" |
|
|
|
def getTitle(self): |
|
"""getTitle""" |
|
try: |
|
return self.title |
|
except: |
|
return "" |
|
|
|
|
def getDescription(self): |
def getDescription(self): |
"""getLabe""" |
"""getDescription""" |
try: |
try: |
return self.description |
return self.description |
except: |
except: |
Line 131 class ZSQLExtendFolder(Folder,Persistent
|
Line 501 class ZSQLExtendFolder(Folder,Persistent
|
def formatAscii(self,str,url=None): |
def formatAscii(self,str,url=None): |
"""ersetze ascii umbrueche durch <br>""" |
"""ersetze ascii umbrueche durch <br>""" |
#url=None |
#url=None |
|
|
|
if not str: |
|
return "" |
|
|
|
str=str.rstrip().lstrip() |
|
|
if url and str: |
if url and str: |
|
|
retStr="" |
retStr="" |
Line 231 class ZSQLExtendFolder(Folder,Persistent
|
Line 607 class ZSQLExtendFolder(Folder,Persistent
|
return ret |
return ret |
|
|
|
|
def ZSQLOptionsFromCRList(self,fieldname,listField, multiple='',start=None,startValue=None,size=None): |
def ZSQLOptionsFromCRList(self,fieldname,listField, multiple='',start=None,startValue=None,size=None,selected=None): |
"""generate select oprions form a cr seperated list""" |
"""generate select oprions form a cr seperated list""" |
fields=listField.split("\n") |
fields=listField.split("\n") |
if size: |
if size: |
Line 249 class ZSQLExtendFolder(Folder,Persistent
|
Line 625 class ZSQLExtendFolder(Folder,Persistent
|
|
|
ret+="""<option value="%s" >%s</option>"""%(startValue,start) |
ret+="""<option value="%s" >%s</option>"""%(startValue,start) |
for field in fields: |
for field in fields: |
|
if selected and (field in selected.split("\n")): |
|
ret+="""<option selected value="%s">%s</option>"""%(field.encode('utf-8'),field.encode('utf-8')) |
|
else: |
ret+="""<option value="%s">%s</option>"""%(field.encode('utf-8'),field.encode('utf-8')) |
ret+="""<option value="%s">%s</option>"""%(field.encode('utf-8'),field.encode('utf-8')) |
ret+="""</select>""" |
ret+="""</select>""" |
return ret |
return ret |
Line 279 class ZSQLExtendFolder(Folder,Persistent
|
Line 658 class ZSQLExtendFolder(Folder,Persistent
|
if start: |
if start: |
if start==' ': |
if start==' ': |
start='' |
start='' |
|
|
if not startValue: |
if not startValue: |
startValue=start |
startValue=start |
|
|
Line 303 class ZSQLExtendFolder(Folder,Persistent
|
Line 683 class ZSQLExtendFolder(Folder,Persistent
|
qs=[] |
qs=[] |
if storename: |
if storename: |
"""store""" |
"""store""" |
|
storename=storename |
else: |
else: |
storename="foundCount" |
storename="foundCount" |
|
|
Line 345 class ZSQLExtendFolder(Folder,Persistent
|
Line 726 class ZSQLExtendFolder(Folder,Persistent
|
"""inlinesearch""" |
"""inlinesearch""" |
qs=[] |
qs=[] |
|
|
|
|
|
|
#print "INLINE:",query |
#print "INLINE:",query |
return self.ZSQLSimpleSearch(query) |
return self.ZSQLSimpleSearch(query) |
|
|
|
|
def ZSQLSimpleSearch(self,query=None,max_rows=1000000): |
def ZSQLResetConnection(self): |
|
"""reset the connectione""" |
|
try: |
|
self.getConnectionObj().manage_close_connection() |
|
except: |
|
zLOG.LOG("ZSQLResetConnection",zLOG.ERROR, '%s %s'%sys.exc_info()[:2]) |
|
try: |
|
self.getConnectionObj().manage_open_connection() |
|
except: |
|
zLOG.LOG("ZSQLResetConnection",zLOG.ERROR, '%s %s'%sys.exc_info()[:2]) |
|
|
|
def ZSQLSimpleSearch(self,query=None,max_rows=1000000,debug=None): |
"""simple search""" |
"""simple search""" |
|
|
|
|
if not query: |
if not query: |
query=self.query |
query=self.query |
|
|
|
if debug: |
|
print "DEBUG: ZSQLSimpleSearch:", query |
if (hasattr(self,"_v_searchSQL") and (self._v_searchSQL == None)) or (not hasattr(self,"_v_searchSQL")): |
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","<dtml-var var>") |
|
|
self._v_searchSQL=Shared.DC.ZRDB.DA.DA("_v_searchSQL","_v_searchSQL",self.getConnectionObj().getId(),"var","<dtml-var var>") |
|
|
self._v_searchSQL.max_rows_=max_rows |
self._v_searchSQL.max_rows_=max_rows |
try: |
try: |
|
|
return self._v_searchSQL.__call__(var=query) |
return self._v_searchSQL.__call__(var=query) |
except : |
except : |
|
|
if sys.exc_info()[0]=="Database Error": |
if sys.exc_info()[0]=="Database Error": |
try: |
try: |
getattr(self,self.connection_id).manage_open_connection() |
self.getConnectionObj().manage_open_connection() |
except: pass |
except: |
|
zLOG.LOG("ZSQLSimpleSearch",zLOG.ERROR, '%s %s'%sys.exc_info()[:2]) |
else: |
else: |
try: |
try: |
|
|
self._v_searchSQL.max_rows_=max_rows |
self._v_searchSQL.max_rows_=max_rows |
|
|
return self._v_searchSQL.__call__(var=query) |
return self._v_searchSQL.__call__(var=query) |
except : |
except : |
|
|
if sys.exc_info()[0]=="Database Error": |
if sys.exc_info()[0]=="Database Error": |
try: |
try: |
getattr(self,self.connection_id).manage_open_connection() |
self.getConnectionObj().manage_open_connection() |
except: pass |
except: |
|
zLOG.LOG("ZSQLSimpleSearch",zLOG.ERROR, '%s %s'%sys.exc_info()[:2]) |
|
|
|
def getConnectionObj(self): |
|
if hasattr(self,'connection_id'): |
|
return getattr(self,self.connection_id) |
|
|
|
|
def ZSQLSimpleSearch2(self,query=None): |
def ZSQLSimpleSearch2(self,query=None): |
""" returrn SQLSearch""" |
""" returrn SQLSearch""" |
#print "hi",query |
|
if not query: |
if not query: |
query=self.query |
query=self.query |
if getattr(self,'_v_search',None): |
if getattr(self,'_v_search',None): |
Line 406 class ZSQLExtendFolder(Folder,Persistent
|
Line 809 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
|
|
def ZSQLAdd(self): |
def ZSQLAdd(self,format=None,RESPONSE=None,**argv): |
"""Neuer Eintrag""" |
"""Neuer Eintrag""" |
qs=self.REQUEST['QUERY_STRING'] |
|
|
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,",") |
|
|
|
for field in argv.keys(): |
|
if field[0]=="_": |
|
fieldTmp="-"+field[1:] |
|
else: |
|
fieldTmp=field |
|
|
|
qs+=",%s=%s"%(fieldTmp,argv[field]) |
|
|
|
|
addList={} |
addList={} |
for q in qs.split("&"): |
for q in qs.split(","): |
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
value=q.split("=")[1] |
value=q.split("=")[1] |
value=re.sub(r'\+'," ",value) |
value=re.sub(r'\+'," ",value) |
Line 419 class ZSQLExtendFolder(Folder,Persistent
|
Line 838 class ZSQLExtendFolder(Folder,Persistent
|
table=urllib.unquote(value) |
table=urllib.unquote(value) |
elif name=="-format": |
elif name=="-format": |
format=urllib.unquote(value) |
format=urllib.unquote(value) |
elif (not name[0]=="-") and (not len(value)==0): |
elif (not (name[0]=="-" or name[0]=="_")) and (not len(value)==0): |
addList[urllib.unquote(name)]=urllib.unquote(value) |
addList[urllib.unquote(name)]=urllib.unquote(value) |
|
|
keyList=[] |
keyList=[] |
Line 432 class ZSQLExtendFolder(Folder,Persistent
|
Line 851 class ZSQLExtendFolder(Folder,Persistent
|
valueString=string.join(valueList,",") |
valueString=string.join(valueList,",") |
|
|
queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString) |
queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString) |
|
|
self.ZSQLSimpleSearch(queryString) |
self.ZSQLSimpleSearch(queryString) |
return self.REQUEST.RESPONSE.redirect(format) |
|
|
|
def ZSQLChange(self,format=None,RESPONSE=None,**argv): |
if RESPONSE and format: |
|
return RESPONSE.redirect(format) |
|
else: |
|
return True |
|
|
|
def ZSQLChange(self,format=None,RESPONSE=None,USE_FORM=None,**argv): |
"""change entries""" |
"""change entries""" |
#qs=self.REQUEST['QUERY_STRING'] |
#qs=self.REQUEST['QUERY_STRING'] |
# very bad hack |
# very bad hack |
|
|
qs_temp=[] |
qs_temp=[] |
|
if USE_FORM or RESPONSE: |
for a in self.REQUEST.form.keys(): |
for a in self.REQUEST.form.keys(): |
qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a]))) |
qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a]))) |
|
|
qs=string.join(qs_temp,",") |
|
|
|
for field in argv.keys(): |
for field in argv.keys(): |
|
|
if field[0]=="_": |
if field[0]=="_": |
fieldTmp="-"+field[1:] |
fieldTmp="-"+field[1:] |
else: |
else: |
fieldTmp=field |
fieldTmp=field |
|
|
qs+=",%s=%s"%(fieldTmp,argv[field]) |
qs_temp.append("%s=%s"%(fieldTmp,argv[field])) |
|
|
|
|
changeList=[] |
changeList=[] |
for q in qs.split(","): |
|
print q |
for q in qs_temp: |
|
|
name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower())) |
name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower())) |
value="=".join(q.split("=")[1:]) |
value="=".join(q.split("=")[1:]) |
value=re.sub(r'\+'," ",value) |
value=re.sub(r'\+'," ",value) |
Line 471 class ZSQLExtendFolder(Folder,Persistent
|
Line 897 class ZSQLExtendFolder(Folder,Persistent
|
identify=identify.split("=")[0]+"="+sql_quote(identify.split("=")[1]) |
identify=identify.split("=")[0]+"="+sql_quote(identify.split("=")[1]) |
elif name=="-format": |
elif name=="-format": |
format=urllib.unquote(value) |
format=urllib.unquote(value) |
elif (not name[0]=="-") and (not len(value)==0): |
elif (not (name[0]=="-" or name[0]=="_")) and (not len(value)==0): |
|
|
changeList.append("\""+name+"\"="+sql_quote(urllib.unquote(value))) |
changeList.append("\""+name+"\"="+sql_quote(urllib.unquote(value))) |
|
|
changeString=string.join(changeList,",") |
changeString=string.join(changeList,",") |
|
|
queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify) |
queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify) |
|
|
self.ZSQLSimpleSearch(queryString) |
self.ZSQLSimpleSearch(queryString) |
|
|
|
|
Line 485 class ZSQLExtendFolder(Folder,Persistent
|
Line 914 class ZSQLExtendFolder(Folder,Persistent
|
return True |
return True |
|
|
|
|
|
def ZSQLFindIndexed(self,qs="",select="oid,*",storename=None,indexedFields=['data_line'],restrictField='id_text',**argv): |
|
"""find2""" |
|
|
|
for index in self.ZopeFind(self,obj_ids=indexedFields): |
|
txt=argv.get(index[0],None) |
|
if txt: |
|
oids=index[1].getIndex()[txt] |
|
|
|
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 |
|
|
def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv): |
def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],restrictField='id_text',**argv): |
"""find2""" |
"""find2""" |
|
|
Line 496 class ZSQLExtendFolder(Folder,Persistent
|
Line 938 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=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv): |
"""Find""" |
"""search in database""" |
|
|
def delEmpty(list): |
def delEmpty(list): |
|
""""loesche leere elemente aus der liste""" |
ret=[] |
ret=[] |
for x in list: |
for x in list: |
splitted=x.split("=") |
splitted=x.split("=") |
Line 506 class ZSQLExtendFolder(Folder,Persistent
|
Line 949 class ZSQLExtendFolder(Folder,Persistent
|
ret.append(x) |
ret.append(x) |
return ret |
return ret |
|
|
|
|
|
|
#self.REQUEST.SESSION['come_from_search']="no" # zuruecksetzen |
|
if qs=="": |
if qs=="": |
|
#kein querystring ubergeben |
if self.REQUEST['QUERY_STRING']: |
if self.REQUEST['QUERY_STRING']: |
qs=self.REQUEST['QUERY_STRING'] |
qs=self.REQUEST['QUERY_STRING'] |
|
|
|
|
qs=string.join(qs.split("&"),",") |
qs=string.join(qs.split("&"),",") |
|
|
for field in argv.keys(): |
for field in argv.keys(): |
if field[0]=="_": |
if field[0]=="_": |
fieldTmp="-"+field[1:] |
fieldTmp="-"+field[1:] |
else: |
else: |
fieldTmp=field |
fieldTmp=urllib.unqoute(field) |
|
|
qs+=",%s=%s"%(fieldTmp,argv[field]) |
qs+=",%s=%s"%(fieldTmp,argv[field]) |
|
|
Line 546 class ZSQLExtendFolder(Folder,Persistent
|
Line 985 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
|
|
qs=re.sub("\\+"," ",qs)# Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular. |
qs=re.sub("\\+"," ",qs)#TODO: Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular. |
|
|
qs=string.join(delEmpty(qs.split(",")),",") |
qs=string.join(delEmpty(qs.split(",")),",") |
|
|
Line 674 class ZSQLExtendFolder(Folder,Persistent
|
Line 1113 class ZSQLExtendFolder(Folder,Persistent
|
"""analysieren den QueryString""" |
"""analysieren den QueryString""" |
|
|
|
|
|
#setzte generische werte |
|
|
lop="AND" # standardsuche mit and |
lop="AND" # standardsuche mit and |
max="ALL" #standard alle auswaehlen |
max="ALL" #standard alle auswaehlen |
maxstr="" |
maxstr="" |
Line 689 class ZSQLExtendFolder(Folder,Persistent
|
Line 1130 class ZSQLExtendFolder(Folder,Persistent
|
limit=0 |
limit=0 |
searchFields={} |
searchFields={} |
searchFieldsOnly={} |
searchFieldsOnly={} |
|
queryTemplate=[] |
|
|
if not select: |
if not select: |
select="oid,*" |
select="oid,*" |
#print "Q",nostore,qs |
|
#check for op |
|
|
|
|
|
|
|
|
|
|
#check for op |
splitted=qs.split(",") |
splitted=qs.split(",") |
|
|
if tableExt: |
if tableExt: |
table=tableExt |
table=tableExt |
|
|
if restrictField: |
if restrictField: |
select=restrictField |
select=restrictField |
|
|
|
|
|
#erster durchgang suche operatoren |
for q in splitted: |
for q in splitted: |
|
|
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
Line 735 class ZSQLExtendFolder(Folder,Persistent
|
Line 1177 class ZSQLExtendFolder(Folder,Persistent
|
else: |
else: |
sortfields[field]=value |
sortfields[field]=value |
|
|
#print "HI",op,field |
#zweiter durchgang analysiere felder |
#print opfieldsa |
|
#now analyse the querystring |
|
|
|
for q in qs.split(","): |
for q in qs.split(","): |
|
|
|
|
#try: |
|
|
|
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
name=re.sub("r'+'"," ",q.split("=")[0].lower()) |
try: |
try: |
Line 750 class ZSQLExtendFolder(Folder,Persistent
|
Line 1188 class ZSQLExtendFolder(Folder,Persistent
|
except: |
except: |
value="" |
value="" |
|
|
#value=sql_quote(value) |
punktsplit=name.split(".") #sonderfall feld mit punkten(tabelle.suchFeld.ausgewaehltesFeld,feldinoriginal), d.h. suche in anderer tabelle: |
|
|
|
|
|
#analysiere alle anderen faelle |
if name==iCT+"lop": |
if name==iCT+"lop": |
lop=value |
lop=value |
elif name==iCT+"table": |
elif name==iCT+"table": |
Line 794 class ZSQLExtendFolder(Folder,Persistent
|
Line 1232 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
|
|
|
elif (not name[0]==iCT) and len(punktsplit)==4: |
|
if opfields.has_key(name): |
|
op=opfields[name] |
|
else: |
|
op="ct" |
|
namealt=name |
|
name="LOWER("+punktsplit[1]+")" |
|
|
|
if op=="ct": |
|
tmp=(name+" LIKE "+sql_quote("%"+value+"%")) |
|
elif op=="gt": |
|
tmp=(name+">"+sql_quote(value)) |
|
elif op=="lt": |
|
tmp=(name+"<"+sql_quote(value)) |
|
elif op=="eq": |
|
tmp=(name+"="+sql_quote(value)) |
|
elif op=="bw": |
|
tmp=(name+" LIKE "+sql_quote(value+"%")) |
|
elif op=="ew": |
|
tmp=(name+" LIKE "+sql_quote("%"+value)) |
|
elif op=="all": |
|
tmps=[] |
|
for word in value.split(" "): |
|
tmps.append(name+" LIKE "+sql_quote("%"+word+"%")) |
|
|
|
tmp=string.join(tmps,' AND ') |
|
|
|
elif op=="numerical": |
|
term=analyseIntSearch(value) |
|
tmp=(name+" "+term) |
|
elif op=="grep": |
|
tmp=(name+" ~* "+sql_quote(value)) |
|
elif op=="one": |
|
tmps=[] |
|
for word in value.split(" "): |
|
tmps.append(name+" LIKE "+sql_quote("%"+word+"%")) |
|
|
|
tmp=string.join(tmps,' OR ') |
|
|
|
op="all" |
|
|
|
|
|
searchTmp="""%s in (select %s from %s where %s)"""%(punktsplit[3],punktsplit[2],punktsplit[0],tmp) |
|
|
|
queryTemplate.append(searchTmp) |
|
|
elif (not name[0]==iCT) and (not len(value)==0): |
elif (not name[0]==iCT) and (not len(value)==0): |
|
|
#print "OP",op,name |
#print "OP",op,name |
Line 848 class ZSQLExtendFolder(Folder,Persistent
|
Line 1332 class ZSQLExtendFolder(Folder,Persistent
|
|
|
|
|
whereList=["("+searchFields[x]+")" for x in searchFields.keys()] |
whereList=["("+searchFields[x]+")" for x in searchFields.keys()] |
|
whereList+=queryTemplate |
|
|
if len(whereList)>0: |
if len(whereList)>0: |
if filter: |
if filter: |
Line 878 class ZSQLExtendFolder(Folder,Persistent
|
Line 1363 class ZSQLExtendFolder(Folder,Persistent
|
#print "IAMHERE again:", query |
#print "IAMHERE again:", query |
|
|
if storename and (not NoQuery): |
if storename and (not NoQuery): |
|
|
query2="SELECT count(*) FROM %s %s"%(table,where) |
query2="SELECT count(*) FROM %s %s"%(table,where) |
|
|
#print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2'] |
#print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2'] |
Line 916 class ZSQLExtendFolder(Folder,Persistent
|
Line 1402 class ZSQLExtendFolder(Folder,Persistent
|
self.REQUEST.SESSION[storename]['searchFields']=searchFields |
self.REQUEST.SESSION[storename]['searchFields']=searchFields |
self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly |
self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly |
|
|
|
|
if not NoQuery: |
if not NoQuery: |
|
|
return self.ZSQLQuery(query) |
return self.ZSQLQuery(query) |
Line 935 class ZSQLExtendFolder(Folder,Persistent
|
Line 1422 class ZSQLExtendFolder(Folder,Persistent
|
else: |
else: |
return value |
return value |
|
|
def ZSQLQuery(self,query): |
def ZSQLQuery(self,query,debug=None): |
"""query""" |
"""query""" |
|
if debug: |
|
zLOG.LOG("ZSQLQuery", zLOG.INFO, query) |
|
|
return self.ZSQLSimpleSearch(query) |
return self.ZSQLSimpleSearch(query) |
|
|
|
|
def ZSQLSearch(self): |
def ZSQLSearch(self): |
"""To be done""" |
"""To be done""" |
rq=self.REQUEST['QUERY_STRING'] |
|
|
|
querys=rq.split("&") |
|
|
|
|
|
formatfile=self.REQUEST['URL1'] #generisch redirect zur gleichen url |
formatfile=self.REQUEST['URL1'] #generisch redirect zur gleichen url |
|
|
for querytemp in querys: |
#zerlege querystring in key value paare |
query=querytemp.split("=") |
#TODO: check if this is really necessary, use argv** |
|
|
|
|
|
|
|
rq=self.REQUEST['QUERY_STRING'] |
|
querys=rq.split("&") |
|
for querytemp in querys: #zerg |
|
query=querytemp.split("=") |
|
|
try: |
try: |
if query[0].lower()=="-format": |
if query[0].lower()=="-format": |
formatfile=query[1] |
formatfile=query[1] |
except: |
except: |
"""nothing""" |
pass |
|
|
|
|
#print formatfile |
|
|
|
|
|
|
#sichern |
self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",") |
self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",") |
self.REQUEST.SESSION['come_from_search']="yes" |
self.REQUEST.SESSION['come_from_search']="yes" |
|
|
Line 1341 class ZSQLBibliography(Folder,ZSQLExtend
|
Line 1825 class ZSQLBibliography(Folder,ZSQLExtend
|
else: |
else: |
return "" |
return "" |
|
|
def getMetaDataXML2(self): |
def getXML2(self): |
"""crate index meta""" |
"""crate index meta""" |
|
|
fn=os.path.splitext(self.REQUEST['fn'])[0]+"." |
fn=os.path.splitext(self.REQUEST['fn'])[0]+"." |
Line 1405 class ZSQLBibliography(Folder,ZSQLExtend
|
Line 1889 class ZSQLBibliography(Folder,ZSQLExtend
|
host_port = self.REQUEST['SERVER_PORT'] |
host_port = self.REQUEST['SERVER_PORT'] |
fix_host = None |
fix_host = None |
if http_host and http_host.rfind(host_port) == -1: |
if http_host and http_host.rfind(host_port) == -1: |
print "HTTP_HOST needs fixing!" |
#print "HTTP_HOST needs fixing!" |
fix_host = http_host + ":" + host_port |
fix_host = http_host + ":" + host_port |
|
|
ret="""<?xml version="1.0" ?> |
ret="""<?xml version="1.0" ?> |