binlog_query_statusvars.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // http://dev.mysql.com/doc/internals/en/query-event.html
  2. var keys = {
  3. FLAGS2: 0,
  4. SQL_MODE: 1,
  5. CATALOG: 2,
  6. AUTO_INCREMENT: 3,
  7. CHARSET: 4,
  8. TIME_ZONE: 5,
  9. CATALOG_NZ: 6,
  10. LC_TIME_NAMES: 7,
  11. CHARSET_DATABASE: 8,
  12. TABLE_MAP_FOR_UPDATE: 9,
  13. MASTER_DATA_WRITTEN: 10,
  14. INVOKERS: 11,
  15. UPDATED_DB_NAMES: 12,
  16. MICROSECONDS: 3
  17. };
  18. module.exports = function parseStatusVars(buffer) {
  19. var result = {};
  20. var offset = 0;
  21. var key, length, username, hostname, prevOffset;
  22. while(offset < buffer.length) {
  23. key = buffer[offset++];
  24. val = [key];
  25. switch(key) {
  26. case keys.FLAGS2:
  27. result.flags = buffer.readUInt32LE(offset);
  28. offset += 4; break;
  29. case keys.SQL_MODE:
  30. // value is 8 bytes, but all dcumented flags are in first 4 bytes
  31. result.sqlMode = buffer.readUInt32LE(offset);
  32. offset += 8;
  33. break;
  34. case keys.CATALOG:
  35. length = buffer[offset++];
  36. result.catalog = buffer.toString('utf8', offset, offset + length);
  37. offset += length + 1; // null byte after string
  38. break;
  39. case keys.CHARSET:
  40. result.clientCharset = buffer.readUInt16LE(offset);
  41. result.connectionCollation = buffer.readUInt16LE(offset + 2);
  42. result.serverCharset = buffer.readUInt16LE(offset + 4);
  43. offset += 6;
  44. break;
  45. case keys.TIME_ZONE:
  46. length = buffer[offset++];
  47. result.timeZone = buffer.toString('utf8', offset, offset + length);
  48. offset += length; // no null byte
  49. break;
  50. case keys.CATALOG_NZ:
  51. length = buffer[offset++];
  52. result.catalogNz = buffer.toString('utf8', offset, offset + length);
  53. offset += length ; // no null byte
  54. break;
  55. case keys.LC_TIME_NAMES:
  56. result.lcTimeNames = buffer.readUInt16LE(offset);
  57. offset += 2;
  58. break;
  59. case keys.CHARSET_DATABASE:
  60. result.schemaCharset = buffer.readUInt16LE(offset);
  61. offset += 2;
  62. break;
  63. case keys.TABLE_MAP_FOR_UPDATE:
  64. result.mapForUpdate1 = buffer.readUInt32LE(offset);
  65. result.mapForUpdate2 = buffer.readUInt32LE(offset + 4);
  66. offset += 8;
  67. break;
  68. case keys.MASTER_DATA_WRITTEN:
  69. result.masterDataWritten = buffer.readUInt32LE(offset);
  70. offset += 4;
  71. break;
  72. case keys.INVOKERS:
  73. length = buffer[offset++];
  74. result.invokerUsername = buffer.toString('utf8', offset, offset + length);
  75. offset += length;
  76. length = buffer[offset++];
  77. result.invokerHostname = buffer.toString('utf8', offset, offset + length);
  78. offset += length;
  79. break;
  80. case keys.UPDATED_DB_NAMES:
  81. length = buffer[offset++];
  82. // length - number of null-terminated strings
  83. result.updatedDBs = []; // we'll store them as array here
  84. for (; length; --length) {
  85. prevOffset = offset;
  86. // fast forward to null terminating byte
  87. while(buffer[offset++] && offset < buffer.length) {}
  88. result.updatedDBs.push(buffer.toString('utf8', prevOffset, offset-1));
  89. }
  90. break;
  91. case keys.MICROSECONDS:
  92. result.microseconds = buffer.readInt16LE(offset) + (buffsre[offset+2] << 16);
  93. offset += 3;
  94. }
  95. }
  96. return result;
  97. }