aboutsummaryrefslogtreecommitdiff
path: root/node_modules/mysql2/lib/commands/binlog_dump.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/mysql2/lib/commands/binlog_dump.js')
-rw-r--r--node_modules/mysql2/lib/commands/binlog_dump.js109
1 files changed, 109 insertions, 0 deletions
diff --git a/node_modules/mysql2/lib/commands/binlog_dump.js b/node_modules/mysql2/lib/commands/binlog_dump.js
new file mode 100644
index 0000000..be00031
--- /dev/null
+++ b/node_modules/mysql2/lib/commands/binlog_dump.js
@@ -0,0 +1,109 @@
+'use strict';
+
+const Command = require('./command');
+const Packets = require('../packets');
+
+const eventParsers = [];
+
+class BinlogEventHeader {
+ constructor(packet) {
+ this.timestamp = packet.readInt32();
+ this.eventType = packet.readInt8();
+ this.serverId = packet.readInt32();
+ this.eventSize = packet.readInt32();
+ this.logPos = packet.readInt32();
+ this.flags = packet.readInt16();
+ }
+}
+
+class BinlogDump extends Command {
+ constructor(opts) {
+ super();
+ // this.onResult = callback;
+ this.opts = opts;
+ }
+
+ start(packet, connection) {
+ const newPacket = new Packets.BinlogDump(this.opts);
+ connection.writePacket(newPacket.toPacket(1));
+ return BinlogDump.prototype.binlogData;
+ }
+
+ binlogData(packet) {
+ // ok - continue consuming events
+ // error - error
+ // eof - end of binlog
+ if (packet.isEOF()) {
+ this.emit('eof');
+ return null;
+ }
+ // binlog event header
+ packet.readInt8();
+ const header = new BinlogEventHeader(packet);
+ const EventParser = eventParsers[header.eventType];
+ let event;
+ if (EventParser) {
+ event = new EventParser(packet);
+ } else {
+ event = {
+ name: 'UNKNOWN'
+ };
+ }
+ event.header = header;
+ this.emit('event', event);
+ return BinlogDump.prototype.binlogData;
+ }
+}
+
+class RotateEvent {
+ constructor(packet) {
+ this.pposition = packet.readInt32();
+ // TODO: read uint64 here
+ packet.readInt32(); // positionDword2
+ this.nextBinlog = packet.readString();
+ this.name = 'RotateEvent';
+ }
+}
+
+class FormatDescriptionEvent {
+ constructor(packet) {
+ this.binlogVersion = packet.readInt16();
+ this.serverVersion = packet.readString(50).replace(/\u0000.*/, ''); // eslint-disable-line no-control-regex
+ this.createTimestamp = packet.readInt32();
+ this.eventHeaderLength = packet.readInt8(); // should be 19
+ this.eventsLength = packet.readBuffer();
+ this.name = 'FormatDescriptionEvent';
+ }
+}
+
+class QueryEvent {
+ constructor(packet) {
+ const parseStatusVars = require('../packets/binlog_query_statusvars.js');
+ this.slaveProxyId = packet.readInt32();
+ this.executionTime = packet.readInt32();
+ const schemaLength = packet.readInt8();
+ this.errorCode = packet.readInt16();
+ const statusVarsLength = packet.readInt16();
+ const statusVars = packet.readBuffer(statusVarsLength);
+ this.schema = packet.readString(schemaLength);
+ packet.readInt8(); // should be zero
+ this.statusVars = parseStatusVars(statusVars);
+ this.query = packet.readString();
+ this.name = 'QueryEvent';
+ }
+}
+
+class XidEvent {
+ constructor(packet) {
+ this.binlogVersion = packet.readInt16();
+ this.xid = packet.readInt64();
+ this.name = 'XidEvent';
+ }
+}
+
+eventParsers[2] = QueryEvent;
+eventParsers[4] = RotateEvent;
+eventParsers[15] = FormatDescriptionEvent;
+eventParsers[16] = XidEvent;
+
+module.exports = BinlogDump;