Skip to content

Commit

Permalink
Parse nullable int column values.
Browse files Browse the repository at this point in the history
  • Loading branch information
pekim committed Nov 20, 2011
1 parent da56af7 commit 370ce8d
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 1 deletion.
2 changes: 2 additions & 0 deletions lib/token/colmetadata-token-parser.coffee
@@ -1,6 +1,7 @@
# s2.2.7.4

TYPE = require('./data-type').TYPE
sprintf = require('sprintf').sprintf

parser = (buffer, position) ->
startPosition = position
Expand All @@ -27,6 +28,7 @@ parser = (buffer, position) ->

if !type
error = "Unrecognised data type #{typeNumber} at offset #{position - 1}"
error = sprintf('Unrecognised data type 0x%02X at offset 0x%04X', typeNumber, (position - 1))
break

#console.log(type)
Expand Down
5 changes: 5 additions & 0 deletions lib/token/data-type.coffee
Expand Up @@ -62,6 +62,11 @@ TYPE =
dataLength: 8

# Variable-length types
0x26:
type: 'INTNTYPE'
name: 'IntN'
variableLength: true
dataLengthLength: 1
0xA7:
type: 'BIGVARCHR'
name: 'VarChar'
Expand Down
24 changes: 24 additions & 0 deletions lib/token/row-token-parser.coffee
Expand Up @@ -10,6 +10,8 @@ parser = (buffer, position, columnsMetaData) ->

columns = []
for columnMetaData in columnsMetaData
#console.log sprintf('Token @ 0x%02X', position)

isNull = false
type = columnMetaData.type
switch type.name
Expand All @@ -18,6 +20,27 @@ parser = (buffer, position, columnsMetaData) ->
return false
value = buffer.readUInt32LE(position)
position += type.dataLength
when 'IntN'
if buffer.length - position < 1
return false
dataLength = buffer.readUInt8(position)
position++

if buffer.length - position < dataLength
return false

#console.log dataLength, position
switch dataLength
when 0
isNull = true
when 1
value = buffer.readUInt8(position)
when 2
value = buffer.readUInt16LE(position)
when 4
value = buffer.readUInt32LE(position)

position += dataLength
when 'VarChar', 'Char'
if buffer.length - position < 2
return false
Expand Down Expand Up @@ -52,6 +75,7 @@ parser = (buffer, position, columnsMetaData) ->

columns.push(
value: value
isNull: isNull,
metadata: columnMetaData
)

Expand Down
38 changes: 37 additions & 1 deletion test/integration/connection-test.coffee
Expand Up @@ -25,7 +25,7 @@ exports.connect = (test) ->
)

exports.execSimpleSql = (test) ->
test.expect(12)
test.expect(15)

connection = new Connection(config.server, config.userName, config.password, config.options, (err, loggedIn) ->
test.ok(!err)
Expand All @@ -48,6 +48,10 @@ exports.execSimpleSql = (test) ->
test.strictEqual(columns[0].value, 8)
test.strictEqual(columns[1].value, 'abc')
test.strictEqual(columns[2].value, 'def')

test.strictEqual(columns[0].isNull, false)
test.strictEqual(columns[1].isNull, false)
test.strictEqual(columns[2].isNull, false)

byName = columns.byName()
test.strictEqual(byName.C1.value, 8)
Expand All @@ -59,6 +63,38 @@ exports.execSimpleSql = (test) ->
#console.log(message)
)

exports.execSqlReturningNulls = (test) ->
test.expect(11)

connection = new Connection(config.server, config.userName, config.password, config.options, (err, loggedIn) ->
test.ok(!err)
test.ok(loggedIn)

connection.execSql("select cast(null as int), cast(1 as int), cast(null as varchar(1)), cast(null as nvarchar(1))", (err, rowCount) ->
test.ok(!err)
test.strictEqual(rowCount, 1)
test.done()
)
)

connection.on('columnMetadata', (columnsMetadata) ->
test.strictEqual(columnsMetadata.length, 4)
)

connection.on('row', (columns) ->
test.strictEqual(columns.length, 4)

test.strictEqual(columns[0].isNull, true)
test.strictEqual(columns[1].isNull, false)
test.strictEqual(columns[1].value, 1)
test.strictEqual(columns[2].isNull, true)
test.strictEqual(columns[3].isNull, true)
)

connection.on('debug', (message) ->
#console.log(message)
)

exports.execSqlWithLotsOfRowsReturned = (test) ->
numberOfRows = 1000
rowsReceived = 0
Expand Down

0 comments on commit 370ce8d

Please sign in to comment.