[Zope-dev] Error 11
Matthew T. Kromer
matt@zope.com
Fri, 25 Jan 2002 17:12:07 -0500
This is a multi-part message in MIME format.
--------------030806060309060208060804
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Ahsan Imam wrote:
>Setting the variable did not help.
>I downloaded and built Python 2.1.2 yesterday.
>
>Products:
>zope-tinytable-0.8.2-2
>zope-zmysqlda-2.0.7-5
>
>>>>"Chris McDonough" <chrism@zope.com> 01/24/02 12:22 PM >>>
>>>>
>Sigh. Can you try to start Zope with the environment variable
>ZOPE_SECURITY_POLICY=PYTHON set to see if the problem continues?
>
>Are you using any database adapters or other C extensions?
>
>Are you sure that Zope is using the Python 2.1.2 that you installed?
>
Try applying this patch to db.py in ZMySQLDA.
It makes it so MySQLDA database connections reopen themselves when the
DA object migrates between threads.
--------------030806060309060208060804
Content-Type: text/plain;
name="db.py.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="db.py.diff"
--- ../ZMySQLDA-orig/db.py Thu Sep 6 23:45:35 2001
+++ db.py Tue Jan 8 14:24:52 2002
@@ -104,6 +104,7 @@
import string, sys
from string import strip, split, find, upper, rfind
from time import time
+import thread
hosed_connection = (
CR.SERVER_GONE_ERROR,
@@ -180,11 +181,12 @@
self.connection=connection
self.kwargs = kwargs = self._parse_connection_string(connection)
self.db=apply(self.Database_Connection, (), kwargs)
- self.transactions = self.db.server_capabilities & CLIENT.TRANSACTIONS
+ self.transactions = self.db.server_capabilities & CLIENT.TRANSACTIONS
if self._try_transactions == '-':
self.transactions = 0
elif not self.transactions and self._try_transactions == '+':
raise NotSupportedError, "transactions not supported by this server"
+ self._v_tid = thread.get_ident()
def _parse_connection_string(self, connection):
kwargs = {'conv': self.conv}
@@ -275,6 +277,10 @@
desc=None
result=()
db=self.db
+ # Because we might not be thread-safe across threads...
+ if not self._v_tid == thread.get_ident():
+ db=self.db=apply(self.Database_Connection, (), self.kwargs)
+ self._v_tid = thread.get_ident()
try:
for qs in filter(None, map(strip,split(query_string, '\0'))):
qtype = upper(split(qs, None, 1)[0])
@@ -297,7 +303,7 @@
except OperationalError, m:
if m[0] not in hosed_connection: raise
# Hm. maybe the db is hosed. Let's restart it.
- db=self.db=apply(self.Database_Connection, (), self.kwargs)
+ db=self.db=apply(self.Database_Connection, (), self.kwargs)
return self.query(query_string, max_rows)
if desc is None: return (),()
--------------030806060309060208060804--