Commit c5f382af authored by Jim Fulton's avatar Jim Fulton

Added support for DA's that return data directly as list of item descriptions

(i.e. schema) and list of rows.

Began adding support for pickle-based network protocol that, alas, may
fall by the wayside. Waaaa.
parent 801139ce
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
__doc__='''Generic Database adapter __doc__='''Generic Database adapter
$Id: DA.py,v 1.48 1998/06/26 21:51:28 jim Exp $''' $Id: DA.py,v 1.49 1998/07/12 21:01:20 jim Exp $'''
__version__='$Revision: 1.48 $'[11:-2] __version__='$Revision: 1.49 $'[11:-2]
import OFS.SimpleItem, Aqueduct.Aqueduct, Aqueduct.RDB import OFS.SimpleItem, Aqueduct.Aqueduct, Aqueduct.RDB
import DocumentTemplate, marshal, md5, base64, DateTime, Acquisition, os import DocumentTemplate, marshal, md5, base64, DateTime, Acquisition, os
...@@ -21,13 +21,15 @@ from Aqueduct.Aqueduct import custom_default_report, default_input_form ...@@ -21,13 +21,15 @@ from Aqueduct.Aqueduct import custom_default_report, default_input_form
from Globals import HTMLFile, MessageDialog from Globals import HTMLFile, MessageDialog
from cStringIO import StringIO from cStringIO import StringIO
import sys, Globals, OFS.SimpleItem, AccessControl.Role, Persistence import sys, Globals, OFS.SimpleItem, AccessControl.Role, Persistence
from string import atoi, find from string import atoi, find, join, split
import IOBTree, DocumentTemplate, sqlvar, sqltest, sqlgroup import IOBTree, DocumentTemplate, sqlvar, sqltest, sqlgroup
from time import time from time import time
from zlib import compress, decompress from zlib import compress, decompress
md5new=md5.new md5new=md5.new
import ExtensionClass import ExtensionClass
import DocumentTemplate.DT_Util import DocumentTemplate.DT_Util
from cPickle import dumps, loads
from Aqueduct.Results import Results
class SQL(DocumentTemplate.HTML): class SQL(DocumentTemplate.HTML):
commands={} commands={}
...@@ -207,8 +209,12 @@ class DA( ...@@ -207,8 +209,12 @@ class DA(
result=() result=()
try: try:
src=self(REQUEST, src__=1) src=self(REQUEST, src__=1)
if find(src,'\0'): src=join(split(src,'\0'),'\n'+'-'*60+'\n')
result=self(REQUEST) result=self(REQUEST)
if result._searchable_result_columns():
r=custom_default_report(self.id, result) r=custom_default_report(self.id, result)
else:
r='This was not a query.'
except: except:
r=( r=(
'<strong>Error, <em>%s</em>:</strong> %s' '<strong>Error, <em>%s</em>:</strong> %s'
...@@ -231,7 +237,7 @@ class DA( ...@@ -231,7 +237,7 @@ class DA(
def _searchable_result_columns(self): return self._col def _searchable_result_columns(self): return self._col
def _cached_result(self, DB__, query, compressed=0): def _cached_result(self, DB__, query):
# Try to fetch from cache # Try to fetch from cache
if hasattr(self,'_v_cache'): cache=self._v_cache if hasattr(self,'_v_cache'): cache=self._v_cache
...@@ -252,15 +258,12 @@ class DA( ...@@ -252,15 +258,12 @@ class DA(
if cache.has_key(query): if cache.has_key(query):
k, r = cache[query] k, r = cache[query]
if k > t: if k > t: return r
result=r
if not compressed: result=decompress(r)
return result
result=apply(DB__.query, query) result=apply(DB__.query, query)
r=compress(result) if self.cache_time_ > 0:
if self.cache_time_ > 0: cache[query]= now, r tcache[int(now)]=query
if compressed: return r cache[query]= now, result
return result return result
...@@ -302,13 +305,16 @@ class DA( ...@@ -302,13 +305,16 @@ class DA(
if src__: return query if src__: return query
if self.cache_time_: if self.cache_time_ > 0 and self.self.max_cache_ > 0:
result=self._cached_result(DB__, (query, self.max_rows_)) result=self._cached_result(DB__, (query, self.max_rows_))
else: result=DB__.query(query, self.max_rows_) else: result=DB__.query(query, self.max_rows_)
if hasattr(self, '_v_brain'): brain=self._v_brain if hasattr(self, '_v_brain'): brain=self._v_brain
else: brain=getBrain(self) else: brain=getBrain(self)
if type(result) is type(''):
result=Aqueduct.RDB.File(StringIO(result),brain,self) result=Aqueduct.RDB.File(StringIO(result),brain,self)
else:
result=Results(result, brain, self)
columns=result._searchable_result_columns() columns=result._searchable_result_columns()
if columns != self._col: self._col=columns if columns != self._col: self._col=columns
return result return result
...@@ -333,8 +339,7 @@ class DA( ...@@ -333,8 +339,7 @@ class DA(
raise 'Bad Request', 'Corrupted Data' raise 'Bad Request', 'Corrupted Data'
argdata=marshal.loads(argdata) argdata=marshal.loads(argdata)
if hasattr(REQUEST,'PARENTS'): p=REQUEST['PARENTS'][1] if hasattr(self, 'aq_parent'): p=self.aq_parent
elif hasattr(self, 'aq_parent'): p=self.aq_parent
else: p=None else: p=None
argdata['sql_delimiter']='\0' argdata['sql_delimiter']='\0'
...@@ -342,19 +347,23 @@ class DA( ...@@ -342,19 +347,23 @@ class DA(
query=apply(self.template,(p,),argdata) query=apply(self.template,(p,),argdata)
if self.cache_time_: if self.cache_time_:
result=self._cached_result(DB__, query, 1) result=self._cached_result(DB__, query)
else: else:
result=DB__.query(query, self.max_rows_) result=DB__.query(query, self.max_rows_)
result=compress(result,1)
if type(result) is not type(''):
result=Results(result).asRDB()
except: except:
RESPONSE.setStatus(500) RESPONSE.setStatus(500)
result="%s:\n%s\n" % (sys.exc_type, sys.exc_value) result="%s:\n%s\n" % (sys.exc_type, sys.exc_value)
result=compress(result,1)
result=compress(result,1)
result=md5new(result).digest()+result result=md5new(result).digest()+result
result=self.rotor.encrypt(result) result=self.rotor.encrypt(result)
result=base64.encodestring(result) result=base64.encodestring(result)
RESPONSE['content-type']='text/X-PyDB' #RESPONSE['content-type']='application/x-principia-network'
RESPONSE['content-type']='text/x-pydb'
RESPONSE['Content-Length']=len(result) RESPONSE['Content-Length']=len(result)
RESPONSE.setBody(result) RESPONSE.setBody(result)
...@@ -465,6 +474,13 @@ def getBrain(self, ...@@ -465,6 +474,13 @@ def getBrain(self,
############################################################################## ##############################################################################
# #
# $Log: DA.py,v $ # $Log: DA.py,v $
# Revision 1.49 1998/07/12 21:01:20 jim
# Added support for DA's that return data directly as list of item descriptions
# (i.e. schema) and list of rows.
#
# Began adding support for pickle-based network protocol that, alas, may
# fall by the wayside. Waaaa.
#
# Revision 1.48 1998/06/26 21:51:28 jim # Revision 1.48 1998/06/26 21:51:28 jim
# Added resize buttons. # Added resize buttons.
# #
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment