Changeset 25:92dd76b85f76 in livinglogic.python.nightshade

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

Don't pass connections to the Call constructor, but connectstrings. Get
a connection for this connectstring and keep it. If calling the procedure
fails because of a lost connection, retry.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/ll/nightshade.py

    r24 r25  
    142142    callable just like a CherryPy handler. 
    143143    """ 
    144     def __init__(self, callable, pool=None, connection=None): 
     144    def __init__(self, callable, pool=None, connectstring=None): 
    145145        """ 
    146146        Create a <class>Call</class> object wrapping the function or procedure 
    147147        <arg>callable</arg>. 
    148148        """ 
    149         if (pool is not None) == (connection is not None): 
    150             raise TypeError("either pool or connection must be specified") 
     149        if (pool is not None) == (connectstring is not None): 
     150            raise TypeError("either pool or connectstring must be specified") 
    151151        self.callable = callable 
    152152        # Calculate parameter mapping now, so we don't get concurrency problems later 
    153         if pool is not None: 
    154             callable._calcargs(pool.acquire().cursor()) 
     153        cursor = self._cursor() 
     154        callable._calcargs(cursor) 
     155        self.pool = pool 
     156 
     157    def _cursor(self): 
     158        if self.pool is not None: 
     159            connection = self.pool.acquire() 
     160            cursor = connection.cursor() 
     161        elif self.connection is not None: 
     162            cursor = self.connection.cursor() 
    155163        else: 
    156             callable._calcargs(connection.cursor()) 
    157         self.pool = pool 
    158         self.connection = connection 
     164            self.connection = orasql.connect(self.connectstring) 
     165            cursor = self.connection.cursor() 
     166        return cursor 
    159167 
    160168    def _call(self, cursor, *args, **kwargs): 
     
    179187        try: 
    180188            if self.pool is not None: 
    181                 while 1: 
    182                     connection = self.pool.acquire() 
    183                     cursor = connection.cursor() 
     189                for i in xrange(10): 
    184190                    try: 
     191                        cursor = self._cursor() 
    185192                        (body, result) = self._call(cursor, *args, **kwargs) 
    186193                    except cx_Oracle.DatabaseError, exc: 
    187                         if "ORA-03114" in str(exc): 
     194                        strexc = str(exc) 
     195                        if ("ORA-03114" in strexc or "ORA-03135" in strexc) and i != 9: 
    188196                            # Drop dead connection and retry 
    189197                            self.pool.drop(connection) 
     
    193201                        break 
    194202            else: 
    195                 cursor = self.connection.cursor() 
    196                 (body, result) = self._call(cursor, *args, **kwargs) 
     203                for i in xrange(10): 
     204                    try: 
     205                        cursor = self._cursor() 
     206                        (body, result) = self._call(cursor, *args, **kwargs) 
     207                    except cx_Oracle.DatabaseError, exc: 
     208                        strexc = str(exc) 
     209                        if ("ORA-03114" in strexc or "ORA-03135" in strexc) and i != 9: 
     210                            self.connection = None # retry with new connection 
     211                        else: 
     212                            raise 
     213                    else: 
     214                        break 
    197215        except cx_Oracle.DatabaseError, exc: 
    198216            if exc.args: