Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Developed RandEvent and add statement-based logging test #414

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f4f4316
Feat: implement rand_event
starcat37 Jul 27, 2023
cc8f7ff
fix: change number of testcases
heehehe Jul 27, 2023
13efa87
Add property for rand event
mjs1995 Jul 27, 2023
c3be8c9
fix: rename seed to _seed
mjs1995 Jul 27, 2023
f8324cc
test: add test_rand_event
heehehe Jul 29, 2023
6511f85
test: move statement setting to setUp
heehehe Jul 29, 2023
f267674
Chore: Delete unnecessary comment
starcat37 Jul 29, 2023
ce87120
Chore: delete unnecessary venv/* in .gitignore
starcat37 Jul 29, 2023
bf9ec0b
comment: add rand_event warning description
heehehe Jul 29, 2023
ccd5b86
refactor: change RandEvent import position
heehehe Jul 29, 2023
b12b7fe
revert: remove resume_stream=True in example
heehehe Jul 29, 2023
9f13346
test: add rand event seed type
sean-k1 Aug 2, 2023
dd8079c
test: add test_rand_event
mikaniz Jul 29, 2023
ff4d184
test: move statement setting to setUp
heehehe Jul 29, 2023
baad3a9
Chore: Delete unnecessary comment
starcat37 Jul 29, 2023
f04e228
Chore: delete unnecessary venv/* in .gitignore
starcat37 Jul 29, 2023
af6425d
comment: add rand_event warning description
heehehe Jul 29, 2023
243f099
refactor: change RandEvent import position
heehehe Jul 29, 2023
2edca88
revert: remove resume_stream=True in example
heehehe Jul 29, 2023
6fda545
test: add rand event seed type
sean-k1 Aug 2, 2023
7928c37
Merge branch 'feature/rand-event' of github.com:23-OSSCA-python-mysql…
heehehe Aug 5, 2023
66c6069
comment: add description for attributes
heehehe Aug 5, 2023
547c05d
docs: Update docstring style
mikaniz Aug 7, 2023
800c1d7
Merge branch 'main' into feature/rand-event
mikaniz Aug 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions pymysqlreplication/binlogstream.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
XidEvent, GtidEvent, StopEvent, XAPrepareEvent,
BeginLoadQueryEvent, ExecuteLoadQueryEvent,
HeartbeatLogEvent, NotImplementedEvent, MariadbGtidEvent,
MariadbAnnotateRowsEvent)
MariadbAnnotateRowsEvent, RandEvent)
from .exceptions import BinLogNotEnabled
from .row_event import (
UpdateRowsEvent, WriteRowsEvent, DeleteRowsEvent, TableMapEvent)
Expand Down Expand Up @@ -621,7 +621,8 @@ def _allowed_event_list(self, only_events, ignored_events,
HeartbeatLogEvent,
NotImplementedEvent,
MariadbGtidEvent,
MariadbAnnotateRowsEvent
MariadbAnnotateRowsEvent,
RandEvent
))
if ignored_events is not None:
for e in ignored_events:
Expand Down
33 changes: 33 additions & 0 deletions pymysqlreplication/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,39 @@ def _dump(self):
print("type: %d" % (self.type))
print("Value: %d" % (self.value))

class RandEvent(BinLogEvent):
"""
RandEvent is generated every time a statement uses the RAND() function.
Indicates the seed values to use for generating a random number with RAND() in the next statement.

RandEvent only works in statement-based logging (need to set binlog_format as 'STATEMENT')
and only works when the seed number is not specified.

:ivar seed1: int - value for the first seed
:ivar seed2: int - value for the second seed
"""

def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs):
super(RandEvent, self).__init__(from_packet, event_size, table_map,
ctl_connection, **kwargs)
# Payload
self._seed1 = self.packet.read_uint64()
self._seed2 = self.packet.read_uint64()

@property
def seed1(self):
"""Get the first seed value"""
return self._seed1

@property
def seed2(self):
"""Get the second seed value"""
return self._seed2

def _dump(self):
super(RandEvent, self)._dump()
print("seed1: %d" % (self.seed1))
print("seed2: %d" % (self.seed2))

class NotImplementedEvent(BinLogEvent):
def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs):
Expand Down
1 change: 1 addition & 0 deletions pymysqlreplication/packet.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ class BinLogPacketWrapper(object):
constants.EXECUTE_LOAD_QUERY_EVENT: event.ExecuteLoadQueryEvent,
constants.HEARTBEAT_LOG_EVENT: event.HeartbeatLogEvent,
constants.XA_PREPARE_EVENT: event.XAPrepareEvent,
constants.RAND_EVENT: event.RandEvent,
# row_event
constants.UPDATE_ROWS_EVENT_V1: row_event.UpdateRowsEvent,
constants.WRITE_ROWS_EVENT_V1: row_event.WriteRowsEvent,
Expand Down
39 changes: 35 additions & 4 deletions pymysqlreplication/tests/test_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@
from pymysqlreplication.constants.BINLOG import *
from pymysqlreplication.row_event import *

__all__ = ["TestBasicBinLogStreamReader", "TestMultipleRowBinLogStreamReader", "TestCTLConnectionSettings", "TestGtidBinLogStreamReader","TestMariadbBinlogStreamReader"]
__all__ = ["TestBasicBinLogStreamReader", "TestMultipleRowBinLogStreamReader", "TestCTLConnectionSettings", "TestGtidBinLogStreamReader", "TestMariadbBinlogStreamReader", "TestStatementConnectionSetting"]


class TestBasicBinLogStreamReader(base.PyMySQLReplicationTestCase):
def ignoredEvents(self):
return [GtidEvent]

def test_allowed_event_list(self):
self.assertEqual(len(self.stream._allowed_event_list(None, None, False)), 17)
self.assertEqual(len(self.stream._allowed_event_list(None, None, True)), 16)
self.assertEqual(len(self.stream._allowed_event_list(None, [RotateEvent], False)), 16)
self.assertEqual(len(self.stream._allowed_event_list(None, None, False)), 18)
self.assertEqual(len(self.stream._allowed_event_list(None, None, True)), 17)
self.assertEqual(len(self.stream._allowed_event_list(None, [RotateEvent], False)), 17)
self.assertEqual(len(self.stream._allowed_event_list([RotateEvent], None, False)), 1)

def test_read_query_event(self):
Expand Down Expand Up @@ -1036,6 +1036,37 @@ def test_annotate_rows_event(self):
self.assertEqual(event.sql_statement,insert_query)
self.assertIsInstance(event,MariadbAnnotateRowsEvent)

class TestStatementConnectionSetting(base.PyMySQLReplicationTestCase):
def setUp(self):
super(TestStatementConnectionSetting, self).setUp()
self.stream.close()
self.stream = BinLogStreamReader(
self.database,
server_id=1024,
only_events=(RandEvent, QueryEvent),
fail_on_table_metadata_unavailable=True
)
self.execute("SET @@binlog_format='STATEMENT'")

def test_rand_event(self):
self.execute("CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, data INT NOT NULL, PRIMARY KEY (id))")
self.execute("INSERT INTO test (data) VALUES(RAND())")
self.execute("COMMIT")

self.assertEqual(self.bin_log_format(), "STATEMENT")
self.assertIsInstance(self.stream.fetchone(), QueryEvent)
self.assertIsInstance(self.stream.fetchone(), QueryEvent)

expect_rand_event = self.stream.fetchone()
self.assertIsInstance(expect_rand_event, RandEvent)
self.assertEqual(type(expect_rand_event.seed1), int)
self.assertEqual(type(expect_rand_event.seed2), int)

def tearDown(self):
self.execute("SET @@binlog_format='ROW'")
self.assertEqual(self.bin_log_format(), "ROW")
super(TestStatementConnectionSetting, self).tearDown()


if __name__ == "__main__":
import unittest
Expand Down