tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
121 lines (117 loc) • 3.07 kB
JavaScript
// Generated by CoffeeScript 1.7.1
var EventEmitter, types;
EventEmitter = require('events').EventEmitter;
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'
}
};
module.exports = function(buffer) {
var length, newValue, oldValue, port, protocol, routePacket, server, serverLen, type, typeNumber, valueLength;
length = buffer.readUInt16LE();
typeNumber = buffer.readUInt8();
type = types[typeNumber];
if (type) {
switch (type.name) {
case 'DATABASE':
case 'LANGUAGE':
case 'CHARSET':
case 'PACKET_SIZE':
case 'DATABASE_MIRRORING_PARTNER':
newValue = buffer.readBVarchar();
oldValue = buffer.readBVarchar();
break;
case 'SQL_COLLATION':
case 'BEGIN_TXN':
case 'COMMIT_TXN':
case 'ROLLBACK_TXN':
case 'RESET_CONNECTION':
valueLength = buffer.readUInt8();
newValue = buffer.readBuffer(valueLength);
valueLength = buffer.readUInt8();
oldValue = buffer.readBuffer(valueLength);
break;
case 'ROUTING_CHANGE':
valueLength = buffer.readUInt16LE();
routePacket = buffer.readBuffer(valueLength);
protocol = routePacket.readUInt8(0);
if (protocol !== 0) {
throw new Error('Unknown protocol byte in routing change event');
}
port = routePacket.readUInt16LE(1);
serverLen = routePacket.readUInt16LE(3);
server = routePacket.toString('ucs2', 5, 5 + (serverLen * 2));
newValue = {
protocol: protocol,
port: port,
server: server
};
valueLength = buffer.readUInt16LE();
oldValue = buffer.readBuffer(valueLength);
break;
default:
console.error("Tedious > Unsupported ENVCHANGE type " + typeNumber + " " + type.name + " at offset " + (buffer.position - 1));
buffer.readBuffer(length - 1);
return;
}
if (type.name === 'PACKET_SIZE') {
newValue = parseInt(newValue);
oldValue = parseInt(oldValue);
}
} else {
console.error("Tedious > Unsupported ENVCHANGE type " + typeNumber + " at offset " + (buffer.position - 1));
buffer.readBuffer(length - 1);
return;
}
return {
name: 'ENVCHANGE',
type: type.name,
event: type.event,
oldValue: oldValue,
newValue: newValue
};
};