Skip to content

Commit 1abb7b7

Browse files
authored
Add heartbeat event parsing (#11)
* Added heartbeat parser and definitions * Added changeset * Fixed type * Test parsing fix * Update binlog type mappings to include Heartbeat Event V2 * Fixed parsing for Heartbeat Event V2 * Export Heartbeat_V2 * Updated changeset * Updated changeset
1 parent 9d3fbc6 commit 1abb7b7

File tree

4 files changed

+93
-36
lines changed

4 files changed

+93
-36
lines changed

.changeset/shy-kings-eat.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
'@powersync/mysql-zongji': minor
3+
---
4+
5+
Added binlog hearbeat parsing and type definitions
6+
Updated the CodeEvent enum to include the newer MySQL BinLog types
7+
8+
Exposed startAtEnd option in the Zongji start options. Thank you @svenpaulsen!

lib/binlog_event.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,32 @@ BinlogEvent.prototype._readTableId = function (parser) {
2828
this.tableId = Common.parseUInt48(parser);
2929
};
3030

31+
function Heartbeat(parser) {
32+
BinlogEvent.apply(this, arguments);
33+
this.binlogName = parser.parseString(this.size);
34+
}
35+
util.inherits(Heartbeat, BinlogEvent);
36+
37+
Heartbeat.prototype.dump = function () {
38+
console.log('=== %s ===', this.getTypeName());
39+
console.log('Event size: %d', this.size);
40+
console.log('Current binlog file: %s', this.binlogName);
41+
};
42+
43+
function Heartbeat_V2(parser) {
44+
BinlogEvent.apply(this, arguments);
45+
this.binlogName = parser.parseString(this.size - 8);
46+
this.position = Common.parseUInt64(parser);
47+
}
48+
util.inherits(Heartbeat_V2, BinlogEvent);
49+
50+
Heartbeat_V2.prototype.dump = function () {
51+
console.log('=== %s ===', this.getTypeName());
52+
console.log('Event size: %d', this.size);
53+
console.log('Current binlog file: %s', this.binlogName);
54+
console.log('Position: %d', this.position);
55+
};
56+
3157
/* Change MySQL bin log file
3258
* Attributes:
3359
* position: Position inside next binlog
@@ -303,6 +329,8 @@ function Unknown() {
303329
util.inherits(Unknown, BinlogEvent);
304330

305331
exports.BinlogEvent = BinlogEvent;
332+
exports.Heartbeat = Heartbeat;
333+
exports.Heartbeat_V2 = Heartbeat_V2;
306334
exports.Rotate = Rotate;
307335
exports.Format = Format;
308336
exports.Query = Query;

lib/code_map.js

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,51 @@
11
const events = require('./binlog_event');
22
const rowsEvents = require('./rows_event');
33

4+
// Mirrors the Binlog Event Type enum from here: https://dev.mysql.com/doc/dev/mysql-server/9.3.0/binlog__event_8h_source.html
45
const CodeEvent = [
5-
'UNKNOWN_EVENT',
6-
'START_EVENT_V3',
7-
'QUERY_EVENT',
8-
'STOP_EVENT',
9-
'ROTATE_EVENT',
10-
'INTVAR_EVENT',
11-
'LOAD_EVENT',
12-
'SLAVE_EVENT',
13-
'CREATE_FILE_EVENT',
14-
'APPEND_BLOCK_EVENT',
15-
'EXEC_LOAD_EVENT',
16-
'DELETE_FILE_EVENT',
17-
'NEW_LOAD_EVENT',
18-
'RAND_EVENT',
19-
'USER_VAR_EVENT',
20-
'FORMAT_DESCRIPTION_EVENT',
21-
'XID_EVENT',
22-
'BEGIN_LOAD_QUERY_EVENT',
23-
'EXECUTE_LOAD_QUERY_EVENT',
24-
'TABLE_MAP_EVENT',
25-
'PRE_GA_DELETE_ROWS_EVENT',
26-
'PRE_GA_UPDATE_ROWS_EVENT',
27-
'PRE_GA_WRITE_ROWS_EVENT',
28-
'WRITE_ROWS_EVENT_V1',
29-
'UPDATE_ROWS_EVENT_V1',
30-
'DELETE_ROWS_EVENT_V1',
31-
'INCIDENT_EVENT',
32-
'HEARTBEAT_LOG_EVENT',
33-
'IGNORABLE_LOG_EVENT',
34-
'ROWS_QUERY_LOG_EVENT',
35-
'WRITE_ROWS_EVENT_V2',
36-
'UPDATE_ROWS_EVENT_V2',
37-
'DELETE_ROWS_EVENT_V2',
38-
'GTID_LOG_EVENT',
39-
'ANONYMOUS_GTID_LOG_EVENT',
40-
'PREVIOUS_GTIDS_LOG_EVENT'
6+
'UNKNOWN_EVENT', // 0
7+
'START_EVENT_V3', // 1
8+
'QUERY_EVENT', // 2
9+
'STOP_EVENT', // 3
10+
'ROTATE_EVENT', // 4
11+
'INTVAR_EVENT', // 5
12+
'LOAD_EVENT', // 6
13+
'SLAVE_EVENT', // 7
14+
'CREATE_FILE_EVENT', // 8
15+
'APPEND_BLOCK_EVENT', // 9
16+
'EXEC_LOAD_EVENT', // 10
17+
'DELETE_FILE_EVENT', // 11
18+
'NEW_LOAD_EVENT', // 12
19+
'RAND_EVENT', // 13
20+
'USER_VAR_EVENT', // 14
21+
'FORMAT_DESCRIPTION_EVENT', // 15
22+
'XID_EVENT', // 16
23+
'BEGIN_LOAD_QUERY_EVENT', // 17
24+
'EXECUTE_LOAD_QUERY_EVENT', // 18
25+
'TABLE_MAP_EVENT', // 19
26+
'PRE_GA_DELETE_ROWS_EVENT', // 20
27+
'PRE_GA_UPDATE_ROWS_EVENT', // 21
28+
'PRE_GA_WRITE_ROWS_EVENT', // 22
29+
'WRITE_ROWS_EVENT_V1', // 23
30+
'UPDATE_ROWS_EVENT_V1', // 24
31+
'DELETE_ROWS_EVENT_V1', // 25
32+
'INCIDENT_EVENT', // 26
33+
'HEARTBEAT_LOG_EVENT', // 27
34+
'IGNORABLE_LOG_EVENT', // 28
35+
'ROWS_QUERY_LOG_EVENT', // 29
36+
'WRITE_ROWS_EVENT_V2', // 30
37+
'UPDATE_ROWS_EVENT_V2', // 31
38+
'DELETE_ROWS_EVENT_V2', // 32
39+
'GTID_LOG_EVENT', // 33
40+
'ANONYMOUS_GTID_LOG_EVENT', // 34
41+
'PREVIOUS_GTIDS_LOG_EVENT', // 35
42+
'TRANSACTION_CONTEXT_EVENT', // 36
43+
'VIEW_CHANGE_EVENT', // 37
44+
'XA_PREPARE_LOG_EVENT', // 38
45+
'PARTIAL_UPDATE_ROWS_EVENT', // 39
46+
'TRANSACTION_PAYLOAD_EVENT', // 40
47+
'HEARTBEAT_LOG_EVENT_V2', // 41
48+
'GTID_TAGGED_LOG_EVENT' // 42
4149
];
4250

4351
const EventClass = {
@@ -48,6 +56,8 @@ const EventClass = {
4856
FORMAT_DESCRIPTION_EVENT: events.Format,
4957
XID_EVENT: events.Xid,
5058
GTID_LOG_EVENT: events.GtidLog,
59+
HEARTBEAT_LOG_EVENT: events.Heartbeat,
60+
HEARTBEAT_LOG_EVENT_V2: events.Heartbeat_V2,
5161

5262
TABLE_MAP_EVENT: events.TableMap,
5363
DELETE_ROWS_EVENT_V1: rowsEvents.DeleteRows,

types/index.d.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,15 @@ export type BaseBinLogEvent = {
111111
useChecksum: boolean;
112112
};
113113

114+
export type BinLogHeartbeatEvent = BaseBinLogEvent & {
115+
binlogName: string;
116+
};
117+
118+
export type BinLogHeartbeatEvent_V2 = BaseBinLogEvent & {
119+
binlogName: string;
120+
position: string;
121+
};
122+
114123
export type BinLogRotationEvent = BaseBinLogEvent & {
115124
binlogName: string;
116125
position: number;
@@ -170,6 +179,8 @@ export type BinLogQueryEvent = BaseBinLogEvent & {
170179

171180
export type BinLogEvent =
172181
| BinLogRotationEvent
182+
| BinLogHeartbeatEvent
183+
| BinLogHeartbeatEvent_V2
173184
| BinLogGTIDLogEvent
174185
| BinLogXidEvent
175186
| BinLogRowEvent

0 commit comments

Comments
 (0)