Bug #66813 socket.error is handled correctly on python < 2.6
Submitted: 14 Sep 2012 8:20 Modified: 29 Oct 2012 20:28
Reporter: Christoph Thielecke Email Updates:
Status: Closed Impact on me:
None 
Category:Connector / Python Severity:S3 (Non-critical)
Version:1.0.5-b0 OS:Any
Assigned to: CPU Architecture:Any
Tags: exception, python2.5, socket error

[14 Sep 2012 8:20] Christoph Thielecke
Description:
socket.error is handled correctly on python < 2.6

<type 'exceptions.AttributeError'>, 'error' object has no attribute 'errno'
  File "/home/user/sql_func.py", line 824, in db_query
    c=cursor.execute(arg_query)

  File "/home/user/sql_func.py", line 824, in db_query
    c=cursor.execute(arg_query)

  File "/usr/lib/python2.5/site-packages/DBUtils-1.0-py2.5.egg/DBUtils/SteadyDB.py", line 450, in tough_method
    result = method(*args, **kwargs) # try to execute

  File "/usr/lib/python2.5/site-packages/DBUtils-1.0-py2.5.egg/DBUtils/SteadyDB.py", line 450, in tough_method
    result = method(*args, **kwargs) # try to execute

  File "/usr/lib/python2.5/site-packages/mysql/connector/cursor.py", line 392, in execute
    self._handle_result(self._connection.cmd_query(stmt))

  File "/usr/lib/python2.5/site-packages/mysql/connector/cursor.py", line 392, in execute
    self._handle_result(self._connection.cmd_query(stmt))

  File "/usr/lib/python2.5/site-packages/mysql/connector/connection.py", line 502, in cmd_query
    statement))

  File "/usr/lib/python2.5/site-packages/mysql/connector/connection.py", line 502, in cmd_query
    statement))

  File "/usr/lib/python2.5/site-packages/mysql/connector/connection.py", line 357, in _send_cmd
    return self._socket.recv()

  File "/usr/lib/python2.5/site-packages/mysql/connector/connection.py", line 357, in _send_cmd
    return self._socket.recv()

  File "/usr/lib/python2.5/site-packages/mysql/connector/network.py", line 183, in recv_plain
    values=(self.get_address(), err.errno))

  File "/usr/lib/python2.5/site-packages/mysql/connector/network.py", line 183, in recv_plain
    values=(self.get_address(), err.errno))

How to repeat:
broke socket connection during query.

Suggested fix:
Here is a patch which fixes the error.

--- python2/mysql/connector/network.py.orig     2012-09-14 09:40:32.000000000 +0200
+++ python2/mysql/connector/network.py  2012-09-14 09:47:13.000000000 +0200
@@ -179,8 +179,13 @@
         except socket.timeout, err:
             raise errors.InterfaceError(errno=2013)
         except socket.error, err:
+            try:
+                msg = err.errno
+            except AttributeError:
+                msg = err
             raise errors.InterfaceError(errno=2055,
-                                        values=(self.get_address(), err.errno))
+                                        values=(self.get_address(), msg))
+
     recv = recv_plain

     def _split_zipped_payload(self, packet_bunch):
@@ -225,8 +230,12 @@
         except socket.timeout, err:
             raise errors.InterfaceError(errno=2013)
         except socket.error, err:
+            try:
+                msg = err.errno
+            except AttributeError:
+                msg = err
             raise errors.InterfaceError(errno=2055,
-                                        values=(self.get_address(), e.errno))
+                                        values=(self.get_address(), msg))

         tmp = []
         for packet in packets:
[14 Sep 2012 20:28] Geert Vanderkelen
Thanks for the report, and patch!
There are, however, a few other things that needed to be corrected. Fix was queued yesterday.