HomePython softwarell.nightshade


Serving the output of Oracle functions/procedures with CherryPy

This module provides a class Call that allows you to use Oracle PL/SQL procedures/functions as CherryPy response handlers. A Call objects wraps a ll.orasql.Procedure or ll.orasql.Function object from the ll.orasql module.

For example, you might have the following PL/SQL function:

create or replace function helloworld
   who varchar2
return varchar2
   return '<html><head><h>Hello ' || who || '</h></head><body><h1>Hello, ' || who || '!</h1></body></html>';

Using this function as a CherryPy response handler can be done like this:

import cherrypy

from ll import orasql, nightshade

proc = nightshade.Call(orasql.Function("helloworld"), connectstring="user/pwd")

class HelloWorld:
   def default(self, who="World"):
      cherrypy.response.headers["Content-Type"] = "text/html"
      return proc(who=who)


class UTC​(datetime.tzinfo):

Timezone object for UTC

def utcoffset​(self, dt):

def dst​(self, dt):

def tzname​(self, dt):

def getnow​():

Get the current date and time as a datetime.datetime object in UTC with timezone info.

def httpdate​(dt):

Return a string suitable for a "Last-Modified" and "Expires" header.

dt is a datetime.datetime object. If :obj:`dt`.tzinfo is None dt is assumed to be in the local timezone (using the current UTC offset which might be different from the one used by dt).

class Connect​(object):

Connect objects can be used as decorators that wraps a function that needs a database connection.

If calling the wrapped function results in a database exception that has been caused by a lost connection to the database or similar problems, the function is retried with a new database connection.

def __init__​(self, connectstring=None, pool=None, retry=3, **kwargs):

Create a new parameterized Connect decorator. Either connectstring or pool (a database pool object) must be specified. retry specifies how often to retry calling the wrapped function after a database exception. kwargs will be passed on to the connect call.

def _isbadoracleexception​(self, exc):

def _getconnection​(self):

def _dropconnection​(self, connection):

def cursor​(self, **kwargs):

def commit​(self):

def rollback​(self):

def close​(self):

def cancel​(self):

def __call__​(self, func):

class Call​(object):

Wrap an Oracle procedure or function in a CherryPy handler.

A Call object wraps a procedure or function object from ll.orasql and makes it callable just like a CherryPy handler.

def __init__​(self, callable, connection):

Create a Call object wrapping the function or procedure callable.

def __call__​(self, *args, **kwargs):

Call the procedure/function with the arguments args and kwargs mapping Python function arguments to Oracle procedure/function arguments. On return from the procedure the c_out parameter is mapped to the CherryPy response body, and the parameters p_expires (the number of days from now), p_lastmodified (a date in UTC), p_mimetype (a string), p_encoding (a string), p_etag (a string) and p_cachecontrol (a string) are mapped to the appropriate CherryPy response headers. If p_etag is not specified a value is calculated.

If the procedure/function raised a PL/SQL exception with a code between 20200 and 20599, 20000 will be substracted from this value and the resulting value will be used as the HTTP response code, i.e. 20404 will give a "Not Found" response.

Alternate versions   Text   XIST   Python