105 lines
2.8 KiB
JavaScript
105 lines
2.8 KiB
JavaScript
|
var Command = require('./command');
|
||
|
var util = require('util');
|
||
|
var CommandCode = require('../constants/commands');
|
||
|
var Packets = require('../packets');
|
||
|
|
||
|
function BinlogDump(opts)
|
||
|
{
|
||
|
Command.call(this);
|
||
|
//this.onResult = callback;
|
||
|
this.opts = opts;
|
||
|
}
|
||
|
util.inherits(BinlogDump, Command);
|
||
|
|
||
|
BinlogDump.prototype.start = function(packet, connection) {
|
||
|
var packet = new Packets.BinlogDump(this.opts);
|
||
|
connection.writePacket(packet.toPacket(1));
|
||
|
return BinlogDump.prototype.binlogData;
|
||
|
};
|
||
|
|
||
|
function BinlogEventHeader(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();
|
||
|
}
|
||
|
|
||
|
function RotateEvent(packet) {
|
||
|
this.pposition = packet.readInt32();
|
||
|
// TODO: read uint64 here
|
||
|
var positionDword2 = packet.readInt32();
|
||
|
this.nextBinlog = packet.readString();
|
||
|
this.name = 'RotateEvent';
|
||
|
}
|
||
|
|
||
|
function FormatDescriptionEvent(packet) {
|
||
|
this.binlogVersion = packet.readInt16();
|
||
|
this.serverVersion = packet.readString(50).replace(/\u0000.*/, '');
|
||
|
this.createTimestamp = packet.readInt32();
|
||
|
this.eventHeaderLength = packet.readInt8(); // should be 19
|
||
|
this.eventsLength = packet.readBuffer();
|
||
|
this.name = 'FormatDescriptionEvent';
|
||
|
}
|
||
|
|
||
|
function QueryEvent(packet) {
|
||
|
|
||
|
var parseStatusVars = require('../packets/binlog_query_statusvars.js');
|
||
|
|
||
|
this.slaveProxyId = packet.readInt32();
|
||
|
this.executionTime = packet.readInt32();
|
||
|
var schemaLength = packet.readInt8();
|
||
|
this.errorCode = packet.readInt16();
|
||
|
var statusVarsLength = packet.readInt16();
|
||
|
var 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';
|
||
|
}
|
||
|
|
||
|
function XidEvent(packet) {
|
||
|
this.binlogVersion = packet.readInt16();
|
||
|
this.xid = packet.readInt64();
|
||
|
this.name = 'XidEvent';
|
||
|
}
|
||
|
|
||
|
var eventParsers = [];
|
||
|
|
||
|
eventParsers[2] = QueryEvent;
|
||
|
eventParsers[4] = RotateEvent;
|
||
|
eventParsers[15] = FormatDescriptionEvent;
|
||
|
eventParsers[16] = XidEvent;
|
||
|
|
||
|
BinlogDump.prototype.binlogData = function(packet) {
|
||
|
// ok - continue consuming events
|
||
|
// error - error
|
||
|
// eof - end of binlog
|
||
|
if (packet.isEOF()) {
|
||
|
this.emit('eof');
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
// binlog event header
|
||
|
var ok = packet.readInt8();
|
||
|
var header = new BinlogEventHeader(packet);
|
||
|
var EventParser = eventParsers[header.eventType];
|
||
|
var event;
|
||
|
if (EventParser)
|
||
|
event = new EventParser(packet);
|
||
|
else {
|
||
|
event = {
|
||
|
name: 'UNKNOWN'
|
||
|
}
|
||
|
}
|
||
|
event.header = header;
|
||
|
this.emit('event', event);
|
||
|
return BinlogDump.prototype.binlogData;
|
||
|
};
|
||
|
|
||
|
module.exports = BinlogDump;
|