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