190 lines
21 KiB
JavaScript
190 lines
21 KiB
JavaScript
|
|
"use strict";
|
||
|
|
|
||
|
|
Object.defineProperty(exports, "__esModule", {
|
||
|
|
value: true
|
||
|
|
});
|
||
|
|
exports.default = void 0;
|
||
|
|
var _collation = require("../collation");
|
||
|
|
var _token = require("./token");
|
||
|
|
var _helpers = require("./helpers");
|
||
|
|
const types = {
|
||
|
|
1: {
|
||
|
|
name: 'DATABASE',
|
||
|
|
event: 'databaseChange'
|
||
|
|
},
|
||
|
|
2: {
|
||
|
|
name: 'LANGUAGE',
|
||
|
|
event: 'languageChange'
|
||
|
|
},
|
||
|
|
3: {
|
||
|
|
name: 'CHARSET',
|
||
|
|
event: 'charsetChange'
|
||
|
|
},
|
||
|
|
4: {
|
||
|
|
name: 'PACKET_SIZE',
|
||
|
|
event: 'packetSizeChange'
|
||
|
|
},
|
||
|
|
7: {
|
||
|
|
name: 'SQL_COLLATION',
|
||
|
|
event: 'sqlCollationChange'
|
||
|
|
},
|
||
|
|
8: {
|
||
|
|
name: 'BEGIN_TXN',
|
||
|
|
event: 'beginTransaction'
|
||
|
|
},
|
||
|
|
9: {
|
||
|
|
name: 'COMMIT_TXN',
|
||
|
|
event: 'commitTransaction'
|
||
|
|
},
|
||
|
|
10: {
|
||
|
|
name: 'ROLLBACK_TXN',
|
||
|
|
event: 'rollbackTransaction'
|
||
|
|
},
|
||
|
|
13: {
|
||
|
|
name: 'DATABASE_MIRRORING_PARTNER',
|
||
|
|
event: 'partnerNode'
|
||
|
|
},
|
||
|
|
17: {
|
||
|
|
name: 'TXN_ENDED'
|
||
|
|
},
|
||
|
|
18: {
|
||
|
|
name: 'RESET_CONNECTION',
|
||
|
|
event: 'resetConnection'
|
||
|
|
},
|
||
|
|
20: {
|
||
|
|
name: 'ROUTING_CHANGE',
|
||
|
|
event: 'routingChange'
|
||
|
|
}
|
||
|
|
};
|
||
|
|
function _readNewAndOldValue(buf, offset, length, type) {
|
||
|
|
switch (type.name) {
|
||
|
|
case 'DATABASE':
|
||
|
|
case 'LANGUAGE':
|
||
|
|
case 'CHARSET':
|
||
|
|
case 'PACKET_SIZE':
|
||
|
|
case 'DATABASE_MIRRORING_PARTNER':
|
||
|
|
{
|
||
|
|
let newValue;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: newValue
|
||
|
|
} = (0, _helpers.readBVarChar)(buf, offset));
|
||
|
|
let oldValue;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: oldValue
|
||
|
|
} = (0, _helpers.readBVarChar)(buf, offset));
|
||
|
|
switch (type.name) {
|
||
|
|
case 'PACKET_SIZE':
|
||
|
|
return new _helpers.Result(new _token.PacketSizeEnvChangeToken(parseInt(newValue), parseInt(oldValue)), offset);
|
||
|
|
case 'DATABASE':
|
||
|
|
return new _helpers.Result(new _token.DatabaseEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
case 'LANGUAGE':
|
||
|
|
return new _helpers.Result(new _token.LanguageEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
case 'CHARSET':
|
||
|
|
return new _helpers.Result(new _token.CharsetEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
case 'DATABASE_MIRRORING_PARTNER':
|
||
|
|
return new _helpers.Result(new _token.DatabaseMirroringPartnerEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
}
|
||
|
|
throw new Error('unreachable');
|
||
|
|
}
|
||
|
|
case 'SQL_COLLATION':
|
||
|
|
case 'BEGIN_TXN':
|
||
|
|
case 'COMMIT_TXN':
|
||
|
|
case 'ROLLBACK_TXN':
|
||
|
|
case 'RESET_CONNECTION':
|
||
|
|
{
|
||
|
|
let newValue;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: newValue
|
||
|
|
} = (0, _helpers.readBVarByte)(buf, offset));
|
||
|
|
let oldValue;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: oldValue
|
||
|
|
} = (0, _helpers.readBVarByte)(buf, offset));
|
||
|
|
switch (type.name) {
|
||
|
|
case 'SQL_COLLATION':
|
||
|
|
{
|
||
|
|
const newCollation = newValue.length ? _collation.Collation.fromBuffer(newValue) : undefined;
|
||
|
|
const oldCollation = oldValue.length ? _collation.Collation.fromBuffer(oldValue) : undefined;
|
||
|
|
return new _helpers.Result(new _token.CollationChangeToken(newCollation, oldCollation), offset);
|
||
|
|
}
|
||
|
|
case 'BEGIN_TXN':
|
||
|
|
return new _helpers.Result(new _token.BeginTransactionEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
case 'COMMIT_TXN':
|
||
|
|
return new _helpers.Result(new _token.CommitTransactionEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
case 'ROLLBACK_TXN':
|
||
|
|
return new _helpers.Result(new _token.RollbackTransactionEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
case 'RESET_CONNECTION':
|
||
|
|
return new _helpers.Result(new _token.ResetConnectionEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
}
|
||
|
|
throw new Error('unreachable');
|
||
|
|
}
|
||
|
|
case 'ROUTING_CHANGE':
|
||
|
|
{
|
||
|
|
let routePacket;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: routePacket
|
||
|
|
} = (0, _helpers.readUsVarByte)(buf, offset));
|
||
|
|
let oldValue;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: oldValue
|
||
|
|
} = (0, _helpers.readUsVarByte)(buf, offset));
|
||
|
|
|
||
|
|
// Routing Change:
|
||
|
|
// Byte 1: Protocol (must be 0)
|
||
|
|
// Bytes 2-3 (USHORT): Port number
|
||
|
|
// Bytes 4-5 (USHORT): Length of server data in unicode (2byte chars)
|
||
|
|
// Bytes 6-*: Server name in unicode characters
|
||
|
|
const protocol = routePacket.readUInt8(0);
|
||
|
|
if (protocol !== 0) {
|
||
|
|
throw new Error('Unknown protocol byte in routing change event');
|
||
|
|
}
|
||
|
|
const port = routePacket.readUInt16LE(1);
|
||
|
|
const serverLen = routePacket.readUInt16LE(3);
|
||
|
|
// 2 bytes per char, starting at offset 5
|
||
|
|
const server = routePacket.toString('ucs2', 5, 5 + serverLen * 2);
|
||
|
|
const newValue = {
|
||
|
|
protocol: protocol,
|
||
|
|
port: port,
|
||
|
|
server: server
|
||
|
|
};
|
||
|
|
return new _helpers.Result(new _token.RoutingEnvChangeToken(newValue, oldValue), offset);
|
||
|
|
}
|
||
|
|
default:
|
||
|
|
{
|
||
|
|
console.error('Tedious > Unsupported ENVCHANGE type ' + type.name);
|
||
|
|
|
||
|
|
// skip unknown bytes
|
||
|
|
return new _helpers.Result(undefined, offset + length - 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function envChangeParser(buf, offset, _options) {
|
||
|
|
let tokenLength;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: tokenLength
|
||
|
|
} = (0, _helpers.readUInt16LE)(buf, offset));
|
||
|
|
if (buf.length < offset + tokenLength) {
|
||
|
|
throw new _helpers.NotEnoughDataError(offset + tokenLength);
|
||
|
|
}
|
||
|
|
let typeNumber;
|
||
|
|
({
|
||
|
|
offset,
|
||
|
|
value: typeNumber
|
||
|
|
} = (0, _helpers.readUInt8)(buf, offset));
|
||
|
|
const type = types[typeNumber];
|
||
|
|
if (!type) {
|
||
|
|
console.error('Tedious > Unsupported ENVCHANGE type ' + typeNumber);
|
||
|
|
return new _helpers.Result(undefined, offset + tokenLength - 1);
|
||
|
|
}
|
||
|
|
return _readNewAndOldValue(buf, offset, tokenLength, type);
|
||
|
|
}
|
||
|
|
var _default = exports.default = envChangeParser;
|
||
|
|
module.exports = envChangeParser;
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29sbGF0aW9uIiwicmVxdWlyZSIsIl90b2tlbiIsIl9oZWxwZXJzIiwidHlwZXMiLCJuYW1lIiwiZXZlbnQiLCJfcmVhZE5ld0FuZE9sZFZhbHVlIiwiYnVmIiwib2Zmc2V0IiwibGVuZ3RoIiwidHlwZSIsIm5ld1ZhbHVlIiwidmFsdWUiLCJyZWFkQlZhckNoYXIiLCJvbGRWYWx1ZSIsIlJlc3VsdCIsIlBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbiIsInBhcnNlSW50IiwiRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbiIsIkxhbmd1YWdlRW52Q2hhbmdlVG9rZW4iLCJDaGFyc2V0RW52Q2hhbmdlVG9rZW4iLCJEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbiIsIkVycm9yIiwicmVhZEJWYXJCeXRlIiwibmV3Q29sbGF0aW9uIiwiQ29sbGF0aW9uIiwiZnJvbUJ1ZmZlciIsInVuZGVmaW5lZCIsIm9sZENvbGxhdGlvbiIsIkNvbGxhdGlvbkNoYW5nZVRva2VuIiwiQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIiwiQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiIsIlJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiIsIlJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuIiwicm91dGVQYWNrZXQiLCJyZWFkVXNWYXJCeXRlIiwicHJvdG9jb2wiLCJyZWFkVUludDgiLCJwb3J0IiwicmVhZFVJbnQxNkxFIiwic2VydmVyTGVuIiwic2VydmVyIiwidG9TdHJpbmciLCJSb3V0aW5nRW52Q2hhbmdlVG9rZW4iLCJjb25zb2xlIiwiZXJyb3IiLCJlbnZDaGFuZ2VQYXJzZXIiLCJfb3B0aW9ucyIsInRva2VuTGVuZ3RoIiwiTm90RW5vdWdoRGF0YUVycm9yIiwidHlwZU51bWJlciIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vZW52LWNoYW5nZS10b2tlbi1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IENvbGxhdGlvbiB9IGZyb20gJy4uL2NvbGxhdGlvbic7XG5cbmltcG9ydCB7XG4gIERhdGFiYXNlRW52Q2hhbmdlVG9rZW4sXG4gIExhbmd1YWdlRW52Q2hhbmdlVG9rZW4sXG4gIENoYXJzZXRFbnZDaGFuZ2VUb2tlbixcbiAgUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuLFxuICBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4sXG4gIFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuLFxuICBSb3V0aW5nRW52Q2hhbmdlVG9rZW4sXG4gIENvbGxhdGlvbkNoYW5nZVRva2VuLFxuICB0eXBlIEVudkNoYW5nZVRva2VuXG59IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgeyBOb3RFbm91Z2hEYXRhRXJyb3IsIHJlYWRCVmFyQnl0ZSwgcmVhZEJWYXJDaGFyLCByZWFkVUludDE2TEUsIHJlYWRVSW50OCwgcmVhZFVzVmFyQnl0ZSwgUmVzdWx0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuY29uc3QgdHlwZXM6IHsgW2tleTogbnVtYmVyXTogeyBuYW1lOiBzdHJpbmcsIGV2ZW50Pzogc3RyaW5nIH19ID0ge1xuICAxOiB7XG4gICAgbmFtZTogJ0RBVEFCQVNFJyxcbiAgICBldmVudDogJ2RhdGFiYXNlQ2hhbmdlJ1xuICB9LFxuICAyOiB7XG4gICAgbmFtZTogJ0xBTkdVQUdFJyxcbiAgICBldmVudDogJ2xhbmd1YWdlQ2hhbmdlJ1xuICB9LFxuICAzOiB7XG4gICAgbmFtZTogJ0NIQVJTRVQnLFxuICAgIGV2ZW50OiAnY2hhcnNldENoYW5nZSdcbiAgfSxcbiAgNDoge1xuICAgIG5hbWU6ICdQQUNLRVRfU0laRScsXG4gICAgZXZlbnQ6ICdwYWNrZXRTaXplQ2hhbmdlJ1xuICB9LFxuICA3OiB7XG4gICAgbmFtZTogJ1NRTF9DT0xMQVRJT04nLFxuICAgIGV2ZW50OiAnc3FsQ29sbGF0aW9uQ2hhbmdlJ1xuICB9LFxuICA4OiB7XG4gICAgbmFtZTogJ0JFR0lOX1RYTicsXG4gICAgZXZlbnQ6ICdiZWdpblRyYW5zYWN0aW9uJ1xuICB9LFxuICA5OiB7XG4gICAgbmFtZTogJ0NPTU1JVF9UWE4nLFxuICAgIGV2ZW50OiAnY29tbWl0VHJhbnNhY3Rpb24nXG4gIH0sXG4gIDEwOiB7XG4gICAgbmFtZTogJ1JPTExCQUNLX1RYTicsXG4gICAgZXZlbnQ6ICdyb2xsYmFja1RyYW5zYWN0aW9uJ1xuICB9LFxuICAxMzoge1xuICAgIG5hbWU6ICdEQVRBQkFTRV9NSVJST1JJTkdfUEFSVE5FUicsXG4gICAgZXZlbnQ6ICdwYXJ0bmVyTm9kZSdcbiAgfSxcbiAgMTc6IHtcbiAgICBuYW1lOiAnVFhOX0VOREVEJ1xuICB9LFxuICAxODoge1xuICAgIG5hbWU6ICdSRVNFVF9DT05ORUNUSU9OJyxcbiAgICBldmVudDogJ3Jlc2V0Q29ubmVjdGlvbidcbiAgfSxcbiAgMjA6IHtcbiAgICBuYW1lOiAnUk9VVElOR19DSEFOR0UnLFxuICAgIGV2ZW50OiAncm91dGluZ0NoYW5nZSdcbiAgfVxufTtcblxuZnVuY3Rpb24gX3JlYWROZXdBbmRPbGRWYWx1ZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCB0eXBlOiB7IG5hbWU6IHN0cmluZywgZXZlbnQ/OiBzdHJpbmcgfSk6IFJlc3VsdDxFbnZDaGFuZ2VUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgIGNhc2UgJ0RBVEFCQVNFJzpcbiAgICBjYXNlICdMQU5HVUFHRSc6XG4gICAgY2FzZSAnQ0hBUlNFVCc6XG4gICAgY2FzZSAnUEFDS0VUX1NJWkUnOlxuICAgIGNhc2UgJ0RBVEFCQVNFX01JUlJPUklOR19QQVJUTkVSJzoge1xuICAgICAgbGV0IG5ld1ZhbHVlO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogbmV3VmFsdWUgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgb2xkVmFsdWU7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBvbGRWYWx1ZSB9ID0gcmVhZEJWYXJDaGFyKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAodHlwZS5uYW1lKSB7XG4gICAgICAgIGNhc2UgJ1BBQ0tFVF9TSVpFJzpcbiAgICAgICAgICByZXR
|