Beispiel #1
0
 def __str__(self):
     return str({
         'header': {
             'length': self.length,
             'seq': self.seq
         },
         'type': getConstName(COMMANDS, self.type.value),
         'vars': self.__dict__
     })
Beispiel #2
0
    def handle(self):
        """
        Handle new incoming connections
        :return:
        """
        log.info('handle new incoming connection')
        if self.handshake() is False:
            return

        while True:
            log.debug('Got a new packet')
            p = self.packet(CommandPacket)

            try:
                success = p.get()
            except Exception:
                log.warning('Session closed, on packet read error')
                log.debug(traceback.format_exc())
                # self.server.shutdown()
                return

            if success is False:
                log.info('Session closed by client')
                # self.server.shutdown()
                return

            log.info('Command TYPE: {type}'.format(
                type=getConstName(COMMANDS, p.type.value)))

            if p.type.value == COMMANDS.COM_QUERY:
                try:
                    sql = p.sql.value.decode('utf-8')
                    # NOTE dbeaver can insert in start of query comment with connector version, for example
                    # /* mysql-connector-java-8.0.11 (Revision: 6d4eaa273bc181b4cf1c8ad0821a2227f116fedf) */SELECT @@session.auto_increment_increment
                    sql = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", sql)
                    sql = sql.strip(' ;')
                except Exception:
                    log.error('SQL contains non utf-8 values: {sql}'.format(sql=p.sql.value))
                    self.packet(OkPacket).send()
                    continue
                log.info(f'COM_QUERY: {sql}')
                self.current_transaction = self.session.newTransaction(sql_query=sql)

                try:
                    self.queryAnswer(sql)
                except Exception as e:
                    log.error(
                        f'ERROR while executing query: {sql}\n'
                        f'{traceback.format_exc()}\n'
                        f'{e}'
                    )
                    self.packet(
                        ErrPacket,
                        err_code=ERR.ER_SYNTAX_ERROR,
                        msg=str(e)
                    ).send()

                # if self.current_transaction.output_data_array is None:
                #     self.packet(OkPacket).send()
                # else:
                #     self.packet(ResultsetPacket, metadata=self.current_transaction.output_metadata,
                #                 data_array=self.current_transaction.output_data_array).send()
            elif p.type.value == COMMANDS.COM_QUIT:
                log.info('Session closed, on client disconnect')
                self.session = None
                break
            else:
                log.info('Command has no specific handler, return OK msg')
                log.debug(str(p))
                # p.pprintPacket() TODO: Make a version of print packet
                # that sends it to debug isntead
                self.packet(OkPacket).send()