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 as begin return 'Hello ' || who || '

Hello, ' || who || '!

'; end; 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: @cherrypy.expose def default(self, who="World"): cherrypy.response.headers["Content-Type"] = "text/html" return proc(who=who) cherrypy.quickstart(HelloWorld()) ==================================== 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.