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