Spaces:
Running
Running
; | |
// 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; | |
}; | |