def _get_server_information(self): i = 0 packet = MysqlPacket(self) data = packet.get_all_data() if DEBUG: dump_packet(data) #packet_len = byte2int(data[i:i+1]) #i += 4 self.protocol_version = byte2int(data[i:i+1]) i += 1 server_end = data.find(int2byte(0), i) # TODO: is this the correct charset? should it be default_charset? self.server_version = data[i:server_end].decode(self.charset) i = server_end + 1 self.server_thread_id = struct.unpack('<h', data[i:i+2]) i += 4 self.salt = data[i:i+8] i += 9 if len(data) >= i + 1: i += 1 self.server_capabilities = struct.unpack('<h', data[i:i+2])[0] i += 1 self.server_language = byte2int(data[i:i+1]) self.server_charset = charset_by_id(self.server_language).name i += 16 if len(data) >= i+12-1: rest_salt = data[i:i+12] self.salt += rest_salt
def convert_characters(data, charset=None, field=None, use_unicode=None): field_charset = charset_by_id(field.charsetnr).name if field.flags & FLAG.SET: return convert_set(data.decode(field_charset)) if field.flags & FLAG.BINARY: if PYTHON3 and field_charset != 'binary': return data.decode(field_charset) else: return data if use_unicode or PYTHON3: data = data.decode(field_charset) elif charset != field_charset: data = data.decode(field_charset) data = data.encode(charset) return data
def __parse_field_descriptor(self): """Parse the 'Field Descriptor' (Metadata) packet. This is compatible with MySQL 4.1+ (not compatible with MySQL 4.0). """ self.catalog = self._read_length_coded_string() self.db = self._read_length_coded_string() self.table_name = self._read_length_coded_string() self.org_table = self._read_length_coded_string() self.name = self._read_length_coded_string().decode(self.connection.encoding) self.org_name = self._read_length_coded_string() self._skip(1) # non-null filler self.charsetnr = unpack_uint16(self._read(2)) self.charset = charset_by_id(self.charsetnr).name self.encoding = encoding_by_charset(self.charset) self.length = unpack_uint32(self._read(4)) self.type_code = ord(self._read(1)) self.flags = unpack_uint16(self._read(2)) self.is_set = self.flags & FLAG.SET self.is_binary = self.flags & FLAG.BINARY self.scale = ord(self._read(1)) # "decimals" self._skip(2) # filler (always 0x00)
def __parse_field_descriptor(self): """Parse the 'Field Descriptor' (Metadata) packet. This is compatible with MySQL 4.1+ (not compatible with MySQL 4.0). """ self.catalog = self._read_length_coded_string() self.db = self._read_length_coded_string() self.table_name = self._read_length_coded_string() self.org_table = self._read_length_coded_string() self.name = self._read_length_coded_string().decode( self.connection.charset) self.org_name = self._read_length_coded_string() self._skip(1) # non-null filler self.charsetnr = unpack_uint16(self._read(2)) self.charset = charset_by_id(self.charsetnr).name self.length = unpack_uint32(self._read(4)) self.type_code = ord(self._read(1)) self.flags = unpack_uint16(self._read(2)) self.is_set = self.flags & FLAG.SET self.is_binary = self.flags & FLAG.BINARY self.scale = ord(self._read(1)) # "decimals" self._skip(2) # filler (always 0x00)