116 lines
3.4 KiB
JavaScript
116 lines
3.4 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
// http://dev.mysql.com/doc/internals/en/query-event.html
|
||
|
|
||
|
const keys = {
|
||
|
FLAGS2: 0,
|
||
|
SQL_MODE: 1,
|
||
|
CATALOG: 2,
|
||
|
AUTO_INCREMENT: 3,
|
||
|
CHARSET: 4,
|
||
|
TIME_ZONE: 5,
|
||
|
CATALOG_NZ: 6,
|
||
|
LC_TIME_NAMES: 7,
|
||
|
CHARSET_DATABASE: 8,
|
||
|
TABLE_MAP_FOR_UPDATE: 9,
|
||
|
MASTER_DATA_WRITTEN: 10,
|
||
|
INVOKERS: 11,
|
||
|
UPDATED_DB_NAMES: 12,
|
||
|
MICROSECONDS: 3
|
||
|
};
|
||
|
|
||
|
module.exports = function parseStatusVars(buffer) {
|
||
|
const result = {};
|
||
|
let offset = 0;
|
||
|
let key, length, prevOffset;
|
||
|
while (offset < buffer.length) {
|
||
|
key = buffer[offset++];
|
||
|
switch (key) {
|
||
|
case keys.FLAGS2:
|
||
|
result.flags = buffer.readUInt32LE(offset);
|
||
|
offset += 4;
|
||
|
break;
|
||
|
case keys.SQL_MODE:
|
||
|
// value is 8 bytes, but all dcumented flags are in first 4 bytes
|
||
|
result.sqlMode = buffer.readUInt32LE(offset);
|
||
|
offset += 8;
|
||
|
break;
|
||
|
case keys.CATALOG:
|
||
|
length = buffer[offset++];
|
||
|
result.catalog = buffer.toString('utf8', offset, offset + length);
|
||
|
offset += length + 1; // null byte after string
|
||
|
break;
|
||
|
case keys.CHARSET:
|
||
|
result.clientCharset = buffer.readUInt16LE(offset);
|
||
|
result.connectionCollation = buffer.readUInt16LE(offset + 2);
|
||
|
result.serverCharset = buffer.readUInt16LE(offset + 4);
|
||
|
offset += 6;
|
||
|
break;
|
||
|
case keys.TIME_ZONE:
|
||
|
length = buffer[offset++];
|
||
|
result.timeZone = buffer.toString('utf8', offset, offset + length);
|
||
|
offset += length; // no null byte
|
||
|
break;
|
||
|
case keys.CATALOG_NZ:
|
||
|
length = buffer[offset++];
|
||
|
result.catalogNz = buffer.toString('utf8', offset, offset + length);
|
||
|
offset += length; // no null byte
|
||
|
break;
|
||
|
case keys.LC_TIME_NAMES:
|
||
|
result.lcTimeNames = buffer.readUInt16LE(offset);
|
||
|
offset += 2;
|
||
|
break;
|
||
|
case keys.CHARSET_DATABASE:
|
||
|
result.schemaCharset = buffer.readUInt16LE(offset);
|
||
|
offset += 2;
|
||
|
break;
|
||
|
case keys.TABLE_MAP_FOR_UPDATE:
|
||
|
result.mapForUpdate1 = buffer.readUInt32LE(offset);
|
||
|
result.mapForUpdate2 = buffer.readUInt32LE(offset + 4);
|
||
|
offset += 8;
|
||
|
break;
|
||
|
case keys.MASTER_DATA_WRITTEN:
|
||
|
result.masterDataWritten = buffer.readUInt32LE(offset);
|
||
|
offset += 4;
|
||
|
break;
|
||
|
case keys.INVOKERS:
|
||
|
length = buffer[offset++];
|
||
|
result.invokerUsername = buffer.toString(
|
||
|
'utf8',
|
||
|
offset,
|
||
|
offset + length
|
||
|
);
|
||
|
offset += length;
|
||
|
length = buffer[offset++];
|
||
|
result.invokerHostname = buffer.toString(
|
||
|
'utf8',
|
||
|
offset,
|
||
|
offset + length
|
||
|
);
|
||
|
offset += length;
|
||
|
break;
|
||
|
case keys.UPDATED_DB_NAMES:
|
||
|
length = buffer[offset++];
|
||
|
// length - number of null-terminated strings
|
||
|
result.updatedDBs = []; // we'll store them as array here
|
||
|
for (; length; --length) {
|
||
|
prevOffset = offset;
|
||
|
// fast forward to null terminating byte
|
||
|
while (buffer[offset++] && offset < buffer.length) {
|
||
|
// empty body, everything inside while condition
|
||
|
}
|
||
|
result.updatedDBs.push(
|
||
|
buffer.toString('utf8', prevOffset, offset - 1)
|
||
|
);
|
||
|
}
|
||
|
break;
|
||
|
case keys.MICROSECONDS:
|
||
|
result.microseconds =
|
||
|
// REVIEW: INVALID UNKNOWN VARIABLE!
|
||
|
buffer.readInt16LE(offset) + (buffer[offset + 2] << 16);
|
||
|
offset += 3;
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
};
|