def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs): super(TableMapEvent, self).__init__(from_packet, event_size, table_map, ctl_connection, **kwargs) self.__only_tables = kwargs["only_tables"] self.__only_schemas = kwargs["only_schemas"] self.__freeze_schema = kwargs["freeze_schema"] # Post-Header self.table_id = self._read_table_id() if self.table_id in table_map and self.__freeze_schema: self._processed = False return self.flags = struct.unpack('<H', self.packet.read(2))[0] # Payload self.schema_length = byte2int(self.packet.read(1)) self.schema = self.packet.read(self.schema_length).decode() self.packet.advance(1) self.table_length = byte2int(self.packet.read(1)) self.table = self.packet.read(self.table_length).decode() if self.__only_tables is not None and self.table not in self.__only_tables: self._processed = False return if self.__only_schemas is not None and self.schema not in self.__only_schemas: self._processed = False return self.packet.advance(1) self.column_count = self.packet.read_length_coded_binary() self.columns = []
def run_async(self): if self.table_id in self.table_map: self.column_schemas = self.table_map[self.table_id].column_schemas else: self.column_schemas = yield self._ctl_connection._get_table_information(self.schema, self.table) if len(self.column_schemas) != 0: # Read columns meta data column_types = list(self.packet.read(self.column_count)) self.packet.read_length_coded_binary() for i in range(0, len(column_types)): column_type = column_types[i] try: column_schema = self.column_schemas[i] except IndexError: # this a dirty hack to prevent row events containing columns which have been dropped prior # to tornado_mysqlreplication start, but replayed from binlog from blowing up the service. # TODO: this does not address the issue if the column other than the last one is dropped column_schema = { 'COLUMN_NAME': '__dropped_col_{i}__'.format(i=i), 'COLLATION_NAME': None, 'CHARACTER_SET_NAME': None, 'COLUMN_COMMENT': None, 'COLUMN_TYPE': 'BLOB', # we don't know what it is, so let's not do anything with it. 'COLUMN_KEY': '', } col = Column(byte2int(column_type), column_schema, self.packet) self.columns.append(col) self.table_obj = Table(self.column_schemas, self.table_id, self.schema, self.table, self.columns)
def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs): super(GtidEvent, self).__init__(from_packet, event_size, table_map, ctl_connection, **kwargs) self.commit_flag = byte2int(self.packet.read(1)) == 1 self.sid = self.packet.read(16) self.gno = struct.unpack('<Q', self.packet.read(8))[0]
def run_async(self): if not self._processed: return if self.table_id in self.table_map: self.column_schemas = self.table_map[self.table_id].column_schemas else: self.column_schemas = yield self._ctl_connection._get_table_information(self.schema, self.table) if len(self.column_schemas) != 0: # Read columns meta data column_types = list(self.packet.read(self.column_count)) self.packet.read_length_coded_binary() for i in range(0, len(column_types)): column_type = column_types[i] try: column_schema = self.column_schemas[i] except IndexError: # this a dirty hack to prevent row events containing columns which have been dropped prior # to pymysqlreplication start, but replayed from binlog from blowing up the service. # TODO: this does not address the issue if the column other than the last one is dropped column_schema = { 'COLUMN_NAME': '__dropped_col_{i}__'.format(i=i), 'COLLATION_NAME': None, 'CHARACTER_SET_NAME': None, 'COLUMN_COMMENT': None, 'COLUMN_TYPE': 'BLOB', # we don't know what it is, so let's not do anything with it. 'COLUMN_KEY': '', } col = Column(byte2int(column_type), column_schema, self.packet) self.columns.append(col) self.table_obj = Table(self.column_schemas, self.table_id, self.schema, self.table, self.columns)
def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs): super(TableMapEvent, self).__init__(from_packet, event_size, table_map, ctl_connection, **kwargs) self.__only_tables = kwargs["only_tables"] self.__ignored_tables = kwargs["ignored_tables"] self.__only_schemas = kwargs["only_schemas"] self.__ignored_schemas = kwargs["ignored_schemas"] self.__freeze_schema = kwargs["freeze_schema"] # Post-Header self.table_id = self._read_table_id() if self.table_id in table_map and self.__freeze_schema: self._processed = False return self.flags = struct.unpack('<H', self.packet.read(2))[0] # Payload self.schema_length = byte2int(self.packet.read(1)) self.schema = self.packet.read(self.schema_length).decode() self.packet.advance(1) self.table_length = byte2int(self.packet.read(1)) self.table = self.packet.read(self.table_length).decode() if self.__only_tables is not None and self.table not in self.__only_tables: self._processed = False return elif self.__ignored_tables is not None and self.table in self.__ignored_tables: self._processed = False return if self.__only_schemas is not None and self.schema not in self.__only_schemas: self._processed = False return elif self.__ignored_schemas is not None and self.schema in self.__ignored_schemas: self._processed = False return self.packet.advance(1) self.column_count = self.packet.read_length_coded_binary() self.columns = []
def __init__(self, header): '''Initialize the Event with the event header''' unpacked = struct.unpack('<IcIIIH', header) self.timestamp = unpacked[0] self.event_type = byte2int(unpacked[1]) self.server_id = unpacked[2] self.event_size = unpacked[3] self.log_pos = unpacked[4] self.flags = unpacked[5] self.body = None self.pos = None
def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs): super(QueryEvent, self).__init__(from_packet, event_size, table_map, ctl_connection, **kwargs) # Post-header self.slave_proxy_id = self.packet.read_uint32() self.execution_time = self.packet.read_uint32() self.schema_length = byte2int(self.packet.read(1)) self.error_code = self.packet.read_uint16() self.status_vars_length = self.packet.read_uint16() # Payload self.status_vars = self.packet.read(self.status_vars_length) self.schema = self.packet.read(self.schema_length) self.packet.advance(1) self.query = self.packet.read(event_size - 13 - self.status_vars_length - self.schema_length - 1).decode("utf-8")