def resetBinLog(self): yield from self.execute("RESET MASTER") if self.stream is not None: self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, ignored_events=self.ignoredEvents(), loop=self.loop)
def test_connection_stream_lost_event(self): self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, blocking=True, ignored_events=self.ignoredEvents(), loop=self.loop) query = "CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query2 = "INSERT INTO test (data) VALUES('a')" for i in range(0, 100): yield from self.execute(query2) yield from self.execute("COMMIT") event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) self.assertEqual(event.query, query) self.conn_control.kill(self.stream._stream_connection.thread_id()) for i in range(0, 10): event = yield from self.stream.fetchone() self.assertIsNotNone(event)
def test_example(): stream = yield from create_binlog_stream( connection_settings=MYSQL_SETTINGS, server_id=1, blocking=True, loop=loop) while True: event = yield from stream.fetchone() event.dump() stream.close()
def test_filtering_ignore_events(self): self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, ignored_events=[QueryEvent], loop=self.loop) query = "CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent)
def test_log_pos(self): query = "CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "INSERT INTO test (data) VALUES('Hello')" yield from self.execute(query) yield from self.execute("COMMIT") for i in range(6): yield from self.stream.fetchone() # record position after insert log_file, log_pos = self.stream.log_file, self.stream.log_pos query = "UPDATE test SET data = 'World' WHERE id = 1" yield from self.execute(query) yield from self.execute("COMMIT") # resume stream from previous position if self.stream is not None: self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, resume_stream=True, log_file=log_file, log_pos=log_pos, ignored_events=self.ignoredEvents(), loop=self.loop ) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) # QueryEvent for the BEGIN event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, UpdateRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent)
def test_log_pos(self): query = "CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "INSERT INTO test (data) VALUES('Hello')" yield from self.execute(query) yield from self.execute("COMMIT") for i in range(6): yield from self.stream.fetchone() # record position after insert log_file, log_pos = self.stream.log_file, self.stream.log_pos query = "UPDATE test SET data = 'World' WHERE id = 1" yield from self.execute(query) yield from self.execute("COMMIT") # resume stream from previous position if self.stream is not None: self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, resume_stream=True, log_file=log_file, log_pos=log_pos, ignored_events=self.ignoredEvents(), loop=self.loop) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) # QueryEvent for the BEGIN event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, UpdateRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent)
def test_reading_rotate_event(self): query = "CREATE TABLE test_2 (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) self.stream.close() query = "CREATE TABLE test_3 (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) # Rotate event self.stream = yield from create_binlog_stream( self.database, server_id=1024, blocking=True, ignored_events=self.ignoredEvents(), loop=self.loop) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent)
def test_position_gtid(self): query = "CREATE TABLE test (id INT NOT NULL, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "BEGIN;" yield from self.execute(query) query = "INSERT INTO test (id, data) VALUES(1, 'Hello');" yield from self.execute(query) query = "COMMIT;" yield from self.execute(query) query = "CREATE TABLE test2 (id INT NOT NULL, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "SELECT @@global.gtid_executed;" cursor = yield from self.execute(query) (gtid, ) = yield from cursor.fetchone() self.stream.close() self.stream = yield from create_binlog_stream(self.database, server_id=1024, blocking=True, auto_position=gtid, loop=self.loop) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, GtidEvent) event = yield from self.stream.fetchone() self.assertEqual( event.query, 'CREATE TABLE test2 (id INT NOT NULL, ' 'data VARCHAR (50) NOT NULL, ' 'PRIMARY KEY (id))')
def test_filtering_table_event(self): self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, only_events=[WriteRowsEvent], only_tables=["test_2"], loop=self.loop) query = "CREATE TABLE test_2 (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "CREATE TABLE test_3 (id INT NOT NULL AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) yield from self.execute("INSERT INTO test_2 (data) VALUES ('alpha')") yield from self.execute("INSERT INTO test_3 (data) VALUES ('alpha')") yield from self.execute("INSERT INTO test_2 (data) VALUES ('beta')") yield from self.execute("COMMIT") event = yield from self.stream.fetchone() self.assertEqual(event.table, "test_2") event = yield from self.stream.fetchone() self.assertEqual(event.table, "test_2")
def test_log_pos_handles_disconnects(self): self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, resume_stream=False, only_events=[ FormatDescriptionEvent, QueryEvent, TableMapEvent, WriteRowsEvent, XidEvent ], loop=self.loop) query = "CREATE TABLE test (id INT PRIMARY KEY AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL)" yield from self.execute(query) query = "INSERT INTO test (data) VALUES('Hello')" yield from self.execute(query) yield from self.execute("COMMIT") event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) self.assertGreater(self.stream.log_pos, 0) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, WriteRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) self.assertGreater(self.stream.log_pos, 0)
def test_position_gtid(self): query = "CREATE TABLE test (id INT NOT NULL, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "BEGIN;" yield from self.execute(query) query = "INSERT INTO test (id, data) VALUES(1, 'Hello');" yield from self.execute(query) query = "COMMIT;" yield from self.execute(query) query = "CREATE TABLE test2 (id INT NOT NULL, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "SELECT @@global.gtid_executed;" cursor = yield from self.execute(query) (gtid,) = yield from cursor.fetchone() self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, blocking=True, auto_position=gtid, loop=self.loop) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, GtidEvent) event = yield from self.stream.fetchone() self.assertEqual(event.query, 'CREATE TABLE test2 (id INT NOT NULL, ' 'data VARCHAR (50) NOT NULL, ' 'PRIMARY KEY (id))')
def test_log_pos_handles_disconnects(self): self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, resume_stream=False, only_events=[FormatDescriptionEvent, QueryEvent, TableMapEvent, WriteRowsEvent, XidEvent], loop=self.loop ) query = "CREATE TABLE test (id INT PRIMARY KEY AUTO_INCREMENT, " \ "data VARCHAR (50) NOT NULL)" yield from self.execute(query) query = "INSERT INTO test (data) VALUES('Hello')" yield from self.execute(query) yield from self.execute("COMMIT") event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) self.assertGreater(self.stream.log_pos, 0) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, WriteRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) self.assertGreater(self.stream.log_pos, 0)
def test_read_query_event(self): query = "CREATE TABLE test (id INT NOT NULL, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "SELECT @@global.gtid_executed;" cursor = yield from self.execute(query) (gtid,) = yield from cursor.fetchone() self.stream.close() self.stream = yield from create_binlog_stream( self.database, server_id=1024, blocking=True, auto_position=gtid, loop=self.loop) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) # Insert first event query = "BEGIN;" yield from self.execute(query) query = "INSERT INTO test (id, data) VALUES(1, 'Hello');" yield from self.execute(query) query = "COMMIT;" yield from self.execute(query) firstevent = yield from self.stream.fetchone() self.assertIsInstance(firstevent, GtidEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, WriteRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) # Insert second event query = "BEGIN;" yield from self.execute(query) query = "INSERT INTO test (id, data) VALUES(2, 'Hello');" yield from self.execute(query) query = "COMMIT;" yield from self.execute(query) secondevent = yield from self.stream.fetchone() self.assertIsInstance(secondevent, GtidEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, WriteRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) self.assertEqual(secondevent.gno, firstevent.gno + 1)
def test_read_query_event(self): query = "CREATE TABLE test (id INT NOT NULL, " \ "data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" yield from self.execute(query) query = "SELECT @@global.gtid_executed;" cursor = yield from self.execute(query) (gtid, ) = yield from cursor.fetchone() self.stream.close() self.stream = yield from create_binlog_stream(self.database, server_id=1024, blocking=True, auto_position=gtid, loop=self.loop) event = yield from self.stream.fetchone() self.assertIsInstance(event, RotateEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, FormatDescriptionEvent) # Insert first event query = "BEGIN;" yield from self.execute(query) query = "INSERT INTO test (id, data) VALUES(1, 'Hello');" yield from self.execute(query) query = "COMMIT;" yield from self.execute(query) firstevent = yield from self.stream.fetchone() self.assertIsInstance(firstevent, GtidEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, WriteRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) # Insert second event query = "BEGIN;" yield from self.execute(query) query = "INSERT INTO test (id, data) VALUES(2, 'Hello');" yield from self.execute(query) query = "COMMIT;" yield from self.execute(query) secondevent = yield from self.stream.fetchone() self.assertIsInstance(secondevent, GtidEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, QueryEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, TableMapEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, WriteRowsEvent) event = yield from self.stream.fetchone() self.assertIsInstance(event, XidEvent) self.assertEqual(secondevent.gno, firstevent.gno + 1)