[Checkins] SVN: relstorage/trunk/ Auto reconnect to Oracle sometimes did not work because cx_Oracle was

Shane Hathaway shane at hathawaymix.org
Mon Feb 2 13:39:51 EST 2009


Log message for revision 95990:
  Auto reconnect to Oracle sometimes did not work because cx_Oracle was
  raising a different kind of exception than expected.  Fixed.
  

Changed:
  U   relstorage/trunk/CHANGES.txt
  U   relstorage/trunk/relstorage/adapters/mysql.py
  U   relstorage/trunk/relstorage/adapters/oracle.py
  U   relstorage/trunk/relstorage/adapters/postgresql.py

-=-
Modified: relstorage/trunk/CHANGES.txt
===================================================================
--- relstorage/trunk/CHANGES.txt	2009-02-02 17:09:24 UTC (rev 95989)
+++ relstorage/trunk/CHANGES.txt	2009-02-02 18:39:50 UTC (rev 95990)
@@ -5,7 +5,10 @@
 - In rare circumstances, ZODB can legitimately commit an object twice in a
   single transaction.  Fixed RelStorage to accept that.
 
+- Auto reconnect to Oracle sometimes did not work because cx_Oracle was
+  raising a different kind of exception than expected.  Fixed.
 
+
 Version 1.1.2 (2009-01-27)
 --------------------------
 

Modified: relstorage/trunk/relstorage/adapters/mysql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/mysql.py	2009-02-02 17:09:24 UTC (rev 95989)
+++ relstorage/trunk/relstorage/adapters/mysql.py	2009-02-02 18:39:50 UTC (rev 95990)
@@ -59,7 +59,15 @@
 
 commit_lock_timeout = 30
 
+# disconnected_exceptions contains the exception types that might be
+# raised when the connection to the database has been broken.
+disconnected_exceptions = (MySQLdb.OperationalError, MySQLdb.InterfaceError)
 
+# close_exceptions contains the exception types to ignore
+# when the adapter attempts to close a database connection.
+close_exceptions = disconnected_exceptions + (MySQLdb.ProgrammingError,)
+
+
 class MySQLAdapter(Adapter):
     """MySQL adapter for RelStorage."""
 
@@ -290,9 +298,7 @@
             if obj is not None:
                 try:
                     obj.close()
-                except (MySQLdb.InterfaceError,
-                        MySQLdb.OperationalError,
-                        MySQLdb.ProgrammingError):
+                except close_exceptions:
                     pass
 
     def open_for_load(self):
@@ -306,7 +312,7 @@
         """Reinitialize a connection for loading objects."""
         try:
             cursor.connection.rollback()
-        except (MySQLdb.OperationalError, MySQLdb.InterfaceError), e:
+        except disconnected_exceptions, e:
             raise StorageError(e)
 
     def get_object_count(self):
@@ -458,7 +464,7 @@
         try:
             cursor.connection.rollback()
             self._restart_temp_table(cursor)
-        except (MySQLdb.OperationalError, MySQLdb.InterfaceError), e:
+        except disconnected_exceptions, e:
             raise StorageError(e)
 
     def store_temp(self, cursor, oid, prev_tid, md5sum, data):

Modified: relstorage/trunk/relstorage/adapters/oracle.py
===================================================================
--- relstorage/trunk/relstorage/adapters/oracle.py	2009-02-02 17:09:24 UTC (rev 95989)
+++ relstorage/trunk/relstorage/adapters/oracle.py	2009-02-02 18:39:50 UTC (rev 95990)
@@ -24,6 +24,11 @@
 
 log = logging.getLogger("relstorage.adapters.oracle")
 
+# disconnected_exceptions contains the exception types that might be
+# raised when the connection to the database has been broken.
+disconnected_exceptions = (cx_Oracle.OperationalError,
+    cx_Oracle.InterfaceError, cx_Oracle.DatabaseError)
+
 def lob_handler(cursor, name, defaultType, size, precision, scale):
     """cx_Oracle outputtypehandler that causes Oracle to send BLOBs inline.
 
@@ -334,8 +339,7 @@
             if obj is not None:
                 try:
                     obj.close()
-                except (cx_Oracle.InterfaceError,
-                        cx_Oracle.OperationalError):
+                except disconnected_exceptions:
                     pass
 
     def open_for_load(self):
@@ -350,7 +354,7 @@
         try:
             cursor.connection.rollback()
             cursor.execute("SET TRANSACTION READ ONLY")
-        except (cx_Oracle.OperationalError, cx_Oracle.InterfaceError), e:
+        except disconnected_exceptions, e:
             raise StorageError(e)
 
     def get_object_count(self):
@@ -531,7 +535,7 @@
             cursor.connection.rollback()
             if self._twophase:
                 self._set_xid(cursor)
-        except (cx_Oracle.OperationalError, cx_Oracle.InterfaceError), e:
+        except disconnected_exceptions, e:
             raise StorageError(e)
 
     def store_temp(self, cursor, oid, prev_tid, md5sum, data):

Modified: relstorage/trunk/relstorage/adapters/postgresql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/postgresql.py	2009-02-02 17:09:24 UTC (rev 95989)
+++ relstorage/trunk/relstorage/adapters/postgresql.py	2009-02-02 18:39:50 UTC (rev 95990)
@@ -23,7 +23,11 @@
 
 log = logging.getLogger("relstorage.adapters.postgresql")
 
+# disconnected_exceptions contains the exception types that might be
+# raised when the connection to the database has been broken.
+disconnected_exceptions = (psycopg2.OperationalError, psycopg2.InterfaceError)
 
+
 class PostgreSQLAdapter(Adapter):
     """PostgreSQL adapter for RelStorage."""
 
@@ -202,8 +206,7 @@
             if obj is not None:
                 try:
                     obj.close()
-                except (psycopg2.InterfaceError,
-                        psycopg2.OperationalError):
+                except disconnected_exceptions:
                     pass
 
     def _pg_version(self, cursor):
@@ -241,7 +244,7 @@
         """Reinitialize a connection for loading objects."""
         try:
             cursor.connection.rollback()
-        except (psycopg2.OperationalError, psycopg2.InterfaceError), e:
+        except disconnected_exceptions, e:
             raise StorageError(e)
 
     def get_object_count(self):
@@ -409,7 +412,7 @@
                 cursor.connection.set_isolation_level(
                     psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED)
             self._make_temp_table(cursor)
-        except (psycopg2.OperationalError, psycopg2.InterfaceError), e:
+        except disconnected_exceptions, e:
             raise StorageError(e)
 
     def store_temp(self, cursor, oid, prev_tid, md5sum, data):



More information about the Checkins mailing list