Example #1
0
 def _executeRetry(self, conn, cursor, query):
     if self.debug:
         self.printDebug(conn, query, 'QueryR')
     dbEncoding = self.dbEncoding
     if dbEncoding and not isinstance(query, bytes) and (
             self.driver in ('connector', 'oursql')):
         query = query.encode(dbEncoding, 'surrogateescape')
     # When a server connection is lost and a query is attempted, most of
     # the time the query will raise a SERVER_LOST exception, then at the
     # second attempt to execute it, the mysql lib will reconnect and
     # succeed. However is a few cases, the first attempt raises the
     # SERVER_GONE exception, the second attempt the SERVER_LOST exception
     # and only the third succeeds. Thus the 3 in the loop count.
     # If it doesn't reconnect even after 3 attempts, while the database is
     # up and running, it is because a 5.0.3 (or newer) server is used
     # which no longer permits autoreconnects by default. In that case a
     # reconnect flag must be set when making the connection to indicate
     # that autoreconnecting is desired. In MySQLdb 1.2.2 or newer this is
     # done by calling ping(True) on the connection.
     # PyMySQL needs explicit reconnect
     # each time we detect connection timeout.
     for count in range(3):
         try:
             return cursor.execute(query)
         except self.module.OperationalError as e:
             if e.args[0] in (self.CR_SERVER_GONE_ERROR,
                              self.CR_SERVER_LOST):
                 if count == 2:
                     raise dberrors.OperationalError(ErrorMessage(e))
                 if self.debug:
                     self.printDebug(conn, str(e), 'ERROR')
                 if self.driver.lower() == 'pymysql':
                     self._force_reconnect(conn)
             else:
                 raise dberrors.OperationalError(ErrorMessage(e))
         except self.module.IntegrityError as e:
             msg = ErrorMessage(e)
             if e.args[0] == self.ER_DUP_ENTRY:
                 raise dberrors.DuplicateEntryError(msg)
             else:
                 raise dberrors.IntegrityError(msg)
         except self.module.InternalError as e:
             raise dberrors.InternalError(ErrorMessage(e))
         except self.module.ProgrammingError as e:
             if e.args[0] is not None:
                 raise dberrors.ProgrammingError(ErrorMessage(e))
         except self.module.DataError as e:
             raise dberrors.DataError(ErrorMessage(e))
         except self.module.NotSupportedError as e:
             raise dberrors.NotSupportedError(ErrorMessage(e))
         except self.module.DatabaseError as e:
             raise dberrors.DatabaseError(ErrorMessage(e))
         except self.module.InterfaceError as e:
             raise dberrors.InterfaceError(ErrorMessage(e))
         except self.module.Warning as e:
             raise Warning(ErrorMessage(e))
         except self.module.Error as e:
             raise dberrors.Error(ErrorMessage(e))
Example #2
0
    def makeConnection(self):
        try:
            if self.driver in ('odbc', 'pyodbc', 'pypyodbc'):
                self.debugWriter.write(
                    "ODBC connect string: " + self.odbc_conn_str)
                conn = self.module.connect(self.odbc_conn_str)
            elif self.use_dsn:
                conn = self.module.connect(self.dsn)
            else:
                conn = self.module.connect(**self.dsn_dict)
        except self.module.OperationalError as e:
            raise dberrors.OperationalError(
                ErrorMessage(e, "used connection string %r" % self.dsn))

        # For printDebug in _executeRetry
        self._connectionNumbers[id(conn)] = self._connectionCount

        if self.autoCommit:
            self._setAutoCommit(conn, 1)
        c = conn.cursor()
        if self.schema:
            self._executeRetry(conn, c, "SET search_path TO " + self.schema)
        dbEncoding = self.dbEncoding
        if dbEncoding:
            if self.driver in ('odbc', 'pyodbc'):
                conn.setdecoding(self.module.SQL_CHAR, encoding=dbEncoding)
                conn.setdecoding(self.module.SQL_WCHAR, encoding=dbEncoding)
                if PY2:
                    conn.setencoding(str, encoding=dbEncoding)
                    conn.setencoding(unicode, encoding=dbEncoding)  # noqa
                else:
                    conn.setencoding(encoding=dbEncoding)
            self._executeRetry(conn, c,
                               "SET client_encoding TO '%s'" % dbEncoding)
        return conn
Example #3
0
 def _executeRetry(self, conn, cursor, query):
     if self.debug:
         self.printDebug(conn, query, 'QueryR')
     try:
         return cursor.execute(query)
     except self.module.OperationalError as e:
         raise dberrors.OperationalError(ErrorMessage(e))
     except self.module.IntegrityError as e:
         msg = ErrorMessage(e)
         if e.pgcode == '23505':
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.IntegrityError(msg)
     except self.module.InternalError as e:
         raise dberrors.InternalError(ErrorMessage(e))
     except self.module.ProgrammingError as e:
         raise dberrors.ProgrammingError(ErrorMessage(e))
     except self.module.DataError as e:
         raise dberrors.DataError(ErrorMessage(e))
     except self.module.NotSupportedError as e:
         raise dberrors.NotSupportedError(ErrorMessage(e))
     except self.module.DatabaseError as e:
         raise dberrors.DatabaseError(ErrorMessage(e))
     except self.module.InterfaceError as e:
         raise dberrors.InterfaceError(ErrorMessage(e))
     except self.module.Warning as e:
         raise Warning(ErrorMessage(e))
     except self.module.Error as e:
         raise dberrors.Error(ErrorMessage(e))
Example #4
0
 def _executeRetry(self, conn, cursor, query):
     if self.debug:
         self.printDebug(conn, query, 'QueryR')
     try:
         return cursor.execute(query)
     except self.module.OperationalError as e:
         raise dberrors.OperationalError(ErrorMessage(e))
     except self.module.IntegrityError as e:
         msg = ErrorMessage(e)
         if msg.startswith('column') and msg.endswith('not unique') \
                 or msg.startswith('UNIQUE constraint failed:'):
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.IntegrityError(msg)
     except self.module.InternalError as e:
         raise dberrors.InternalError(ErrorMessage(e))
     except self.module.ProgrammingError as e:
         raise dberrors.ProgrammingError(ErrorMessage(e))
     except self.module.DataError as e:
         raise dberrors.DataError(ErrorMessage(e))
     except self.module.NotSupportedError as e:
         raise dberrors.NotSupportedError(ErrorMessage(e))
     except self.module.DatabaseError as e:
         raise dberrors.DatabaseError(ErrorMessage(e))
     except self.module.InterfaceError as e:
         raise dberrors.InterfaceError(ErrorMessage(e))
     except self.module.Warning as e:
         raise Warning(ErrorMessage(e))
     except self.module.Error as e:
         raise dberrors.Error(ErrorMessage(e))
 def _executeRetry(self, conn, cursor, query):
     # When a server connection is lost and a query is attempted, most of
     # the time the query will raise a SERVER_LOST exception, then at the
     # second attempt to execute it, the mysql lib will reconnect and
     # succeed. However is a few cases, the first attempt raises the
     # SERVER_GONE exception, the second attempt the SERVER_LOST exception
     # and only the third succeeds. Thus the 3 in the loop count.
     # If it doesn't reconnect even after 3 attempts, while the database is
     # up and running, it is because a 5.0.3 (or newer) server is used
     # which no longer permits autoreconnects by default. In that case a
     # reconnect flag must be set when making the connection to indicate
     # that autoreconnecting is desired. In MySQLdb 1.2.2 or newer this is
     # done by calling ping(True) on the connection.
     for count in range(3):
         try:
             return cursor.execute(query)
         except self.module.OperationalError as e:
             if e.args[0] in (self.module.constants.CR.SERVER_GONE_ERROR,
                              self.module.constants.CR.SERVER_LOST):
                 if count == 2:
                     raise dberrors.OperationalError(ErrorMessage(e))
                 if self.debug:
                     self.printDebug(conn, str(e), 'ERROR')
             else:
                 raise dberrors.OperationalError(ErrorMessage(e))
         except self.module.IntegrityError as e:
             msg = ErrorMessage(e)
             if e.args[0] == self.module.constants.ER.DUP_ENTRY:
                 raise dberrors.DuplicateEntryError(msg)
             else:
                 raise dberrors.IntegrityError(msg)
         except self.module.InternalError as e:
             raise dberrors.InternalError(ErrorMessage(e))
         except self.module.ProgrammingError as e:
             raise dberrors.ProgrammingError(ErrorMessage(e))
         except self.module.DataError as e:
             raise dberrors.DataError(ErrorMessage(e))
         except self.module.NotSupportedError as e:
             raise dberrors.NotSupportedError(ErrorMessage(e))
         except self.module.DatabaseError as e:
             raise dberrors.DatabaseError(ErrorMessage(e))
         except self.module.InterfaceError as e:
             raise dberrors.InterfaceError(ErrorMessage(e))
         except self.module.Warning as e:
             raise Warning(ErrorMessage(e))
         except self.module.Error as e:
             raise dberrors.Error(ErrorMessage(e))
Example #6
0
    def makeConnection(self):
        dbEncoding = self.dbEncoding
        if dbEncoding:
            if self.driver.lower() in ('mysqldb', 'pymysql'):
                from MySQLdb.connections import Connection
                if not hasattr(Connection, 'set_character_set'):
                    # monkeypatch pre MySQLdb 1.2.1
                    def character_set_name(self):
                        return dbEncoding + '_' + dbEncoding

                    Connection.character_set_name = character_set_name
        if self.driver == 'connector':
            self.kw['consume_results'] = True
        try:
            if self.driver in ('odbc', 'pyodbc', 'pypyodbc'):
                self.debugWriter.write("ODBC connect string: " +
                                       self.odbc_conn_str)
                conn = self.module.connect(self.odbc_conn_str)
            else:
                conn = self.module.connect(host=self.host,
                                           port=self.port,
                                           db=self.db,
                                           user=self.user,
                                           passwd=self.password,
                                           **self.kw)
                if self.driver != 'oursql':
                    # Attempt to reconnect. This setting is persistent.
                    conn.ping(True)
        except self.module.OperationalError as e:
            conninfo = ("; used connection string: "
                        "host=%(host)s, port=%(port)s, "
                        "db=%(db)s, user=%(user)s" % self.__dict__)
            raise dberrors.OperationalError(ErrorMessage(e, conninfo))

        self._setAutoCommit(conn, bool(self.autoCommit))

        if dbEncoding:
            if self.driver in ('odbc', 'pyodbc'):
                conn.setdecoding(self.module.SQL_CHAR, encoding=dbEncoding)
                conn.setdecoding(self.module.SQL_WCHAR, encoding=dbEncoding)
                if PY2:
                    conn.setencoding(str, encoding=dbEncoding)
                    conn.setencoding(unicode, encoding=dbEncoding)  # noqa
                else:
                    conn.setencoding(encoding=dbEncoding)
            elif hasattr(conn, 'set_character_set'):
                conn.set_character_set(dbEncoding)
            elif self.driver == 'oursql':
                conn.charset = dbEncoding
            elif hasattr(conn, 'query'):
                # works along with monkeypatching code above
                conn.query("SET NAMES %s" % dbEncoding)

        return conn
Example #7
0
 def _executeRetry(self, conn, cursor, query):
     if self.debug:
         self.printDebug(conn, query, 'QueryR')
     dbEncoding = self.dbEncoding
     if dbEncoding and isinstance(query, bytes) and (
             self.driver == 'pg8000'):
         query = query.decode(dbEncoding)
     try:
         return cursor.execute(query)
     except self.module.OperationalError as e:
         raise dberrors.OperationalError(ErrorMessage(e))
     except self.module.IntegrityError as e:
         msg = ErrorMessage(e)
         if getattr(e, 'code', -1) == '23505' or \
                 getattr(e, 'pgcode', -1) == '23505' or \
                 getattr(e, 'sqlstate', -1) == '23505' or \
                 e.args[0] == '23505':
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.IntegrityError(msg)
     except self.module.InternalError as e:
         raise dberrors.InternalError(ErrorMessage(e))
     except self.module.ProgrammingError as e:
         msg = ErrorMessage(e)
         if (
             (len(e.args) > 2) and (e.args[1] == 'ERROR')
             and (e.args[2] == '23505')) \
                 or ((len(e.args) >= 2) and (e.args[1] == '23505')):
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.ProgrammingError(msg)
     except self.module.DataError as e:
         raise dberrors.DataError(ErrorMessage(e))
     except self.module.NotSupportedError as e:
         raise dberrors.NotSupportedError(ErrorMessage(e))
     except self.module.DatabaseError as e:
         msg = ErrorMessage(e)
         if 'duplicate key value violates unique constraint' in msg:
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.DatabaseError(msg)
     except self.module.InterfaceError as e:
         raise dberrors.InterfaceError(ErrorMessage(e))
     except self.module.Warning as e:
         raise Warning(ErrorMessage(e))
     except self.module.Error as e:
         raise dberrors.Error(ErrorMessage(e))
Example #8
0
 def _executeRetry(self, conn, cursor, query):
     if self.debug:
         self.printDebug(conn, query, 'QueryR')
     try:
         return cursor.execute(query)
     except self.module.OperationalError as e:
         raise dberrors.OperationalError(ErrorMessage(e))
     except self.module.IntegrityError as e:
         msg = ErrorMessage(e)
         if getattr(e, 'code', -1) == '23505' or \
                 getattr(e, 'pgcode', -1) == '23505' or \
                 getattr(e, 'sqlstate', -1) == '23505':
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.IntegrityError(msg)
     except self.module.InternalError as e:
         raise dberrors.InternalError(ErrorMessage(e))
     except self.module.ProgrammingError as e:
         msg = ErrorMessage(e)
         if (len(e.args) >= 2) and e.args[1] == '23505':
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.ProgrammingError(msg)
     except self.module.DataError as e:
         raise dberrors.DataError(ErrorMessage(e))
     except self.module.NotSupportedError as e:
         raise dberrors.NotSupportedError(ErrorMessage(e))
     except self.module.DatabaseError as e:
         msg = ErrorMessage(e)
         if 'duplicate key value violates unique constraint' in msg:
             raise dberrors.DuplicateEntryError(msg)
         else:
             raise dberrors.DatabaseError(msg)
     except self.module.InterfaceError as e:
         raise dberrors.InterfaceError(ErrorMessage(e))
     except self.module.Warning as e:
         raise Warning(ErrorMessage(e))
     except self.module.Error as e:
         raise dberrors.Error(ErrorMessage(e))
Example #9
0
    def makeConnection(self):
        try:
            if self.use_dsn:
                conn = self.module.connect(self.dsn)
            else:
                conn = self.module.connect(**self.dsn_dict)
        except self.module.OperationalError as e:
            raise dberrors.OperationalError(
                ErrorMessage(e, "used connection string %r" % self.dsn))

        # For printDebug in _executeRetry
        self._connectionNumbers[id(conn)] = self._connectionCount

        if self.autoCommit:
            self._setAutoCommit(conn, 1)
        c = conn.cursor()
        if self.schema:
            self._executeRetry(conn, c, "SET search_path TO " + self.schema)
        dbEncoding = self.dbEncoding
        if dbEncoding:
            self._executeRetry(conn, c,
                               "SET client_encoding TO '%s'" % dbEncoding)
        return conn
    def makeConnection(self):
        dbEncoding = self.dbEncoding
        if dbEncoding:
            from MySQLdb.connections import Connection
            if not hasattr(Connection, 'set_character_set'):
                # monkeypatch pre MySQLdb 1.2.1
                def character_set_name(self):
                    return dbEncoding + '_' + dbEncoding

                Connection.character_set_name = character_set_name
        try:
            conn = self.module.connect(host=self.host,
                                       port=self.port,
                                       db=self.db,
                                       user=self.user,
                                       passwd=self.password,
                                       **self.kw)
            if self.module.version_info[:3] >= (1, 2, 2):
                # Attempt to reconnect. This setting is persistent.
                conn.ping(True)
        except self.module.OperationalError as e:
            conninfo = ("; used connection string: "
                        "host=%(host)s, port=%(port)s, "
                        "db=%(db)s, user=%(user)s" % self.__dict__)
            raise dberrors.OperationalError(ErrorMessage(e, conninfo))

        if hasattr(conn, 'autocommit'):
            conn.autocommit(bool(self.autoCommit))

        if dbEncoding:
            if hasattr(conn, 'set_character_set'):  # MySQLdb 1.2.1 and later
                conn.set_character_set(dbEncoding)
            else:  # pre MySQLdb 1.2.1
                # works along with monkeypatching code above
                conn.query("SET NAMES %s" % dbEncoding)

        return conn