123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- '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;
- };
|