123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // http://dev.mysql.com/doc/internals/en/query-event.html
- var 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) {
- var result = {};
- var offset = 0;
- var key, length, username, hostname, prevOffset;
- while(offset < buffer.length) {
- key = buffer[offset++];
- val = [key];
- 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) {}
- result.updatedDBs.push(buffer.toString('utf8', prevOffset, offset-1));
- }
- break;
- case keys.MICROSECONDS:
- result.microseconds = buffer.readInt16LE(offset) + (buffsre[offset+2] << 16);
- offset += 3;
- }
- }
- return result;
- }
|