Skip to content

Commit 0140b45

Browse files
committed
implement partial format description event fields
1 parent 82240b7 commit 0140b45

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

pymysqlreplication/event.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,10 +368,25 @@ def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs)
368368
self.mysql_version_str = self.packet.read(50).rstrip(b"\0").decode()
369369
numbers = self.mysql_version_str.split("-")[0]
370370
self.mysql_version = tuple(map(int, numbers.split(".")))
371+
self.created = struct.unpack("<I", self.packet.read(4))[0]
372+
self.common_header_len = struct.unpack("<B", self.packet.read(1))[0]
373+
offset = 4 + 2 + 50 + 1 # created + binlog_version + mysql_version_str + common_header_len
374+
checksum_algorithm = 1
375+
checksum = 4
376+
n = event_size - offset - self.common_header_len - checksum_algorithm - checksum
377+
self.post_header_len = struct.unpack(f"<{n}B", self.packet.read(n))
378+
self.server_version_split = struct.unpack("<3B", self.packet.read(3))
379+
self.number_of_event_types = struct.unpack("<B", self.packet.read(1))[0]
371380

372381
def _dump(self):
373382
print(f"Binlog version: {self.binlog_version}")
374-
print(f"MySQL version: {self.mysql_version_str}")
383+
print(f"mysql version: {self.mysql_version_str}")
384+
print(f"Created: {self.created}")
385+
print(f"Common header length: {self.common_header_len}")
386+
print(f"Post header length: {self.post_header_len}")
387+
print(f"Server version split: {self.server_version_split}")
388+
print(f"Number of event types: {self.number_of_event_types}")
389+
375390

376391

377392
class StopEvent(BinLogEvent):

pymysqlreplication/tests/test_basic.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,29 @@ def test_json_update(self):
626626
),
627627
self.assertEqual(event.rows[0]["after_values"]["setting"], {b"btn": True}),
628628

629+
def test_format_description_event(self):
630+
self.stream.close()
631+
self.stream = BinLogStreamReader(
632+
self.database,
633+
server_id=1024,
634+
blocking=False,
635+
only_events=[FormatDescriptionEvent],
636+
)
637+
638+
event = self.stream.fetchone()
639+
self.assertIsInstance(event, FormatDescriptionEvent)
640+
self.assertIsInstance(event.binlog_version, tuple)
641+
self.assertIsInstance(event.mysql_version_str, str)
642+
self.assertTrue(
643+
event.mysql_version_str.startswith("5.") or event.mysql_version_str.startswith("8.")) # Example check
644+
self.assertIsInstance(event.common_header_len, int)
645+
self.assertIsInstance(event.post_header_len, tuple)
646+
self.assertIsInstance(event.mysql_version, tuple)
647+
self.assertEqual(len(event.mysql_version), 3)
648+
self.assertIsInstance(event.server_version_split, tuple)
649+
self.assertEqual(len(event.server_version_split), 3)
650+
self.assertIsInstance(event.number_of_event_types, int)
651+
629652

630653
class TestMultipleRowBinLogStreamReader(base.PyMySQLReplicationTestCase):
631654
def setUp(self):
@@ -1447,6 +1470,30 @@ def test_gtid_list_event(self):
14471470
self.assertEqual(event.event_type, 163)
14481471
self.assertEqual(event.gtid_list[0].gtid, "0-1-15")
14491472

1473+
def test_format_description_event(self):
1474+
self.stream.close()
1475+
self.stream = BinLogStreamReader(
1476+
self.database,
1477+
server_id=1024,
1478+
blocking=False,
1479+
only_events=[FormatDescriptionEvent],
1480+
is_mariadb=True,
1481+
)
1482+
1483+
event = self.stream.fetchone()
1484+
self.assertIsInstance(event, FormatDescriptionEvent)
1485+
self.assertIsInstance(event.binlog_version, tuple)
1486+
self.assertIsInstance(event.mysql_version_str, str)
1487+
self.assertTrue(
1488+
event.mysql_version_str.startswith("10."))
1489+
self.assertIsInstance(event.common_header_len, int)
1490+
self.assertIsInstance(event.post_header_len, tuple)
1491+
self.assertIsInstance(event.mysql_version, tuple)
1492+
self.assertEqual(len(event.mysql_version), 3)
1493+
self.assertIsInstance(event.server_version_split, tuple)
1494+
self.assertEqual(len(event.server_version_split), 3)
1495+
self.assertIsInstance(event.number_of_event_types, int)
1496+
14501497

14511498
class TestRowsQueryLogEvents(base.PyMySQLReplicationTestCase):
14521499
def setUp(self):

0 commit comments

Comments
 (0)