Skip to content

Commit

Permalink
Lookup an instance name using SQL Server Browser.
Browse files Browse the repository at this point in the history
Not yet used, other than by integration test.

Issue #20
  • Loading branch information
pekim committed Mar 18, 2012
1 parent a32e4ce commit 9e9724d
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 54 deletions.
71 changes: 71 additions & 0 deletions lib/instance-lookup.coffee
@@ -0,0 +1,71 @@
dgram = require('dgram')

SQL_SERVER_BROWSER_PORT = 1434
TIMEOUT = 2 * 1000
RETRIES = 3

module.exports = (server, instanceName, callback) ->
retriesLeft = RETRIES
timer = undefined
socket = undefined

message = (message, rinfo) ->
if timer
clearTimeout(timer)
timer = undefined

message = message.toString('ascii', 3)
parts = message.split(';')

for p in [0..parts.length - 1] by 2
name = parts[p]
value = parts[p + 1]

if (name == 'tcp' && getPort)
port = parseInt(value, 10)

if name == 'InstanceName'
if value.toUpperCase() == instanceName.toUpperCase()
getPort = true
else
getPort = false

socket.close()

if port
callback(undefined, port)
else
callback("Port for #{instanceName} not found in #{message}")

error = (err) ->
if timer
clearTimeout(timer)
timer = undefined

socket.close()

callback("Failed to lookup instance on #{server} : #{err}")

timeout = () ->
timer = undefined
socket.close()
makeAttempt()

makeAttempt = () ->
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)

timer = setTimeout(timeout, TIMEOUT)
else
callback("Failed to get response from SQL Server Browser on #{server}")

makeAttempt()

54 changes: 0 additions & 54 deletions test/integration/connection-test.coffee
Expand Up @@ -377,57 +377,3 @@ exports.execProcAsSql = (test) ->
connection.on('debug', (text) ->
#console.log(text)
)

###
exports.requestInfoErrorMessages = (test) ->
test.expect(9)
config = getConfig()
done = 0
request = new Request("use #{config.options.database}; select 1; select s;", (err) ->
test.ok(err)
connection.close()
)
request.on('done', (rowCount, more) ->
switch ++done
when 1
console.log 1
test.ok(more)
when 2
console.log 2
test.ok(more)
when 2
console.log 3
test.ok(!more)
)
connection = new Connection(config)
connection.on('connect', (err) ->
connection.execSql(request)
)
connection.on('end', (info) ->
test.done()
)
request.on('row', (columns) ->
console.log columns
)
connection.on('infoMessage', (info) ->
console.log("#{info.number} : #{info.message}")
)
connection.on('errorMessage', (error) ->
console.log("#{error.number} : #{error.message}")
)
connection.on('debug', (text) ->
#console.log(text)
)
###
39 changes: 39 additions & 0 deletions test/integration/instance-lookup-test.coffee
@@ -0,0 +1,39 @@
fs = require('fs')
instanceLookup = require('../../lib/instance-lookup')

getConfig = ->
server: JSON.parse(fs.readFileSync(process.env.HOME + '/.tedious/test-connection.json', 'utf8')).config.server
instanceName: JSON.parse(fs.readFileSync(process.env.HOME + '/.tedious/test-connection.json', 'utf8')).instanceName

exports.goodInstance = (test) ->
config = getConfig()

callback = (err, port) ->
test.ok(!err)
test.ok(port)

test.done()

instanceLookup(config.server, config.instanceName, callback)

exports.badInstance = (test) ->
config = getConfig()

callback = (err, port) ->
test.ok(err)
test.ok(!port)

test.done()

instanceLookup(config.server, 'badInstanceName', callback)

exports.badServer = (test) ->
config = getConfig()

callback = (err, port) ->
test.ok(err)
test.ok(!port)

test.done()

instanceLookup('badServer', config.instanceName, callback)

0 comments on commit 9e9724d

Please sign in to comment.