Skip to content

Commit bd0ca78

Browse files
author
Suraiya Hameed
committed
feat: add flag parsing and tests for returnvalue token
1 parent afdb800 commit bd0ca78

File tree

3 files changed

+32
-62
lines changed

3 files changed

+32
-62
lines changed

src/tokens/returnvalue/index.js

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,6 @@ class ReturnValueToken extends Token {
88
paramName: ?string
99
status: ?number
1010
userType: ?number
11-
// TODO: parser flag
12-
flags: {
13-
nullable: ?boolean,
14-
caseSensitive: ?boolean,
15-
updateable: ?boolean,
16-
identity: ?boolean,
17-
computed: ?boolean,
18-
reservedODBC: ?boolean,
19-
fixedLenCLRType: ?boolean,
20-
encrypted: ?boolean
21-
}
2211
typeInfo: ?TypeInfo
2312
valueLength: ?number
2413
value: ?any
@@ -30,16 +19,6 @@ class ReturnValueToken extends Token {
3019
this.paramName = undefined;
3120
this.status = undefined;
3221
this.userType = undefined;
33-
this.flags = {
34-
nullable: undefined,
35-
caseSensitive: undefined,
36-
updateable: undefined,
37-
identity: undefined,
38-
computed: undefined,
39-
reservedODBC: undefined,
40-
fixedLenCLRType: undefined,
41-
encrypted: undefined
42-
};
4322
this.typeInfo = undefined;
4423
this.valueLength = undefined;
4524
this.value = undefined;

src/tokens/returnvalue/read.js

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -59,48 +59,16 @@ function parseUserType_7_2(reader: Reader) {
5959
}
6060

6161
function parseFlags(reader: Reader) {
62-
if (reader.version < 0x72090002) {
63-
return parseFlags_7_0;
64-
} else if (reader.version < 0x74000004) {
65-
return parseFlags_7_2;
66-
} else {
67-
return parseFlags_7_4;
68-
}
69-
}
70-
71-
72-
function parseFlags_7_0(reader: Reader) {
62+
// for RETURNVALUE_TOKEN all the flags should be zero (TDS 2.2.7.18)
7363
if (!reader.bytesAvailable(2)) {
7464
return;
7565
}
7666

77-
// TODO: Implement flag parsing
7867
const flags = reader.readUInt16LE(0); // eslint-disable-line no-unused-vars
7968
reader.consumeBytes(2);
8069

81-
return parseTypeInfo;
82-
}
83-
84-
function parseFlags_7_2(reader: Reader) {
85-
if (!reader.bytesAvailable(2)) {
86-
return;
87-
}
88-
89-
// TODO: Implement flag parsing
90-
const flags = reader.readUInt16LE(0); // eslint-disable-line no-unused-vars
91-
reader.consumeBytes(2);
92-
93-
return parseTypeInfo;
94-
}
95-
96-
function parseFlags_7_4(reader: Reader) {
97-
if (!reader.bytesAvailable(2)) {
98-
return;
99-
}
100-
101-
// TODO: Implement flag parsing
102-
const flags = reader.readUInt16LE(0); // eslint-disable-line no-unused-vars
103-
reader.consumeBytes(2);
70+
if (0 != flags)
71+
throw new Error('Unknown flags in RETURNVALUE_TOKEN ');
10472

10573
return parseTypeInfo;
10674
}

test/returnValue-test.js

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ describe('Parsing a RETURNVALUE token', function() {
1515

1616
describe('in TDS 7.0 mode', function() {
1717

18-
let reader, data, paramOrdinal, paramName, status, userType, typeid, dataLength, value, offset, tempBuff;
18+
let reader, data, paramOrdinal, paramName, status, userType, flag, typeid, dataLength, value, offset, tempBuff;
1919

2020
before(function() {
2121
paramOrdinal = 1;
2222
paramName = '@count';
2323
status = 1;
2424
userType = 0;
25+
flag = 0;
2526
typeid = 0x26;
2627
value = 4;
2728
offset = 0;
@@ -60,8 +61,7 @@ describe('Parsing a RETURNVALUE token', function() {
6061
tempBuff.writeUInt8(status, offset++);
6162
tempBuff.writeUInt16LE(userType, offset);
6263
offset += 2;
63-
// Flag
64-
tempBuff.writeUInt16LE(0, offset);
64+
tempBuff.writeUInt16LE(flag, offset);
6565
offset += 2;
6666
}
6767

@@ -82,19 +82,43 @@ describe('Parsing a RETURNVALUE token', function() {
8282
addListners(done, token);
8383
reader.end(data);
8484
});
85+
86+
it('should throw exception on receiving non-zero flag', function(done) {
87+
dataLength = 4;
88+
89+
data = Buffer.alloc(28);
90+
tempBuff.copy(data, 0, 0, offset - 2);
91+
92+
// write non-zero flag
93+
data.writeUInt16LE(56, offset - 2);
94+
95+
// TYPE_INFO
96+
data.writeUInt8(typeid, offset++);
97+
data.writeUInt8(dataLength, offset++);
98+
99+
// TYPE_VARBYTE
100+
data.writeUInt8(dataLength, offset++);
101+
data.writeUInt32LE(value, offset);
102+
const token = {};
103+
104+
addListners(done, token);
105+
assert.throw(() => reader.end(data), Error, 'Unknown flags in RETURNVALUE_TOKEN');
106+
done();
107+
});
85108
});
86109

87110
describe('in TDS 7.2 mode', function() {
88111

89112
describe('test INTNTYPE', function() {
90113

91-
let reader, data, paramOrdinal, paramName, status, userType, typeid, dataLength, value, offset, tempBuff, tempOffset;
114+
let reader, data, paramOrdinal, paramName, status, userType, flag, typeid, dataLength, value, offset, tempBuff, tempOffset;
92115

93116
before(function() {
94117
paramOrdinal = 1;
95118
paramName = '@count';
96119
status = 1;
97120
userType = 0;
121+
flag = 0;
98122
typeid = 0x26;
99123
value = 4;
100124
tempOffset = 0;
@@ -133,8 +157,7 @@ describe('Parsing a RETURNVALUE token', function() {
133157
tempBuff.writeUInt8(status, tempOffset++);
134158
tempBuff.writeUInt32LE(userType, tempOffset);
135159
tempOffset += 4;
136-
// Flag
137-
tempBuff.writeUInt16LE(0, tempOffset);
160+
tempBuff.writeUInt16LE(flag, tempOffset);
138161
tempOffset += 2;
139162
}
140163

0 commit comments

Comments
 (0)