Changeset 22:7eb45967ca2b in livinglogic.python.nightshade

Show
Ignore:
Timestamp:
09/06/06 19:46:58 (13 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Update to newest orasql version.

Rename Procedure to Call and enable wrapping orasql.Function objects.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • setup.py

    r21 r22  
    4848args = dict( 
    4949    name="ll-nightshade", 
    50     version="0.4", 
     50    version="0.5", 
    5151    description="Serve the output of TOXIC functions/procedures with CherryPy", 
    5252    long_description=DESCRIPTION, 
  • src/ll/nightshade.py

    r21 r22  
    131131 
    132132 
    133 class Procedure(object): 
    134     """ 
    135     <par>Wrap an Oracle procedure in a CherryPy handler.</par> 
    136  
    137     <par><class>Procedure</class> object wraps a procedure object from 
     133class Call(object): 
     134    """ 
     135    <par>Wrap an Oracle procedure or function in a CherryPy handler.</par> 
     136 
     137    <par><class>Call</class> object wraps a procedure or function object from 
    138138    <pyref module="ll.orasql"><module>ll.orasql</module></pyref> and make it 
    139139    callable just like a CherryPy handler. 
    140140    """ 
    141     def __init__(self, proc, pool=None, connection=None): 
    142         """ 
    143         Create a  
     141    def __init__(self, callable, pool=None, connection=None): 
     142        """ 
     143        Create a <class>Call</class> object wrapping the function or procedure 
     144        <arg>callable</arg>. 
    144145        """ 
    145146        if (pool is not None) == (connection is not None): 
    146147            raise TypeError("either pool or connection must be specified") 
    147         self.proc = proc 
     148        self.callable = callable 
    148149        # Calculate parameter mapping now, so we don't get concurrency problems later 
    149150        if pool is not None: 
    150             proc._calargs(pool.acquire().cursor()) 
     151            callable._calcargs(pool.acquire().cursor()) 
    151152        else: 
    152             proc._calcargs(connection.cursor()) 
     153            callable._calcargs(connection.cursor()) 
    153154        self.pool = pool 
    154155        self.connection = connection 
    155156 
     157    def _call(self, cursor, *args, **kwargs): 
     158        if isinstance(self.callable, orasql.Procedure): 
     159            return (None, self.callable(cursor, *args, **kwargs)) 
     160        else: 
     161            return self.callable(cursor, *args, **kwargs) 
     162 
    156163    def __call__(self, *args, **kwargs): 
    157164        """ 
    158         Call the procedure with the arguments <arg>args</arg> and <arg>kwargs</arg> 
    159         mapping Python function arguments to Oracle procedure arguments. On return 
    160         from the procedure the <lit>out</lit> parameter is mapped to the CherryPy 
    161         response body, and the parameters <lit>expires</lit> (the number of days 
    162         from now), <lit>lastmodified</lit> (a date in UTV), <lit>mimetype</lit> 
    163         (a string), <lit>encoding</lit> (a string) and <lit>etag</lit> (a string) 
    164         are mapped to the appropriate CherryPy response headers. If <lit>etag</lit> 
    165         is not specified a value is calculated. 
     165        Call the procedure/function with the arguments <arg>args</arg> and 
     166        <arg>kwargs</arg> mapping Python function arguments to Oracle procedure/function 
     167        arguments. On return from the procedure the <lit>out</lit> parameter is 
     168        mapped to the CherryPy response body, and the parameters <lit>expires</lit> 
     169        (the number of days from now), <lit>lastmodified</lit> (a date in UTV), 
     170        <lit>mimetype</lit> (a string), <lit>encoding</lit> (a string) and 
     171        <lit>etag</lit> (a string) are mapped to the appropriate CherryPy response 
     172        headers. If <lit>etag</lit> is not specified a value is calculated. 
    166173        """ 
    167174         
     
    173180                    cursor = connection.cursor() 
    174181                    try: 
    175                         result = self.proc(cursor, *args, **kwargs) 
     182                        (body, result) = self._call(cursor, *args, **kwargs) 
    176183                    except cx_Oracle.DatabaseError, exc: 
    177184                        if "ORA-03114" in str(exc): 
     
    184191            else: 
    185192                cursor = self.connection.cursor() 
    186                 result = self.proc(cursor, *args, **kwargs) 
     193                (body, result) = self._call(cursor, *args, **kwargs) 
    187194        except cx_Oracle.DatabaseError, exc: 
    188195            if exc.args: 
     
    194201 
    195202        # Set HTTP headers from parameters 
    196         expires = result.get("expires", None) 
     203        expires = result.get("p_expires", None) 
    197204        if expires is not None: 
    198205            cherrypy.response.headers["Expires"] = httpdate(now + datetime.timedelta(days=expires)) 
    199         lastmodified = result.get("lastmodified", None) 
     206        lastmodified = result.get("p_lastmodified", None) 
    200207        if lastmodified is not None: 
    201208            cherrypy.response.headers["Last-Modified"] = httpdate(lastmodified) 
    202         mimetype = result.get("mimetype", None) 
     209        mimetype = result.get("p_mimetype", None) 
    203210        if mimetype is not None: 
    204             encoding = result.get("encoding", None) 
     211            encoding = result.get("p_encoding", None) 
    205212            if encoding is not None: 
    206213                cherrypy.response.headers["Content-Type"] = "%s; charset=%s" % (mimetype, encoding) 
     
    208215                cherrypy.response.headers["Content-Type"] = mimetype 
    209216        hasetag = False 
    210         etag = result.get("etag", None) 
     217        etag = result.get("p_etag", None) 
    211218        if etag is not None: 
    212219            cherrypy.response.headers["ETag"] = etag 
     
    214221 
    215222        # Get status code 
    216         status = result.get("status", None) 
     223        status = result.get("p_status", None) 
    217224        if status is not None: 
    218225            cherrypy.response.status = status 
    219226 
    220227        # Get response body 
    221         if "out" in result: 
    222             result = result.out 
     228        if "c_out" in result: 
     229            body = result.out 
    223230            if hasattr(result, "read"): 
    224231                result = result.read() 
    225232            if not hasetag: 
    226                 cherrypy.response.headers["ETag"] = '"%x"' % hash(result) 
    227  
    228         return result 
     233                cherrypy.response.headers["ETag"] = '"%x"' % hash(body) 
     234 
     235        return body