From a94d14a5ffa8f1246b76ac4c978357f5fafe67ba Mon Sep 17 00:00:00 2001 From: Yoshinori Okuji <yo@nexedi.com> Date: Sat, 5 Apr 2008 17:11:48 +0000 Subject: [PATCH] Remove MySQL dependency from CMFActivity. Translate a lock error into ConflictError in database adapters instead. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@20317 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/CMFActivity/Activity/SQLBase.py | 13 +++++-------- product/ZMySQLDA/db.py | 8 ++++++++ product/ZMySQLDDA/db.py | 8 ++++++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/product/CMFActivity/Activity/SQLBase.py b/product/CMFActivity/Activity/SQLBase.py index 54efc110c8..65d520cdc2 100644 --- a/product/CMFActivity/Activity/SQLBase.py +++ b/product/CMFActivity/Activity/SQLBase.py @@ -26,9 +26,8 @@ # ############################################################################## -from _mysql_exceptions import OperationalError -from MySQLdb.constants import ER from zLOG import LOG, INFO +from ZODB.POSException import ConflictError class SQLBase: """ @@ -60,12 +59,10 @@ class SQLBase: while True: try: result = method(*args, **kw) - except OperationalError, value: - if isinstance(value, OperationalError) and \ - value[0] in (ER.LOCK_WAIT_TIMEOUT, ER.LOCK_DEADLOCK): - LOG('SQLBase', INFO, 'Got a lock error, retrying...') - else: - raise + except ConflictError: + # Note that this code assumes that a database adapter translates + # a lock error into a conflict error. + LOG('SQLBase', INFO, 'Got a lock error, retrying...') else: break return result diff --git a/product/ZMySQLDA/db.py b/product/ZMySQLDA/db.py index a504f70e7f..cb499f1815 100644 --- a/product/ZMySQLDA/db.py +++ b/product/ZMySQLDA/db.py @@ -102,6 +102,7 @@ from MySQLdb.constants import FIELD_TYPE, CR, ER, CLIENT from Shared.DC.ZRDB.TM import TM from DateTime import DateTime from zLOG import LOG, ERROR, INFO +from ZODB.POSException import ConflictError import string, sys from string import strip, split, find, upper, rfind @@ -117,6 +118,11 @@ query_syntax_error = ( ER.BAD_FIELD_ERROR, ) +lock_error = ( + ER.LOCK_WAIT_TIMEOUT, + ER.LOCK_DEADLOCK, + ) + key_types = { "PRI": "PRIMARY KEY", "MUL": "INDEX", @@ -388,6 +394,8 @@ class DB(TM): except OperationalError, m: if m[0] in query_syntax_error: raise OperationalError(m[0], '%s: %s' % (m[1], query)) + if m[0] in lock_error: + raise ConflictError('%s: %s: %s' % (m[0], m[1], query)) if ((not force_reconnect) and \ (self._mysql_lock or self._transactions)) or \ m[0] not in hosed_connection: diff --git a/product/ZMySQLDDA/db.py b/product/ZMySQLDDA/db.py index 81131c9eed..6ca03eac33 100644 --- a/product/ZMySQLDDA/db.py +++ b/product/ZMySQLDDA/db.py @@ -100,6 +100,7 @@ from MySQLdb.constants import FIELD_TYPE, CR, ER, CLIENT from Shared.DC.ZRDB.TM import TM from DateTime import DateTime from zLOG import LOG, ERROR, INFO +from ZODB.POSException import ConflictError import string, sys from string import strip, split, find, upper, rfind @@ -115,6 +116,11 @@ query_syntax_error = ( ER.BAD_FIELD_ERROR, ) +lock_error = ( + ER.LOCK_WAIT_TIMEOUT, + ER.LOCK_DEADLOCK, + ) + key_types = { "PRI": "PRIMARY KEY", "MUL": "INDEX", @@ -393,6 +399,8 @@ class DeferredDB(TM): except OperationalError, m: if m[0] in query_syntax_error: raise OperationalError(m[0], '%s: %s' % (m[1], query)) + if m[0] in lock_error: + raise ConflictError('%s: %s: %s' % (m[0], m[1], query)) if ((not force_reconnect) and \ (self._mysql_lock or self._transactions)) or \ m[0] not in hosed_connection: -- 2.30.9