Commit 40606ff7 authored by Jim Fulton's avatar Jim Fulton

initial

parent 6e03dd44
#!/bin/env python
##############################################################################
#
# Copyright
#
# Copyright 1996 Digital Creations, L.C., 910 Princess Anne
# Street, Suite 300, Fredericksburg, Virginia 22401 U.S.A. All
# rights reserved.
#
##############################################################################
__doc__='''Generic Database adapter
$Id: DA.py,v 1.1 1997/07/25 16:43:05 jim Exp $'''
__version__='$Revision: 1.1 $'[11:-2]
import string, OFS.Folder, Aqueduct.Aqueduct, Aqueduct.RDB
import DocumentTemplate, marshal, md5, zlib, base64, DateTime, Acquisition
from Aqueduct.Aqueduct import quotedHTML, decodestring, parse, Rotor
from Aqueduct.Aqueduct import custom_default_report, default_input_form
from Aqueduct.Aqueduct import default_report_src
from Globals import Persistent, ManageHTMLFile, MessageDialog
from cStringIO import StringIO
log_file=None
class Folder(OFS.Folder.Folder):
meta_type='Aqueduct Database Adapter Folder'
manage_options=OFS.Folder.Folder.manage_options+(
{'icon':'App/arrow.jpg', 'label':'Database Connection',
'action':'manage_connectionForm', 'target':'manage_main'},
)
manage_main =ManageHTMLFile('AqueductDA/main')
manage_connectionForm=ManageHTMLFile('AqueductDA/connection')
manage_addDAForm=ManageHTMLFile('AqueductDA/daAdd')
start_time=DateTime.now()
def manage_connection(self,value=None,check=None,REQUEST=None):
'change database connection data'
if value is None: return self.database_connection_string()
if check: self.database_connect()
self.database_connection_string(value)
return self.manage_main(self,REQUEST)
def database_connect(self,s=''):
try: self._v_database_connection.close()
except: pass
self.bad_connection_string=(
"""<strong>Warning</strong>: The database is not connected.
""")
if not s: s=self.folder_database_connection_string()
if not s: return
DB=self.database_connection_factory()
try:
self._v_database_connection=DB(s)
self.connect_time=DateTime.now()
except:
raise 'BadRequest', (
'<strong>Invalid connection string:</strong><br>'
+ s)
self.bad_connection_string=''
def __setstate__(self, v):
Folder.inheritedAttribute('__setstate__')(self, v)
try:
if self._v_database_connection is not None:
return
except: pass
try: self.database_connect()
except: pass
def manage_addDA(self,name,key,arguments,template,REQUEST):
'Add a query'
q=Query(name,key,arguments,template)
self._setObject(name,q)
return self.manage_main(self,REQUEST)
test_url___allow_groups__=None
def test_url_(self):
'Method for testing server connection information'
return 'PING'
class Query(Aqueduct.Aqueduct.BaseQuery,Persistent,Acquisition.Implicit):
'Database query object'
meta_type='Aqueduct Database Adapter'
hasAqueductClientInterface=1
manage=ManageHTMLFile('AqueductDA/edit')
def __init__(self,name='',key='',arguments='',template='',description=''):
if not name: return
self.name=name
self.report_src=default_report_src
self.manage_edit(key,description,arguments,template)
def quoted_src(self): return quotedHTML(self.src)
def manage_edit(self,key,description,arguments,template,URL2=''):
'change query properties'
self.description=description
self.key=key
self.rotor=Rotor(key)
self.arguments_src=arguments
self.arguments=parse(arguments)
self.src=template
self.template=DocumentTemplate.HTML(template)
self.manage_testForm=DocumentTemplate.HTML(
default_input_form(self.name,self.arguments,
action='manage_test'),
__name__='test input form')
if URL2:
return MessageDialog(
title=self.name+' changed',
message=self.name+' has been changed sucessfully.',
action=URL2+'/manage_main',
)
def query_data(self,REQUEST):
try: DB__=self.database_connection()
except: raise 'Database Error', (
'%s is not connected to a database' % self.name)
argdata=self._argdata(REQUEST,1)
query_string=self._query_string(argdata,'manage_test')
query=self.template(self,REQUEST)
result=DB__.query(query)
result=Aqueduct.RDB.RDB(StringIO(result))
return result
def manage_test(self,REQUEST):
'Provide a simple interface for testing a query'
try: DB__=self.database_connection()
except: raise 'Database Error', (
'%s is not connected to a database' % self.name)
argdata=self._argdata(REQUEST,1)
query_string=self._query_string(argdata,'manage_test')
query=self.template(self,REQUEST)
result=DB__.query(query)
result=Aqueduct.RDB.RDB(StringIO(result))
self.result_names=result.names()
self.report_src=custom_default_report(result,action='/manage_testForm')
report=DocumentTemplate.HTML(self.report_src)
return report(self,REQUEST,
query_results=result,
query_string=query_string,
)
def query(self,DB__,REQUEST,RESPONSE):
' '
if DB__ is None: raise 'Database Error', (
'No database connection defined')
try:
argdata=REQUEST.form.value
argdata=decodestring(argdata)
argdata=self.rotor.decrypt(argdata)
digest,argdata=argdata[:16],argdata[16:]
if md5.new(argdata).digest() != digest:
raise 'Bad Request', 'Corrupted Data'
argdata=marshal.loads(argdata)
query=apply(self.template,(self,),argdata)
result=DB__.query(query)
result=zlib.compress(result,1)
result=md5.new(result).digest()+result
result=self.rotor.encrypt(result)
result=base64.encodestring(result)
RESPONSE['content-type']='text/X-PyDB'
RESPONSE['Content-Length']=len(result)
RESPONSE.write(result)
except:
t,v,tb=sys.exc_type, sys.exc_value, sys.exc_traceback
result=str(RESPONSE.exception())
serial=str(DateTime.now())
if log_file:
l=string.find(result,"Traceback (innermost last):")
if l >= 0: l=result[l:]
else: l=v
log_file.write("%s\n%s %s, %s:\n%s\n" % (
'-'*30, serial, self.name, t, l))
log_file.flush()
serial="Error number: %s\n" % serial
serial=zlib.compress(serial,1)
serial=md5.new(serial).digest()+serial
serial=self.rotor.encrypt(serial)
serial=base64.encodestring(serial)
RESPONSE.setBody(serial)
##############################################################################
# Test functions:
#
def main():
# The "main" program for this module
import sys
print sys.argv[0]+" is a pure module and doesn't do anything by itself."
if __name__ == "__main__": main()
##############################################################################
#
# $Log: DA.py,v $
# Revision 1.1 1997/07/25 16:43:05 jim
# initial
#
#
*shared*
# install DA.py
# install connection.dtml
# install daAdd.dtml
# install edit.dtml
<html> <head>
<title>DA Database Connection Information</title>
</head>
<body bgcolor="#FFFFFF" link="#3333FF" alink="#009999" vlink="#006600">
<FONT SIZE="+2" COLOR="#77003B">
Aqueduct Database Adapter<br>
Database Connection Information
</FONT>
<form action="<!--#var PARENT_URL-->/manage_connection" method="post">
<strong>Enter the database connection string:</strong><br>
<input name="value" size="60" value="<!--#var manage_connection-->"><p>
<strong>Check here to test connection string:</strong>
<input name="check" type="CHECKBOX" value="YES" CHECKED>
<hr>
<input type="SUBMIT" name="SUBMIT" value="Change Connection String">
<input type="SUBMIT" name="SUBMIT" value="Cancel">
<!--#if HTTP_REFERER-->
<INPUT NAME="CANCEL_ACTION" TYPE="HIDDEN" VALUE="<!--#var HTTP_REFERER-->">
<!--#else HTTP_REFERER-->
<INPUT NAME="CANCEL_ACTION" TYPE="HIDDEN" VALUE="<!--#var PARENT_URL-->">
<!--#/if HTTP_REFERER-->
</form>
</body> </html>
<html><head><title>DA New Query</title></head>
<body bgcolor="#FFFFFF" link="#3333FF" alink="#009999" vlink="#006600">
<FONT SIZE="+2" COLOR="#77003B">
Aqueduct Database Adapter<br>
New Native Query Template
</FONT>
<form action="<!--#var PARENT_URL-->/manage_addDA" method="post">
<table>
<tr> <td><strong>Name:</strong></td>
<td><input name="name" size="40"></td></tr>
<tr> <td><strong>Description:</strong></td>
<td><input name="description" size="40"></td></tr>
<tr> <td><strong>Access key:</strong></td>
<td><input name="key" size="40"></td></tr>
<tr> <td><strong>Arguments:</strong></td>
<td><input name="arguments" size="40"></td></tr>
<tr> <td colspan=2><strong>Query template:</strong><br>
<textarea name="template" rows=10 cols=60>
select *
from data
</textarea></td></tr>
<tr><td></td><td>
<input type="SUBMIT" name="SUBMIT" value="Add Server Query">
<input type="SUBMIT" name="SUBMIT" value="Cancel">
<!--#if HTTP_REFERER-->
<INPUT NAME="CANCEL_ACTION" TYPE="HIDDEN" VALUE="<!--#var HTTP_REFERER-->">
<!--#else HTTP_REFERER-->
<INPUT NAME="CANCEL_ACTION" TYPE="HIDDEN"
VALUE="<!--#var PARENT_URL-->/manage">
<!--#/if HTTP_REFERER-->
</td></tr>
</table>
</form>
</body>
</html>
<html><head><title>DA Query: <!--#var name--></title></head><body>
<body bgcolor="#FFFFFF" link="#3333FF" alink="#009999" vlink="#006600">
<FONT SIZE="+2" COLOR="#77003B">
Aqueduct Database Adapter<br>
Edit Native Query Template, <!--#var name-->
</FONT>
<form action="<!--#var URL2-->/<!--#var name-->/manage_edit"
method="<!--#var web__form__method-->">
<table>
<tr> <td><strong>Name:</strong></td>
<td><!--#var name--></td></tr>
<tr> <td><strong>Description:</strong></td>
<td><input name="description" size="40"
value="<!--#var description-->"></td></tr>
<tr> <td><strong>Access key:</strong></td>
<td><input name="key" size="40" value="<!--#var key-->"></td></tr>
<tr> <td><strong>Arguments:</strong></td>
<td><input name="arguments" size="40" value="<!--#var arguments_src-->"></td>
</tr>
<tr> <td colspan=2><strong>Query template:</strong><br>
<textarea name="template" rows=10 cols=60>
<!--#var quoted_src-->
</textarea></td></tr>
<tr><td></td><td>
<input type="SUBMIT" name="SUBMIT" value="OK">
<input type="SUBMIT" name="SUBMIT" value="Cancel">
<!--#if HTTP_REFERER-->
<INPUT NAME="CANCEL_ACTION" TYPE="HIDDEN" VALUE="<!--#var HTTP_REFERER-->">
<!--#else HTTP_REFERER-->
<INPUT NAME="CANCEL_ACTION" TYPE="HIDDEN" VALUE="<!--#var URL2-->/manage">
<!--#/if HTTP_REFERER-->
</td></tr>
</table>
</form>
</body>
</html>
<HTML>
<HEAD>
<TITLE><!--#var name fmt=spacify--></TITLE>
</HEAD>
<BODY>
<FONT SIZE="+2" COLOR="#77003B"><!--#var name fmt=spacify--></FONT>
<BR>
<!--#if parentObject-->
<!--#in parentObject-->
<A HREF="<!--#var URL2-->/manage" target="_top">
<IMG SRC="<!--#var SOFTWARE_URL-->/OFS/dirup.jpg" BORDER=0>
</A>
Go up to
<!--#var name fmt=spacify-->
<!--#var description-->
<BR>
<!--#/in parentObject-->
<!--#/if parentObject-->
<!--#if objectValues-->
<P>
The following items have been defined. To edit an item, click
on the item's icon. To view an item, click on the item's name.
<P>
<!--#in objectValues-->
<A HREF="<!--#var URL1-->/<!--#var name-->/manage"
<!--#if sequence-var-manage_options-->
TARGET="_top"
<!--#else sequence-var-manage_options-->
TARGET="manage_main"
<!--#endif sequence-var-manage_options-->>
<IMG SRC="<!--#var SOFTWARE_URL-->/<!--#var icon-->" BORDER="0">
</A>
<A HREF="<!--#var URL1-->/<!--#var name--><!--#if manage_testForm-->/manage_testForm<!--#/if manage_testForm-->">
<!--#var name fmt=spacify-->
</A> <!--#var description--><BR>
<!--#/in objectValues-->
<P>
<!--#/if objectValues-->
<TABLE>
<TR>
<TD VALIGN="TOP">
To add a new item, select an item type and click the &quot;Add&quot; button.
</TD>
<TD VALIGN="TOP">
<FORM ACTION="<!--#var PARENT_URL-->/manage_addObject" METHOD="GET">
<SELECT NAME="type">
<!--#in all_meta_types mapping-->
<OPTION VALUE="<!--#var name-->"><!--#var name fmt=spacify-->
<!--#/in all_meta_types-->
</SELECT><BR>
<INPUT TYPE="SUBMIT" VALUE="Add">
</FORM>
</TD>
</TR>
<!--#if objectValues-->
<TR>
<TD VALIGN="TOP">
To delete items, select one or more items and
click the &quot;Delete&quot; button.
</TD>
<TD VALIGN="TOP">
<FORM ACTION="<!--#var PARENT_URL-->/manage_delObjects" METHOD="GET">
<SELECT NAME="names:list" MULTIPLE SIZE="5">
<!--#in objectValues-->
<OPTION VALUE="<!--#var name-->"><!--#var name fmt=spacify-->
<!--#/in objectValues-->
</SELECT><br>
<INPUT TYPE="SUBMIT" VALUE="Delete">
</FORM>
</TD>
</TR>
<!--#/if objectValues-->
</TABLE>
</BODY>
</HTML>
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