449 args = self.merge_args(args, qargs) |
449 args = self.merge_args(args, qargs) |
450 assert isinstance(sql, basestring), repr(sql) |
450 assert isinstance(sql, basestring), repr(sql) |
451 try: |
451 try: |
452 cursor = self.doexec(session, sql, args) |
452 cursor = self.doexec(session, sql, args) |
453 except (self.OperationalError, self.InterfaceError): |
453 except (self.OperationalError, self.InterfaceError): |
|
454 if session.mode == 'write': |
|
455 # do not attempt to reconnect if there has been some write |
|
456 # during the transaction |
|
457 raise |
454 # FIXME: better detection of deconnection pb |
458 # FIXME: better detection of deconnection pb |
455 self.warning("trying to reconnect") |
459 self.warning("trying to reconnect") |
456 session.pool.reconnect(self) |
460 session.pool.reconnect(self) |
457 cursor = self.doexec(session, sql, args) |
461 cursor = self.doexec(session, sql, args) |
458 except (self.DbapiError,), exc: |
462 except (self.DbapiError,), exc: |
459 # We get this one with pyodbc and SQL Server when connection was reset |
463 # We get this one with pyodbc and SQL Server when connection was reset |
460 if exc.args[0] == '08S01': |
464 if exc.args[0] == '08S01' and session.mode != 'write': |
461 self.warning("trying to reconnect") |
465 self.warning("trying to reconnect") |
462 session.pool.reconnect(self) |
466 session.pool.reconnect(self) |
463 cursor = self.doexec(session, sql, args) |
467 cursor = self.doexec(session, sql, args) |
464 else: |
468 else: |
465 raise |
469 raise |