[Zope] Zope and ZODB database connections
kapil thangavelu
kthangavelu@earthlink.net
Thu, 15 Aug 2002 17:05:31 -0700
[snip - lots of disbelief, incredulity]
you need to seriously go back to the drawing board, and do some reading on
what your playing with.
if you really want your business objects living in a separate ZODB, use a
mounted zodb.
if your just trying to have multi-page transactions, you should store your
business objects (not a zodb) in sessions and then transfer them to a
permanent zodb, when the business transaction finishes.
btw, if you hold multiple zodb connections open, like what you were doing you,
they will all commit at the same time. ie if the transaction is committed,
which it is barring error at the end of a request, then all open database
connections will have objects commited.
-kapil
On Thursday 15 August 2002 12:21 pm, MKinsley@empirecorp.org wrote:
> > Hello everyone,
> >
> > We are currently developing a web application utilizing Zope and our own
> > ZODB database.
> > We have a few DTML documents that call external methods (written in
> > Python).
> >
> > We would like to open a ZODB connection to a database and keep it open
> > while passing the actual connection instance to other external methods
> > which process/manipulate/return the dynamic data of the web pages. We
> > have tried to use Netscape cookies to store a ZODB connection instance
> > returned from an external method 'dbOpenConn' and pass the value of the
> > cookie (ZODB connection instance) as a parameter to the 'dbCloseConn'.
> > This only works in the following DTML document.
> >
> > <dtml-var standard_html_header>
> > <h3><dtml-var welcomeMCIF></h3>
> > <form action="" name="form1" method="post">
> > <dtml-let retobj=dbOpenConn>
> > <dtml-call "RESPONSE.setCookie('wrkaround',retobj)">
> > <dtml-var
> > "dbCloseConn(REQUEST.RESPONSE.cookies.get('wrkaround')['value'])">
> > </dtml-let>
> > <input type="hidden" name="rt_from" value="1">
> > <input type="hidden" name="rt_to" value="1">
> > <p><input type="submit" name="home2.html:action" value="Request CU
> > Information"></p>
> > <table name="home1">
> > <tr valign="top">
> > <td align="left"><a href="mrm">Member Service
> > Tracking</a> |</td>
> > <td align="left"><a href="mkt">Marketing Tracking</a></td>
> > </tr>
> > </table>
> > </form>
> > <dtml-var standard_html_footer>
> >
> >
> >
> > We cannot pass the ZODB connection instance to the next page and then as
> > a parameter to a 'dbCloseConn' on that page because ZODB instances cannot
> > be stored in a session variable, Python cookie, or another class
> > attribute (result: Unpickleable error). We can use a volatile attribute
> > _v_ to store the instance temporarily, but not throughout the session.
> >
> > We have also tried to pass a string representation to pages and call
> > 'dbReturnDtml' to try and evaluate the string and put it in a command
> > line to execute. The command line is
> > 'dbCloseConn(<ZODB.Connection.Connection instance at 0xc098804>)' .
> > Using rexec.RExec r_exec gives us the following error:
> >
> >
> > Zope Error
> >
> > Zope has encountered an error while publishing this
> > resource.
> >
> > Error Type: SyntaxError
> > Error Value: invalid syntax (line 1)
> >
> >
> >
> > Troubleshooting Suggestions
> >
> > The URL may be incorrect.
> > The parameters passed to this resource may be
> > incorrect.
> > A resource that this resource relies on may be
> > encountering an error.
> >
> > For more detailed information about the error, please
> > refer to the HTML source for this page.
> >
> > If the error persists please contact the site maintainer.
> > Thank you for your patience.
> >
> >
> >
> >
> > Traceback (innermost last):
> > File /usr/local/Zope-2.5.1-src/lib/python/ZPublisher/Publish.py, line
> > 150, in publish_module
> > File /usr/local/Zope-2.5.1-src/lib/python/ZPublisher/Publish.py, line
> > 114, in publish
> > File /usr/local/Zope-2.5.1-src/lib/python/Zope/__init__.py, line 159,
> > in zpublisher_exception_hook
> > (Object: mcif)
> > File /usr/local/Zope-2.5.1-src/lib/python/ZPublisher/Publish.py, line
> > 98, in publish
> > File /usr/local/Zope-2.5.1-src/lib/python/ZPublisher/mapply.py, line
> > 88, in mapply
> > (Object: home2.html)
> > File /usr/local/Zope-2.5.1-src/lib/python/ZPublisher/Publish.py, line
> > 39, in call_object
> > (Object: home2.html)
> > File /usr/local/Zope-2.5.1-src/lib/python/OFS/DTMLDocument.py, line
> > 127, in __call__
> > (Object: home2.html)
> > File
> > /usr/local/Zope-2.5.1-src/lib/python/DocumentTemplate/DT_String.py, line
> > 473, in __call__
> > (Object: home2.html)
> > File /usr/local/Zope-2.5.1-src/lib/python/DocumentTemplate/DT_Let.py,
> > line 76, in render
> > (Object: strrobj="_['wrkaround']")
> > File /usr/local/Zope-2.5.1-src/lib/python/DocumentTemplate/DT_Let.py,
> > line 75, in render
> > (Object: robj="dbReturnDtml(strrobj)")
> > File /usr/local/Zope-2.5.1-src/lib/python/DocumentTemplate/DT_Util.py,
> > line 159, in eval
> > (Object: dbReturnDtml(strrobj))
> > (Info: dbReturnDtml)
> > File <string>, line 2, in f
> > File
> > /usr/local/Zope-2.5.1-src/lib/python/Products/ExternalMethod/ExternalMeth
> >o d.py, line 198, in __call__
> > (Object: dbReturnDtml)
> > (Info: (('<ZODB.Connection.Connection instance at 0xc098804>',), {},
> > None))
> > File /usr/local/Zope-2.5.1-src/Extensions/mcif_driver.py, line 42, in
> > dbReturnDtml
> > File /usr/local/lib/python2.1/rexec.py, line 264, in r_exec
> > SyntaxError: (see above)
> >
> >
> >
> >
> > Is there a way to get this to work or can anyone suggest a better way or
> > better yet, the right way? The Python external method code we are using
> > is provide below.
> >
> > Your input is much appreciated. Thank you in advance for your support!
> >
> >
> >
> >
> >
> > ##mcif_driver.py (Zope external methods source)##
> >
> > import os
> > import rexec
> > import modAccounts
> > import Globals
> > import string
> > from Products.PythonScripts.standard import DTML
> >
> > def dbOpenConn(fname='/usr/local/Zope-2.5.1-src/var/mcif.fs'):
> > manager = modAccounts.ManageMCIF()
> > print "Set connection to MCIF database"
> > conn = manager.conDatabase(fname)
> > print "Set!"
> > print "Set instances to MCIF database"
> > manager.iniInstances(conn)
> > print "Set!"
> > #manager.storeSession(conn)
> > return conn
> >
> >
> > def dbCloseConn(dbconObj,fname='/usr/local/Zope-2.5.1-src/var/mcif.fs'):
> > manager = modAccounts.ManageMCIF()
> > manager.cloDatabase(dbconObj,fname)
> > print "Connection closed successfully!!!"
> >
> >
> > def dbReturnDtml(objstr):
> >
> > myString = '<dtml-var expr="dbCloseConn(' + objstr +')">'
> > cmdline = eval("'dbCloseConn(' + objstr + ')'")
> > print eval("cmdline")
> > cotrll = rexec.RExec()
> > cotrll.r_exec(cmdline) #error occurs with r_exec
> > myDTML = DTML(myString)
> > return myDTML()
> >
> >
> > Marco Kinsley
> > Web Applications Developer
> > _____________________
> > Empire Corporate FCU
> > 1021 Watervliet-Shaker Rd
> > Albany NY 12205
> > (518) 292-3800/800-253-0053
> > e-mail: mkinsley@empirecorp.org
> >
> > NOTICE: This e-mail may contain confidential or legally privileged
> > information and is intended solely for delivery to the specific person
> > identified as the recipient. Any review, re-transmission, dissemination
> > or other use or taking of any action in reliance upon this e-mail by
> > persons other than the intended recipient is prohibited. If you receive
> > this e-mail in error, please contact us at (mkinsley@empirecorp.org) and
> > delete from your computer system, or otherwise from you records, the
> > information, which was transmitted to you in error.
>
> _______________________________________________
> Zope maillist - Zope@zope.org
> http://lists.zope.org/mailman/listinfo/zope
> ** No cross posts or HTML encoding! **
> (Related lists -
> http://lists.zope.org/mailman/listinfo/zope-announce
> http://lists.zope.org/mailman/listinfo/zope-dev )