[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