env-change-token-parser.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _token = require("./token");
  7. const types = {
  8. 1: {
  9. name: 'DATABASE',
  10. event: 'databaseChange'
  11. },
  12. 2: {
  13. name: 'LANGUAGE',
  14. event: 'languageChange'
  15. },
  16. 3: {
  17. name: 'CHARSET',
  18. event: 'charsetChange'
  19. },
  20. 4: {
  21. name: 'PACKET_SIZE',
  22. event: 'packetSizeChange'
  23. },
  24. 7: {
  25. name: 'SQL_COLLATION',
  26. event: 'sqlCollationChange'
  27. },
  28. 8: {
  29. name: 'BEGIN_TXN',
  30. event: 'beginTransaction'
  31. },
  32. 9: {
  33. name: 'COMMIT_TXN',
  34. event: 'commitTransaction'
  35. },
  36. 10: {
  37. name: 'ROLLBACK_TXN',
  38. event: 'rollbackTransaction'
  39. },
  40. 13: {
  41. name: 'DATABASE_MIRRORING_PARTNER',
  42. event: 'partnerNode'
  43. },
  44. 17: {
  45. name: 'TXN_ENDED'
  46. },
  47. 18: {
  48. name: 'RESET_CONNECTION',
  49. event: 'resetConnection'
  50. },
  51. 20: {
  52. name: 'ROUTING_CHANGE',
  53. event: 'routingChange'
  54. }
  55. };
  56. function readNewAndOldValue(parser, length, type, callback) {
  57. switch (type.name) {
  58. case 'DATABASE':
  59. case 'LANGUAGE':
  60. case 'CHARSET':
  61. case 'PACKET_SIZE':
  62. case 'DATABASE_MIRRORING_PARTNER':
  63. return parser.readBVarChar(newValue => {
  64. parser.readBVarChar(oldValue => {
  65. switch (type.name) {
  66. case 'PACKET_SIZE':
  67. return callback(new _token.PacketSizeEnvChangeToken(parseInt(newValue), parseInt(oldValue)));
  68. case 'DATABASE':
  69. return callback(new _token.DatabaseEnvChangeToken(newValue, oldValue));
  70. case 'LANGUAGE':
  71. return callback(new _token.LanguageEnvChangeToken(newValue, oldValue));
  72. case 'CHARSET':
  73. return callback(new _token.CharsetEnvChangeToken(newValue, oldValue));
  74. case 'DATABASE_MIRRORING_PARTNER':
  75. return callback(new _token.DatabaseMirroringPartnerEnvChangeToken(newValue, oldValue));
  76. }
  77. });
  78. });
  79. case 'SQL_COLLATION':
  80. case 'BEGIN_TXN':
  81. case 'COMMIT_TXN':
  82. case 'ROLLBACK_TXN':
  83. case 'RESET_CONNECTION':
  84. return parser.readBVarByte(newValue => {
  85. parser.readBVarByte(oldValue => {
  86. switch (type.name) {
  87. case 'SQL_COLLATION':
  88. return callback(new _token.CollationChangeToken(newValue, oldValue));
  89. case 'BEGIN_TXN':
  90. return callback(new _token.BeginTransactionEnvChangeToken(newValue, oldValue));
  91. case 'COMMIT_TXN':
  92. return callback(new _token.CommitTransactionEnvChangeToken(newValue, oldValue));
  93. case 'ROLLBACK_TXN':
  94. return callback(new _token.RollbackTransactionEnvChangeToken(newValue, oldValue));
  95. case 'RESET_CONNECTION':
  96. return callback(new _token.ResetConnectionEnvChangeToken(newValue, oldValue));
  97. }
  98. });
  99. });
  100. case 'ROUTING_CHANGE':
  101. return parser.readUInt16LE(valueLength => {
  102. // Routing Change:
  103. // Byte 1: Protocol (must be 0)
  104. // Bytes 2-3 (USHORT): Port number
  105. // Bytes 4-5 (USHORT): Length of server data in unicode (2byte chars)
  106. // Bytes 6-*: Server name in unicode characters
  107. parser.readBuffer(valueLength, routePacket => {
  108. const protocol = routePacket.readUInt8(0);
  109. if (protocol !== 0) {
  110. return parser.emit('error', new Error('Unknown protocol byte in routing change event'));
  111. }
  112. const port = routePacket.readUInt16LE(1);
  113. const serverLen = routePacket.readUInt16LE(3); // 2 bytes per char, starting at offset 5
  114. const server = routePacket.toString('ucs2', 5, 5 + serverLen * 2);
  115. const newValue = {
  116. protocol: protocol,
  117. port: port,
  118. server: server
  119. };
  120. parser.readUInt16LE(oldValueLength => {
  121. parser.readBuffer(oldValueLength, oldValue => {
  122. callback(new _token.RoutingEnvChangeToken(newValue, oldValue));
  123. });
  124. });
  125. });
  126. });
  127. default:
  128. console.error('Tedious > Unsupported ENVCHANGE type ' + type.name); // skip unknown bytes
  129. parser.readBuffer(length - 1, () => {
  130. callback(undefined);
  131. });
  132. }
  133. }
  134. function envChangeParser(parser, _colMetadata, _options, callback) {
  135. parser.readUInt16LE(length => {
  136. parser.readUInt8(typeNumber => {
  137. const type = types[typeNumber];
  138. if (!type) {
  139. console.error('Tedious > Unsupported ENVCHANGE type ' + typeNumber); // skip unknown bytes
  140. return parser.readBuffer(length - 1, () => {
  141. callback(undefined);
  142. });
  143. }
  144. readNewAndOldValue(parser, length, type, token => {
  145. callback(token);
  146. });
  147. });
  148. });
  149. }
  150. var _default = envChangeParser;
  151. exports.default = _default;
  152. module.exports = envChangeParser;