def __init__(self, capability_flags, **kwargs): super(EOFPacket, self).__init__(capability_flags, **kwargs) self.fields = [('eof_header', FixedLengthInteger(1, 0xfe)) # EOF header ] if capability_flags & capabilities.PROTOCOL_41: self.fields += [ ('warnings', FixedLengthInteger(2, kwargs.pop('warnings', 0))), ('status_flags', FixedLengthInteger(2, kwargs.pop('status_flags', 0))) ]
def __init__(self, capability_flags, error_code, error_msg, **kwargs): super(ERRPacket, self).__init__(capability_flags, **kwargs) self.error_code = error_code self.error_msg = error_msg self.fields = [ ('err_header', FixedLengthInteger(1, 0xff)), # ERR header ('error_code', FixedLengthInteger(2, error_code)) ] if capability_flags & capabilities.PROTOCOL_41: self.fields += [ ('sql_state_flag', FixedLengthString(1, '#')), ('sql_state', FixedLengthString(5, kwargs.pop('sql_state', 'HY000'))) ] self.fields.append(('error_msg', RestOfPacketString(self.error_msg)))
def _write_packet_header(self, length, seq, fde): """ Write out packet header with given length and sequence id to file-like fde """ length_field = FixedLengthInteger(3, length) seq_field = FixedLengthInteger(1, seq) length_field.write_out(fde, label=None) seq_field.write_out(fde, label=None)
def __init__(self, capability_flags, affected_rows, last_insert_id, **kwargs): super(OKPacket, self).__init__(capability_flags, **kwargs) self.affected_rows = affected_rows self.last_insert_id = last_insert_id use_41 = capability_flags & capabilities.PROTOCOL_41 transactions = capability_flags & capabilities.TRANSACTIONS if use_41 or transactions: self.status_flags = kwargs.pop('status_flags', 0) self.warnings = kwargs.pop('warnings', 0) self.fields = [ ('ok_header', FixedLengthInteger(1, 0)), # OK header ('affected_rows', LengthEncodedInteger(affected_rows)), ('last_insert_id', LengthEncodedInteger(last_insert_id)) ] if use_41: self.fields += [('status_flags', FixedLengthInteger(2, self.status_flags)), ('warnings', FixedLengthInteger(2, self.warnings))] elif transactions: self.fields.append( ('status_flags', FixedLengthInteger(2, self.status_flags))) ok_message = kwargs.pop('info', 'k thanks') self.fields.append(('ok_message', RestOfPacketString(ok_message)))
def runTest(self): """ Test fixed-length integer read-in """ from StringIO import StringIO from mysqlproxy.types import FixedLengthInteger # wire read tests proto_buf = StringIO(b'\x01\x00\x00\x25') fli = FixedLengthInteger(3) fli.read_in(proto_buf) self.assertEqual(fli.val, 1) # wire write tests proto_buf = StringIO() fli = FixedLengthInteger(3, 1) fli.write_out(proto_buf) self.assertEqual(proto_buf.getvalue(), b'\x01\x00\x00')
def read_in(self, fde): """ Read in full payload """ total_read = 0 packet_length = FixedLengthInteger(3, 0xffffff) seq_id = FixedLengthInteger(1) self.payload = StringIO() while packet_length.val == 0xffffff: packet_length.read_in(fde, label=None) seq_id.read_in(fde, label=None) cur_payload = FixedLengthString(packet_length.val) cur_payload.read_in(fde, label=None) self.payload.write(cur_payload.val) self.packet_meta.append(PacketMeta(packet_length.val, seq_id.val)) total_read += packet_length.val self.seq_id = seq_id.val self.payload.seek(0) return total_read