Beispiel #1
0
  def __recv_packet(self, socket):
    """Parse the packet header and read entire packet payload into buffer."""
    packet_header = socket.recv(4)
    while len(packet_header) < 4:
        d = socket.recv(4 - len(packet_header))
        if len(d) == 0:
            raise OperationalError(2013, "Lost connection to MySQL server during query")
        packet_header += d

    if DEBUG: dump_packet(packet_header)
    packet_length_bin = packet_header[:3]
    self.__packet_number = byte2int(packet_header[3])
    # TODO: check packet_num is correct (+1 from last packet)

    bin_length = packet_length_bin + int2byte(0)  # pad little-endian number
    bytes_to_read = struct.unpack('<I', bin_length)[0]

    payload_buff = []  # this is faster than cStringIO
    while bytes_to_read > 0:
      recv_data = socket.recv(bytes_to_read)
      if len(recv_data) == 0:
            raise OperationalError(2013, "Lost connection to MySQL server during query")
      if DEBUG: dump_packet(recv_data)
      payload_buff.append(recv_data)
      bytes_to_read -= len(recv_data)
    self.__data = join_bytes(payload_buff)
Beispiel #2
0
 def _read_bytes(self, num_bytes):
     while True:
         try:
             data = self._rfile.read(num_bytes)
             break
         except (IOError, OSError) as e:
             if e.errno == errno.EINTR:
                 continue
             raise OperationalError(
                 2013, "Lost connection to MySQL server during query (%r)" %
                 (e, ))
     if len(data) < num_bytes:
         raise OperationalError(
             2013, "Lost connection to MySQL server during query")
     return data
Beispiel #3
0
 def _read_ok_packet(self):
     pkt = self._read_packet()
     if not pkt.is_ok_packet():
         raise OperationalError(2014, "Command Out of Sync")
     ok = OKPacketWrapper(pkt)
     self.server_status = ok.server_status
     return True
 def _connect(self):
     try:
         if self.unix_socket and (self.host == 'localhost'
                                  or self.host == '127.0.0.1'):
             sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
             t = sock.gettimeout()
             sock.settimeout(self.connect_timeout)
             sock.connect(self.unix_socket)
             sock.settimeout(t)
             self.host_info = "Localhost via UNIX socket"
             if DEBUG: print 'connected using unix_socket'
         else:
             sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             t = sock.gettimeout()
             sock.settimeout(self.connect_timeout)
             sock.connect((self.host, self.port))
             sock.settimeout(t)
             self.host_info = "socket %s:%d" % (self.host, self.port)
             if DEBUG: print 'connected using socket'
         self.socket = sock
         self.rfile = self.socket.makefile("rb")
         self.wfile = self.socket.makefile("wb")
         self._get_server_information()
         self._request_authentication()
     except socket.error, e:
         raise OperationalError(
             2003, "Can't connect to MySQL server on %r (%s)" %
             (self.host, e.args[0]))
Beispiel #5
0
  def __recv_packet(self):
    """Parse the packet header and read entire packet payload into buffer."""
    packet_header = self.connection.rfile.read(4)
    if len(packet_header) < 4:
        raise OperationalError(2013, "Lost connection to MySQL server during query")

    if DEBUG: dump_packet(packet_header)
    packet_length_bin = packet_header[:3]
    self.__packet_number = byte2int(packet_header[3])
    # TODO: check packet_num is correct (+1 from last packet)

    bin_length = packet_length_bin + int2byte(0)  # pad little-endian number
    bytes_to_read = struct.unpack('<I', bin_length)[0]
    recv_data = self.connection.rfile.read(bytes_to_read)
    if len(recv_data) < bytes_to_read:
        raise OperationalError(2013, "Lost connection to MySQL server during query")
    if DEBUG: dump_packet(recv_data)
    self.__data = recv_data
Beispiel #6
0
    def _connect(self):
        sock = None
        try:
            if self.unix_socket and self.host in ('localhost', '127.0.0.1'):
                sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
                sock.settimeout(self.connect_timeout)
                sock.connect(self.unix_socket)
                self.host_info = "Localhost via UNIX socket"
                if DEBUG: print('connected using unix_socket')
            else:
                while True:
                    try:
                        sock = socket.create_connection((self.host, self.port),
                                                        self.connect_timeout)
                        break
                    except (OSError, IOError) as e:
                        if e.errno == errno.EINTR:
                            continue
                        raise
                self.host_info = "socket %s:%d" % (self.host, self.port)
                if DEBUG: print('connected using socket')
            sock.settimeout(None)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
            if self.no_delay:
                sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
            self.socket = sock
            self._rfile = _makefile(sock, 'rb')
            self._get_server_information()
            self._request_authentication()

            if self.sql_mode is not None:
                c = self.cursor()
                c.execute("SET sql_mode=%s", (self.sql_mode, ))

            if self.init_command is not None:
                c = self.cursor()
                c.execute(self.init_command)
                self.commit()

            if self.autocommit_mode is not None:
                self.autocommit(self.autocommit_mode)
        except Exception as e:
            self._rfile = None
            if sock is not None:
                try:
                    sock.close()
                except socket.error:
                    pass
            raise OperationalError(
                2003,
                "Can't connect to MySQL server on %r (%s)" % (self.host, e))
Beispiel #7
0
 def _write_bytes(self, data):
     try:
         self.socket.sendall(data)
     except IOError as e:
         raise OperationalError(2006,
                                "MySQL server has gone away (%r)" % (e, ))