tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
91 lines (82 loc) • 2.57 kB
JavaScript
// Generated by CoffeeScript 1.7.1
var MYSTERY_HEADER_LENGTH, RETRIES, SQL_SERVER_BROWSER_PORT, TIMEOUT, dgram, parseBrowserResponse;
dgram = require('dgram');
SQL_SERVER_BROWSER_PORT = 1434;
TIMEOUT = 2 * 1000;
RETRIES = 3;
MYSTERY_HEADER_LENGTH = 3;
exports.instanceLookup = function(server, instanceName, callback, timeout, retries) {
var error, makeAttempt, message, retriesLeft, socket, timedOut, timer;
timeout = timeout || TIMEOUT;
retriesLeft = retries || RETRIES;
timer = void 0;
socket = void 0;
message = function(message, rinfo) {
var port;
if (timer) {
clearTimeout(timer);
timer = void 0;
}
message = message.toString('ascii', MYSTERY_HEADER_LENGTH);
port = parseBrowserResponse(message, instanceName);
socket.close();
if (port) {
return callback(void 0, port);
} else {
return callback("Port for " + instanceName + " not found in " + message);
}
};
error = function(err) {
if (timer) {
clearTimeout(timer);
timer = void 0;
}
socket.close();
return callback("Failed to lookup instance on " + server + " - " + err.message);
};
timedOut = function() {
timer = void 0;
socket.close();
return makeAttempt();
};
makeAttempt = function() {
var request;
if (retriesLeft > 0) {
retriesLeft--;
request = new Buffer([0x02]);
socket = dgram.createSocket('udp4');
socket.on('error', error);
socket.on('message', message);
socket.send(request, 0, request.length, SQL_SERVER_BROWSER_PORT, server);
return timer = setTimeout(timedOut, timeout);
} else {
return callback("Failed to get response from SQL Server Browser on " + server);
}
};
return makeAttempt();
};
parseBrowserResponse = function(response, instanceName) {
var getPort, instance, instances, name, p, parts, port, value, _i, _j, _len, _ref;
instances = response.split(';;');
for (_i = 0, _len = instances.length; _i < _len; _i++) {
instance = instances[_i];
parts = instance.split(';');
for (p = _j = 0, _ref = parts.length - 1; _j <= _ref; p = _j += 2) {
name = parts[p];
value = parts[p + 1];
if (name === 'tcp' && getPort) {
port = parseInt(value, 10);
return port;
}
if (name === 'InstanceName') {
if (value.toUpperCase() === instanceName.toUpperCase()) {
getPort = true;
} else {
getPort = false;
}
}
}
}
return void 0;
};
exports.parseBrowserResponse = parseBrowserResponse;