tedious 1.12.3 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +1 -1
  2. package/appveyor.yml +9 -5
  3. package/benchmarks/README.md +33 -0
  4. package/benchmarks/common.js +82 -0
  5. package/benchmarks/index.js +34 -0
  6. package/benchmarks/query/many-result-rows.js +49 -0
  7. package/benchmarks/query/nvarchar-large.js +44 -0
  8. package/benchmarks/query/nvarchar-small.js +44 -0
  9. package/benchmarks/query/varbinary-4.js +42 -0
  10. package/benchmarks/query/varbinary-huge.js +46 -0
  11. package/benchmarks/query/varbinary-large.js +46 -0
  12. package/benchmarks/query/varbinary-small.js +42 -0
  13. package/benchmarks/token-parser/colmetadata-token.js +42 -0
  14. package/benchmarks/token-parser/done-token.js +42 -0
  15. package/benchmarks/token-parser/simple-tokens.js +366 -0
  16. package/lib/all-headers.js +9 -11
  17. package/lib/buffertools.js +17 -13
  18. package/lib/bulk-load.js +196 -169
  19. package/lib/collation.js +80 -2
  20. package/lib/connection.js +1086 -1060
  21. package/lib/data-type.js +450 -253
  22. package/lib/debug.js +57 -51
  23. package/lib/errors.js +40 -55
  24. package/lib/guid-parser.js +12 -36
  25. package/lib/instance-lookup.js +57 -54
  26. package/lib/library.js +3 -2
  27. package/lib/login7-payload.js +187 -180
  28. package/lib/message-io.js +169 -199
  29. package/lib/metadata-parser.js +169 -255
  30. package/lib/ntlm-payload.js +173 -160
  31. package/lib/packet.js +166 -152
  32. package/lib/prelogin-payload.js +170 -160
  33. package/lib/request.js +122 -122
  34. package/lib/rpcrequest-payload.js +64 -38
  35. package/lib/special-stored-procedure.js +3 -2
  36. package/lib/sqlbatch-payload.js +20 -16
  37. package/lib/stream-parser.js +116 -104
  38. package/lib/tds-versions.js +5 -8
  39. package/lib/tedious.js +8 -14
  40. package/lib/token/colmetadata-token-parser.js +79 -125
  41. package/lib/token/done-token-parser.js +47 -129
  42. package/lib/token/env-change-token-parser.js +90 -126
  43. package/lib/token/infoerror-token-parser.js +47 -125
  44. package/lib/token/loginack-token-parser.js +36 -74
  45. package/lib/token/nbcrow-token-parser.js +40 -64
  46. package/lib/token/order-token-parser.js +26 -43
  47. package/lib/token/returnstatus-token-parser.js +11 -23
  48. package/lib/token/returnvalue-token-parser.js +31 -54
  49. package/lib/token/row-token-parser.js +39 -52
  50. package/lib/token/sspi-token-parser.js +14 -32
  51. package/lib/token/stream-parser.js +424 -304
  52. package/lib/token/token-stream-parser.js +39 -34
  53. package/lib/token/token.js +3 -6
  54. package/lib/tracking-buffer/bigint.js +45 -48
  55. package/lib/tracking-buffer/readable-tracking-buffer.js +238 -223
  56. package/lib/tracking-buffer/tracking-buffer.js +3 -9
  57. package/lib/tracking-buffer/writable-tracking-buffer.js +272 -244
  58. package/lib/transaction.js +112 -102
  59. package/lib/value-parser.js +559 -1154
  60. package/package.json +10 -9
  61. package/benchmarks/benchmarks.coffee +0 -122
  62. package/benchmarks/query.coffee +0 -57
package/lib/data-type.js CHANGED
@@ -1,36 +1,36 @@
1
- // Generated by CoffeeScript 1.10.0
2
- var EPOCH_DATE, MAX, NULL, TYPE, UTC_EPOCH_DATE, UTC_YEAR_ONE, YEAR_ONE, alias, guidParser, i, id, len, ref, type, typeByName;
1
+ 'use strict';
3
2
 
4
- guidParser = require('./guid-parser');
3
+ var guidParser = require('./guid-parser');
5
4
 
6
- NULL = (1 << 16) - 1;
5
+ var NULL = (1 << 16) - 1;
6
+ var EPOCH_DATE = new Date(1900, 0, 1);
7
+ var UTC_EPOCH_DATE = new Date(Date.UTC(1900, 0, 1));
8
+ var YEAR_ONE = new Date(2000, 0, -730118);
9
+ var UTC_YEAR_ONE = Date.UTC(2000, 0, -730118);
10
+ var MAX = (1 << 16) - 1;
7
11
 
8
- EPOCH_DATE = new Date(1900, 0, 1);
12
+ var typeByName = module.exports.typeByName = {};
9
13
 
10
- UTC_EPOCH_DATE = new Date(Date.UTC(1900, 0, 1));
11
-
12
- YEAR_ONE = new Date(2000, 0, -730118);
13
-
14
- UTC_YEAR_ONE = Date.UTC(2000, 0, -730118);
15
-
16
- MAX = (1 << 16) - 1;
17
-
18
- TYPE = {
14
+ var TYPE = module.exports.TYPE = {
19
15
  0x1F: {
20
16
  type: 'NULL',
21
17
  name: 'Null'
22
18
  },
19
+
23
20
  0x30: {
24
21
  type: 'INT1',
25
22
  name: 'TinyInt',
26
- declaration: function (parameter) {
23
+
24
+ declaration: function declaration() {
27
25
  return 'tinyint';
28
26
  },
29
- writeTypeInfo: function (buffer) {
27
+
28
+ writeTypeInfo: function writeTypeInfo(buffer) {
30
29
  buffer.writeUInt8(typeByName.IntN.id);
31
30
  return buffer.writeUInt8(1);
32
31
  },
33
- writeParameterData: function (buffer, parameter) {
32
+
33
+ writeParameterData: function writeParameterData(buffer, parameter) {
34
34
  if (parameter.value != null) {
35
35
  buffer.writeUInt8(1);
36
36
  return buffer.writeUInt8(parseInt(parameter.value));
@@ -38,31 +38,36 @@ TYPE = {
38
38
  return buffer.writeUInt8(0);
39
39
  }
40
40
  },
41
- validate: function (value) {
41
+
42
+ validate: function validate(value) {
42
43
  if (value == null) {
43
44
  return null;
44
45
  }
45
46
  value = parseInt(value);
46
47
  if (isNaN(value)) {
47
- return new TypeError("Invalid number.");
48
+ return new TypeError('Invalid number.');
48
49
  }
49
50
  if (value < 0 || value > 255) {
50
- return new TypeError("Value must be between 0 and 255.");
51
+ return new TypeError('Value must be between 0 and 255.');
51
52
  }
52
53
  return value;
53
54
  }
54
55
  },
56
+
55
57
  0x32: {
56
58
  type: 'BIT',
57
59
  name: 'Bit',
58
- declaration: function (parameter) {
60
+
61
+ declaration: function declaration() {
59
62
  return 'bit';
60
63
  },
61
- writeTypeInfo: function (buffer) {
64
+
65
+ writeTypeInfo: function writeTypeInfo(buffer) {
62
66
  buffer.writeUInt8(typeByName.BitN.id);
63
67
  return buffer.writeUInt8(1);
64
68
  },
65
- writeParameterData: function (buffer, parameter) {
69
+
70
+ writeParameterData: function writeParameterData(buffer, parameter) {
66
71
  if (typeof parameter.value === 'undefined' || parameter.value === null) {
67
72
  return buffer.writeUInt8(0);
68
73
  } else {
@@ -70,7 +75,8 @@ TYPE = {
70
75
  return buffer.writeUInt8(parameter.value ? 1 : 0);
71
76
  }
72
77
  },
73
- validate: function (value) {
78
+
79
+ validate: function validate(value) {
74
80
  if (value == null) {
75
81
  return null;
76
82
  }
@@ -81,17 +87,21 @@ TYPE = {
81
87
  }
82
88
  }
83
89
  },
90
+
84
91
  0x34: {
85
92
  type: 'INT2',
86
93
  name: 'SmallInt',
87
- declaration: function (parameter) {
94
+
95
+ declaration: function declaration() {
88
96
  return 'smallint';
89
97
  },
90
- writeTypeInfo: function (buffer) {
98
+
99
+ writeTypeInfo: function writeTypeInfo(buffer) {
91
100
  buffer.writeUInt8(typeByName.IntN.id);
92
101
  return buffer.writeUInt8(2);
93
102
  },
94
- writeParameterData: function (buffer, parameter) {
103
+
104
+ writeParameterData: function writeParameterData(buffer, parameter) {
95
105
  if (parameter.value != null) {
96
106
  buffer.writeUInt8(2);
97
107
  return buffer.writeInt16LE(parseInt(parameter.value));
@@ -99,31 +109,36 @@ TYPE = {
99
109
  return buffer.writeUInt8(0);
100
110
  }
101
111
  },
102
- validate: function (value) {
112
+
113
+ validate: function validate(value) {
103
114
  if (value == null) {
104
115
  return null;
105
116
  }
106
117
  value = parseInt(value);
107
118
  if (isNaN(value)) {
108
- return new TypeError("Invalid number.");
119
+ return new TypeError('Invalid number.');
109
120
  }
110
121
  if (value < -32768 || value > 32767) {
111
- return new TypeError("Value must be between -32768 and 32767.");
122
+ return new TypeError('Value must be between -32768 and 32767.');
112
123
  }
113
124
  return value;
114
125
  }
115
126
  },
127
+
116
128
  0x38: {
117
129
  type: 'INT4',
118
130
  name: 'Int',
119
- declaration: function (parameter) {
131
+
132
+ declaration: function declaration() {
120
133
  return 'int';
121
134
  },
122
- writeTypeInfo: function (buffer) {
135
+
136
+ writeTypeInfo: function writeTypeInfo(buffer) {
123
137
  buffer.writeUInt8(typeByName.IntN.id);
124
138
  return buffer.writeUInt8(4);
125
139
  },
126
- writeParameterData: function (buffer, parameter) {
140
+
141
+ writeParameterData: function writeParameterData(buffer, parameter) {
127
142
  if (parameter.value != null) {
128
143
  buffer.writeUInt8(4);
129
144
  return buffer.writeInt32LE(parseInt(parameter.value));
@@ -131,33 +146,40 @@ TYPE = {
131
146
  return buffer.writeUInt8(0);
132
147
  }
133
148
  },
134
- validate: function (value) {
149
+
150
+ validate: function validate(value) {
135
151
  if (value == null) {
136
152
  return null;
137
153
  }
138
154
  value = parseInt(value);
139
155
  if (isNaN(value)) {
140
- return new TypeError("Invalid number.");
156
+ return new TypeError('Invalid number.');
141
157
  }
142
158
  if (value < -2147483648 || value > 2147483647) {
143
- return new TypeError("Value must be between -2147483648 and 2147483647.");
159
+ return new TypeError('Value must be between -2147483648 and 2147483647.');
144
160
  }
145
161
  return value;
146
162
  }
147
163
  },
164
+
148
165
  0x3A: {
149
166
  type: 'DATETIM4',
150
167
  name: 'SmallDateTime',
151
- declaration: function (parameter) {
168
+
169
+ declaration: function declaration() {
152
170
  return 'smalldatetime';
153
171
  },
154
- writeTypeInfo: function (buffer) {
172
+
173
+ writeTypeInfo: function writeTypeInfo(buffer) {
155
174
  buffer.writeUInt8(typeByName.DateTimeN.id);
156
175
  return buffer.writeUInt8(4);
157
176
  },
158
- writeParameterData: function (buffer, parameter, options) {
159
- var days, dstDiff, minutes;
177
+
178
+ writeParameterData: function writeParameterData(buffer, parameter, options) {
160
179
  if (parameter.value != null) {
180
+ var days = undefined,
181
+ dstDiff = undefined,
182
+ minutes = undefined;
161
183
  if (options.useUTC) {
162
184
  days = Math.floor((parameter.value.getTime() - UTC_EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24));
163
185
  minutes = parameter.value.getUTCHours() * 60 + parameter.value.getUTCMinutes();
@@ -166,37 +188,47 @@ TYPE = {
166
188
  days = Math.floor((parameter.value.getTime() - EPOCH_DATE.getTime() + dstDiff) / (1000 * 60 * 60 * 24));
167
189
  minutes = parameter.value.getHours() * 60 + parameter.value.getMinutes();
168
190
  }
191
+
169
192
  buffer.writeUInt8(4);
170
193
  buffer.writeUInt16LE(days);
194
+
171
195
  return buffer.writeUInt16LE(minutes);
172
196
  } else {
173
197
  return buffer.writeUInt8(0);
174
198
  }
175
199
  },
176
- validate: function (value) {
200
+
201
+ validate: function validate(value) {
177
202
  if (value == null) {
178
203
  return null;
179
204
  }
205
+
180
206
  if (!(value instanceof Date)) {
181
207
  value = Date.parse(value);
182
208
  }
209
+
183
210
  if (isNaN(value)) {
184
- return new TypeError("Invalid date.");
211
+ return new TypeError('Invalid date.');
185
212
  }
213
+
186
214
  return value;
187
215
  }
188
216
  },
217
+
189
218
  0x3B: {
190
219
  type: 'FLT4',
191
220
  name: 'Real',
192
- declaration: function (parameter) {
221
+
222
+ declaration: function declaration() {
193
223
  return 'real';
194
224
  },
195
- writeTypeInfo: function (buffer) {
225
+
226
+ writeTypeInfo: function writeTypeInfo(buffer) {
196
227
  buffer.writeUInt8(typeByName.FloatN.id);
197
228
  return buffer.writeUInt8(4);
198
229
  },
199
- writeParameterData: function (buffer, parameter) {
230
+
231
+ writeParameterData: function writeParameterData(buffer, parameter) {
200
232
  if (parameter.value != null) {
201
233
  buffer.writeUInt8(4);
202
234
  return buffer.writeFloatLE(parseFloat(parameter.value));
@@ -204,28 +236,33 @@ TYPE = {
204
236
  return buffer.writeUInt8(0);
205
237
  }
206
238
  },
207
- validate: function (value) {
239
+
240
+ validate: function validate(value) {
208
241
  if (value == null) {
209
242
  return null;
210
243
  }
211
244
  value = parseFloat(value);
212
245
  if (isNaN(value)) {
213
- return new TypeError("Invalid number.");
246
+ return new TypeError('Invalid number.');
214
247
  }
215
248
  return value;
216
249
  }
217
250
  },
251
+
218
252
  0x3C: {
219
253
  type: 'MONEY',
220
254
  name: 'Money',
221
- declaration: function (parameter) {
222
- return "money";
255
+
256
+ declaration: function declaration() {
257
+ return 'money';
223
258
  },
224
- writeTypeInfo: function (buffer, parameter) {
259
+
260
+ writeTypeInfo: function writeTypeInfo(buffer) {
225
261
  buffer.writeUInt8(typeByName.MoneyN.id);
226
262
  return buffer.writeUInt8(8);
227
263
  },
228
- writeParameterData: function (buffer, parameter) {
264
+
265
+ writeParameterData: function writeParameterData(buffer, parameter) {
229
266
  if (parameter.value != null) {
230
267
  buffer.writeUInt8(8);
231
268
  return buffer.writeMoney(parameter.value * 10000);
@@ -233,30 +270,39 @@ TYPE = {
233
270
  return buffer.writeUInt8(0);
234
271
  }
235
272
  },
236
- validate: function (value) {
273
+
274
+ validate: function validate(value) {
237
275
  if (value == null) {
238
276
  return null;
239
277
  }
240
278
  value = parseFloat(value);
241
279
  if (isNaN(value)) {
242
- return new TypeError("Invalid number.");
280
+ return new TypeError('Invalid number.');
243
281
  }
244
282
  return value;
245
283
  }
246
284
  },
285
+
247
286
  0x3D: {
248
287
  type: 'DATETIME',
249
288
  name: 'DateTime',
250
- declaration: function (parameter) {
289
+
290
+ declaration: function declaration() {
251
291
  return 'datetime';
252
292
  },
253
- writeTypeInfo: function (buffer) {
293
+
294
+ writeTypeInfo: function writeTypeInfo(buffer) {
254
295
  buffer.writeUInt8(typeByName.DateTimeN.id);
255
296
  return buffer.writeUInt8(8);
256
297
  },
257
- writeParameterData: function (buffer, parameter, options) {
258
- var days, dstDiff, milliseconds, seconds, threeHundredthsOfSecond;
298
+
299
+ writeParameterData: function writeParameterData(buffer, parameter, options) {
259
300
  if (parameter.value != null) {
301
+ var days = undefined,
302
+ dstDiff = undefined,
303
+ milliseconds = undefined,
304
+ seconds = undefined,
305
+ threeHundredthsOfSecond = undefined;
260
306
  if (options.useUTC) {
261
307
  days = Math.floor((parameter.value.getTime() - UTC_EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24));
262
308
  seconds = parameter.value.getUTCHours() * 60 * 60;
@@ -271,16 +317,20 @@ TYPE = {
271
317
  seconds += parameter.value.getSeconds();
272
318
  milliseconds = seconds * 1000 + parameter.value.getMilliseconds();
273
319
  }
320
+
274
321
  threeHundredthsOfSecond = milliseconds / (3 + 1 / 3);
275
322
  threeHundredthsOfSecond = Math.floor(threeHundredthsOfSecond);
323
+
276
324
  buffer.writeUInt8(8);
277
325
  buffer.writeInt32LE(days);
326
+
278
327
  return buffer.writeUInt32LE(threeHundredthsOfSecond);
279
328
  } else {
280
329
  return buffer.writeUInt8(0);
281
330
  }
282
331
  },
283
- validate: function (value) {
332
+
333
+ validate: function validate(value) {
284
334
  if (value == null) {
285
335
  return null;
286
336
  }
@@ -288,22 +338,26 @@ TYPE = {
288
338
  value = Date.parse(value);
289
339
  }
290
340
  if (isNaN(value)) {
291
- return new TypeError("Invalid date.");
341
+ return new TypeError('Invalid date.');
292
342
  }
293
343
  return value;
294
344
  }
295
345
  },
346
+
296
347
  0x3E: {
297
348
  type: 'FLT8',
298
349
  name: 'Float',
299
- declaration: function (parameter) {
350
+
351
+ declaration: function declaration() {
300
352
  return 'float';
301
353
  },
302
- writeTypeInfo: function (buffer) {
354
+
355
+ writeTypeInfo: function writeTypeInfo(buffer) {
303
356
  buffer.writeUInt8(typeByName.FloatN.id);
304
357
  return buffer.writeUInt8(8);
305
358
  },
306
- writeParameterData: function (buffer, parameter) {
359
+
360
+ writeParameterData: function writeParameterData(buffer, parameter) {
307
361
  if (parameter.value != null) {
308
362
  buffer.writeUInt8(8);
309
363
  return buffer.writeDoubleLE(parseFloat(parameter.value));
@@ -311,26 +365,30 @@ TYPE = {
311
365
  return buffer.writeUInt8(0);
312
366
  }
313
367
  },
314
- validate: function (value) {
368
+
369
+ validate: function validate(value) {
315
370
  if (value == null) {
316
371
  return null;
317
372
  }
318
373
  value = parseFloat(value);
319
374
  if (isNaN(value)) {
320
- return new TypeError("Invalid number.");
375
+ return new TypeError('Invalid number.');
321
376
  }
322
377
  return value;
323
378
  }
324
379
  },
380
+
325
381
  0x37: {
326
382
  type: 'DECIMAL',
327
383
  name: 'Decimal',
328
384
  hasPrecision: true,
329
385
  hasScale: true,
330
- declaration: function (parameter) {
331
- return "decimal(" + this.resolvePrecision(parameter) + ", " + this.resolveScale(parameter) + ")";
386
+
387
+ declaration: function declaration(parameter) {
388
+ return 'decimal(' + this.resolvePrecision(parameter) + ', ' + this.resolveScale(parameter) + ')';
332
389
  },
333
- resolvePrecision: function (parameter) {
390
+
391
+ resolvePrecision: function resolvePrecision(parameter) {
334
392
  if (parameter.precision != null) {
335
393
  return parameter.precision;
336
394
  } else if (parameter.value === null) {
@@ -339,14 +397,16 @@ TYPE = {
339
397
  return 18;
340
398
  }
341
399
  },
342
- resolveScale: function (parameter) {
400
+
401
+ resolveScale: function resolveScale(parameter) {
343
402
  if (parameter.scale != null) {
344
403
  return parameter.scale;
345
404
  } else {
346
405
  return 0;
347
406
  }
348
407
  },
349
- writeTypeInfo: function (buffer, parameter) {
408
+
409
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
350
410
  buffer.writeUInt8(typeByName.DecimalN.id);
351
411
  if (parameter.precision <= 9) {
352
412
  buffer.writeUInt8(5);
@@ -360,11 +420,11 @@ TYPE = {
360
420
  buffer.writeUInt8(parameter.precision);
361
421
  return buffer.writeUInt8(parameter.scale);
362
422
  },
363
- writeParameterData: function (buffer, parameter) {
364
- var sign, value;
423
+
424
+ writeParameterData: function writeParameterData(buffer, parameter) {
365
425
  if (parameter.value != null) {
366
- sign = parameter.value < 0 ? 0 : 1;
367
- value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale)));
426
+ var sign = parameter.value < 0 ? 0 : 1;
427
+ var value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale)));
368
428
  if (parameter.precision <= 9) {
369
429
  buffer.writeUInt8(5);
370
430
  buffer.writeUInt8(sign);
@@ -389,26 +449,30 @@ TYPE = {
389
449
  return buffer.writeUInt8(0);
390
450
  }
391
451
  },
392
- validate: function (value) {
452
+
453
+ validate: function validate(value) {
393
454
  if (value == null) {
394
455
  return null;
395
456
  }
396
457
  value = parseFloat(value);
397
458
  if (isNaN(value)) {
398
- return new TypeError("Invalid number.");
459
+ return new TypeError('Invalid number.');
399
460
  }
400
461
  return value;
401
462
  }
402
463
  },
464
+
403
465
  0x3F: {
404
466
  type: 'NUMERIC',
405
467
  name: 'Numeric',
406
468
  hasPrecision: true,
407
469
  hasScale: true,
408
- declaration: function (parameter) {
409
- return "numeric(" + this.resolvePrecision(parameter) + ", " + this.resolveScale(parameter) + ")";
470
+
471
+ declaration: function declaration(parameter) {
472
+ return 'numeric(' + this.resolvePrecision(parameter) + ', ' + this.resolveScale(parameter) + ')';
410
473
  },
411
- resolvePrecision: function (parameter) {
474
+
475
+ resolvePrecision: function resolvePrecision(parameter) {
412
476
  if (parameter.precision != null) {
413
477
  return parameter.precision;
414
478
  } else if (parameter.value === null) {
@@ -417,14 +481,16 @@ TYPE = {
417
481
  return 18;
418
482
  }
419
483
  },
420
- resolveScale: function (parameter) {
484
+
485
+ resolveScale: function resolveScale(parameter) {
421
486
  if (parameter.scale != null) {
422
487
  return parameter.scale;
423
488
  } else {
424
489
  return 0;
425
490
  }
426
491
  },
427
- writeTypeInfo: function (buffer, parameter) {
492
+
493
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
428
494
  buffer.writeUInt8(typeByName.NumericN.id);
429
495
  if (parameter.precision <= 9) {
430
496
  buffer.writeUInt8(5);
@@ -438,11 +504,11 @@ TYPE = {
438
504
  buffer.writeUInt8(parameter.precision);
439
505
  return buffer.writeUInt8(parameter.scale);
440
506
  },
441
- writeParameterData: function (buffer, parameter) {
442
- var sign, value;
507
+
508
+ writeParameterData: function writeParameterData(buffer, parameter) {
443
509
  if (parameter.value != null) {
444
- sign = parameter.value < 0 ? 0 : 1;
445
- value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale)));
510
+ var sign = parameter.value < 0 ? 0 : 1;
511
+ var value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale)));
446
512
  if (parameter.precision <= 9) {
447
513
  buffer.writeUInt8(5);
448
514
  buffer.writeUInt8(sign);
@@ -467,28 +533,33 @@ TYPE = {
467
533
  return buffer.writeUInt8(0);
468
534
  }
469
535
  },
470
- validate: function (value) {
536
+
537
+ validate: function validate(value) {
471
538
  if (value == null) {
472
539
  return null;
473
540
  }
474
541
  value = parseFloat(value);
475
542
  if (isNaN(value)) {
476
- return new TypeError("Invalid number.");
543
+ return new TypeError('Invalid number.');
477
544
  }
478
545
  return value;
479
546
  }
480
547
  },
548
+
481
549
  0x7A: {
482
550
  type: 'MONEY4',
483
551
  name: 'SmallMoney',
484
- declaration: function (parameter) {
485
- return "smallmoney";
552
+
553
+ declaration: function declaration() {
554
+ return 'smallmoney';
486
555
  },
487
- writeTypeInfo: function (buffer, parameter) {
556
+
557
+ writeTypeInfo: function writeTypeInfo(buffer) {
488
558
  buffer.writeUInt8(typeByName.MoneyN.id);
489
559
  return buffer.writeUInt8(4);
490
560
  },
491
- writeParameterData: function (buffer, parameter) {
561
+
562
+ writeParameterData: function writeParameterData(buffer, parameter) {
492
563
  if (parameter.value != null) {
493
564
  buffer.writeUInt8(4);
494
565
  return buffer.writeInt32LE(parameter.value * 10000);
@@ -496,68 +567,78 @@ TYPE = {
496
567
  return buffer.writeUInt8(0);
497
568
  }
498
569
  },
499
- validate: function (value) {
570
+
571
+ validate: function validate(value) {
500
572
  if (value == null) {
501
573
  return null;
502
574
  }
503
575
  value = parseFloat(value);
504
576
  if (isNaN(value)) {
505
- return new TypeError("Invalid number.");
577
+ return new TypeError('Invalid number.');
506
578
  }
507
579
  if (value < -214748.3648 || value > 214748.3647) {
508
- return new TypeError("Value must be between -214748.3648 and 214748.3647.");
580
+ return new TypeError('Value must be between -214748.3648 and 214748.3647.');
509
581
  }
510
582
  return value;
511
583
  }
512
584
  },
585
+
513
586
  0x7F: {
514
587
  type: 'INT8',
515
588
  name: 'BigInt',
516
- declaration: function (parameter) {
589
+
590
+ declaration: function declaration() {
517
591
  return 'bigint';
518
592
  },
519
- writeTypeInfo: function (buffer) {
593
+
594
+ writeTypeInfo: function writeTypeInfo(buffer) {
520
595
  buffer.writeUInt8(typeByName.IntN.id);
521
596
  return buffer.writeUInt8(8);
522
597
  },
523
- writeParameterData: function (buffer, parameter) {
524
- var val;
598
+
599
+ writeParameterData: function writeParameterData(buffer, parameter) {
525
600
  if (parameter.value != null) {
526
- val = typeof parameter.value !== 'number' ? parameter.value : parseInt(parameter.value);
601
+ var val = typeof parameter.value !== 'number' ? parameter.value : parseInt(parameter.value);
527
602
  buffer.writeUInt8(8);
528
603
  return buffer.writeInt64LE(val);
529
604
  } else {
530
605
  return buffer.writeUInt8(0);
531
606
  }
532
607
  },
533
- validate: function (value) {
608
+
609
+ validate: function validate(value) {
534
610
  if (value == null) {
535
611
  return null;
536
612
  }
537
613
  return value;
538
614
  }
539
615
  },
616
+
540
617
  0x22: {
541
618
  type: 'IMAGE',
542
619
  name: 'Image',
543
620
  hasTableName: true,
544
621
  hasTextPointerAndTimestamp: true,
545
622
  dataLengthLength: 4,
546
- declaration: function (parameter) {
623
+
624
+ declaration: function declaration() {
547
625
  return 'image';
548
626
  },
549
- resolveLength: function (parameter) {
627
+
628
+ resolveLength: function resolveLength(parameter) {
550
629
  if (parameter.value != null) {
551
630
  return parameter.value.length;
552
631
  } else {
553
632
  return -1;
554
633
  }
555
634
  },
556
- writeTypeInfo: function (buffer, parameter) {
635
+
636
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
557
637
  buffer.writeUInt8(this.id);
558
638
  return buffer.writeInt32LE(parameter.length);
559
639
  },
560
- writeParameterData: function (buffer, parameter) {
640
+
641
+ writeParameterData: function writeParameterData(buffer, parameter) {
561
642
  if (parameter.value != null) {
562
643
  buffer.writeInt32LE(parameter.length);
563
644
  return buffer.writeBuffer(parameter.value);
@@ -565,16 +646,18 @@ TYPE = {
565
646
  return buffer.writeInt32LE(parameter.length);
566
647
  }
567
648
  },
568
- validate: function (value) {
649
+
650
+ validate: function validate(value) {
569
651
  if (value == null) {
570
652
  return null;
571
653
  }
572
654
  if (!Buffer.isBuffer(value)) {
573
- return new TypeError("Invalid buffer.");
655
+ return new TypeError('Invalid buffer.');
574
656
  }
575
657
  return value;
576
658
  }
577
659
  },
660
+
578
661
  0x23: {
579
662
  type: 'TEXT',
580
663
  name: 'Text',
@@ -582,21 +665,25 @@ TYPE = {
582
665
  hasTableName: true,
583
666
  hasTextPointerAndTimestamp: true,
584
667
  dataLengthLength: 4,
585
- declaration: function (parameter) {
668
+
669
+ declaration: function declaration() {
586
670
  return 'text';
587
671
  },
588
- resolveLength: function (parameter) {
672
+
673
+ resolveLength: function resolveLength(parameter) {
589
674
  if (parameter.value != null) {
590
675
  return parameter.value.length;
591
676
  } else {
592
677
  return -1;
593
678
  }
594
679
  },
595
- writeTypeInfo: function (buffer, parameter) {
680
+
681
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
596
682
  buffer.writeUInt8(typeByName.Text.id);
597
683
  return buffer.writeInt32LE(parameter.length);
598
684
  },
599
- writeParameterData: function (buffer, parameter) {
685
+
686
+ writeParameterData: function writeParameterData(buffer, parameter) {
600
687
  buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
601
688
  if (parameter.value != null) {
602
689
  buffer.writeInt32LE(parameter.length);
@@ -605,35 +692,41 @@ TYPE = {
605
692
  return buffer.writeInt32LE(parameter.length);
606
693
  }
607
694
  },
608
- validate: function (value) {
695
+
696
+ validate: function validate(value) {
609
697
  if (value == null) {
610
698
  return null;
611
699
  }
612
700
  if (typeof value !== 'string') {
613
701
  if (typeof value.toString !== 'function') {
614
- return TypeError("Invalid string.");
702
+ return TypeError('Invalid string.');
615
703
  }
616
704
  value = value.toString();
617
705
  }
618
706
  return value;
619
707
  }
620
708
  },
709
+
621
710
  0x24: {
622
711
  type: 'GUIDN',
623
712
  name: 'UniqueIdentifierN',
624
713
  aliases: ['UniqueIdentifier'],
625
714
  dataLengthLength: 1,
626
- declaration: function (parameter) {
715
+
716
+ declaration: function declaration() {
627
717
  return 'uniqueidentifier';
628
718
  },
629
- resolveLength: function (parameter) {
719
+
720
+ resolveLength: function resolveLength() {
630
721
  return 16;
631
722
  },
632
- writeTypeInfo: function (buffer, parameter) {
723
+
724
+ writeTypeInfo: function writeTypeInfo(buffer) {
633
725
  buffer.writeUInt8(typeByName.UniqueIdentifierN.id);
634
726
  return buffer.writeUInt8(0x10);
635
727
  },
636
- writeParameterData: function (buffer, parameter) {
728
+
729
+ writeParameterData: function writeParameterData(buffer, parameter) {
637
730
  if (parameter.value != null) {
638
731
  buffer.writeUInt8(0x10);
639
732
  return buffer.writeBuffer(new Buffer(guidParser.guidToArray(parameter.value)));
@@ -641,24 +734,27 @@ TYPE = {
641
734
  return buffer.writeUInt8(0);
642
735
  }
643
736
  },
644
- validate: function (value) {
737
+
738
+ validate: function validate(value) {
645
739
  if (value == null) {
646
740
  return null;
647
741
  }
648
742
  if (typeof value !== 'string') {
649
743
  if (typeof value.toString !== 'function') {
650
- return TypeError("Invalid string.");
744
+ return TypeError('Invalid string.');
651
745
  }
652
746
  value = value.toString();
653
747
  }
654
748
  return value;
655
749
  }
656
750
  },
751
+
657
752
  0x26: {
658
753
  type: 'INTN',
659
754
  name: 'IntN',
660
755
  dataLengthLength: 1
661
756
  },
757
+
662
758
  0x63: {
663
759
  type: 'NTEXT',
664
760
  name: 'NText',
@@ -667,6 +763,7 @@ TYPE = {
667
763
  hasTextPointerAndTimestamp: true,
668
764
  dataLengthLength: 4
669
765
  },
766
+
670
767
  0x68: {
671
768
  type: 'BITN',
672
769
  name: 'BitN',
@@ -679,6 +776,7 @@ TYPE = {
679
776
  hasPrecision: true,
680
777
  hasScale: true
681
778
  },
779
+
682
780
  0x6C: {
683
781
  type: 'NUMERICN',
684
782
  name: 'NumericN',
@@ -686,28 +784,33 @@ TYPE = {
686
784
  hasPrecision: true,
687
785
  hasScale: true
688
786
  },
787
+
689
788
  0x6D: {
690
789
  type: 'FLTN',
691
790
  name: 'FloatN',
692
791
  dataLengthLength: 1
693
792
  },
793
+
694
794
  0x6E: {
695
795
  type: 'MONEYN',
696
796
  name: 'MoneyN',
697
797
  dataLengthLength: 1
698
798
  },
799
+
699
800
  0x6F: {
700
801
  type: 'DATETIMN',
701
802
  name: 'DateTimeN',
702
803
  dataLengthLength: 1
703
804
  },
805
+
704
806
  0xA5: {
705
807
  type: 'BIGVARBIN',
706
808
  name: 'VarBinary',
707
809
  dataLengthLength: 2,
708
810
  maximumLength: 8000,
709
- declaration: function (parameter) {
710
- var length;
811
+
812
+ declaration: function declaration(parameter) {
813
+ var length = undefined;
711
814
  if (parameter.length) {
712
815
  length = parameter.length;
713
816
  } else if (parameter.value != null) {
@@ -717,13 +820,15 @@ TYPE = {
717
820
  } else {
718
821
  length = this.maximumLength;
719
822
  }
823
+
720
824
  if (length <= this.maximumLength) {
721
- return "varbinary(" + length + ")";
825
+ return 'varbinary(' + length + ')';
722
826
  } else {
723
- return "varbinary(max)";
827
+ return 'varbinary(max)';
724
828
  }
725
829
  },
726
- resolveLength: function (parameter) {
830
+
831
+ resolveLength: function resolveLength(parameter) {
727
832
  if (parameter.length != null) {
728
833
  return parameter.length;
729
834
  } else if (parameter.value != null) {
@@ -732,7 +837,8 @@ TYPE = {
732
837
  return this.maximumLength;
733
838
  }
734
839
  },
735
- writeTypeInfo: function (buffer, parameter) {
840
+
841
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
736
842
  buffer.writeUInt8(this.id);
737
843
  if (parameter.length <= this.maximumLength) {
738
844
  return buffer.writeUInt16LE(this.maximumLength);
@@ -740,7 +846,8 @@ TYPE = {
740
846
  return buffer.writeUInt16LE(MAX);
741
847
  }
742
848
  },
743
- writeParameterData: function (buffer, parameter) {
849
+
850
+ writeParameterData: function writeParameterData(buffer, parameter) {
744
851
  if (parameter.value != null) {
745
852
  if (parameter.length <= this.maximumLength) {
746
853
  return buffer.writeUsVarbyte(parameter.value);
@@ -756,24 +863,27 @@ TYPE = {
756
863
  }
757
864
  }
758
865
  },
759
- validate: function (value) {
866
+
867
+ validate: function validate(value) {
760
868
  if (value == null) {
761
869
  return null;
762
870
  }
763
871
  if (!Buffer.isBuffer(value)) {
764
- return new TypeError("Invalid buffer.");
872
+ return new TypeError('Invalid buffer.');
765
873
  }
766
874
  return value;
767
875
  }
768
876
  },
877
+
769
878
  0xA7: {
770
879
  type: 'BIGVARCHR',
771
880
  name: 'VarChar',
772
881
  hasCollation: true,
773
882
  dataLengthLength: 2,
774
883
  maximumLength: 8000,
775
- declaration: function (parameter) {
776
- var length;
884
+
885
+ declaration: function declaration(parameter) {
886
+ var length = undefined;
777
887
  if (parameter.length) {
778
888
  length = parameter.length;
779
889
  } else if (parameter.value != null) {
@@ -783,13 +893,15 @@ TYPE = {
783
893
  } else {
784
894
  length = this.maximumLength;
785
895
  }
896
+
786
897
  if (length <= this.maximumLength) {
787
- return "varchar(" + length + ")";
898
+ return 'varchar(' + length + ')';
788
899
  } else {
789
- return "varchar(max)";
900
+ return 'varchar(max)';
790
901
  }
791
902
  },
792
- resolveLength: function (parameter) {
903
+
904
+ resolveLength: function resolveLength(parameter) {
793
905
  if (parameter.length != null) {
794
906
  return parameter.length;
795
907
  } else if (parameter.value != null) {
@@ -802,7 +914,8 @@ TYPE = {
802
914
  return this.maximumLength;
803
915
  }
804
916
  },
805
- writeTypeInfo: function (buffer, parameter) {
917
+
918
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
806
919
  buffer.writeUInt8(this.id);
807
920
  if (parameter.length <= this.maximumLength) {
808
921
  buffer.writeUInt16LE(this.maximumLength);
@@ -811,7 +924,8 @@ TYPE = {
811
924
  }
812
925
  return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
813
926
  },
814
- writeParameterData: function (buffer, parameter) {
927
+
928
+ writeParameterData: function writeParameterData(buffer, parameter) {
815
929
  if (parameter.value != null) {
816
930
  if (parameter.length <= this.maximumLength) {
817
931
  return buffer.writeUsVarbyte(parameter.value, 'ascii');
@@ -827,39 +941,55 @@ TYPE = {
827
941
  }
828
942
  }
829
943
  },
830
- validate: function (value) {
944
+
945
+ validate: function validate(value) {
831
946
  if (value == null) {
832
947
  return null;
833
948
  }
834
949
  if (typeof value !== 'string') {
835
950
  if (typeof value.toString !== 'function') {
836
- return TypeError("Invalid string.");
951
+ return TypeError('Invalid string.');
837
952
  }
838
953
  value = value.toString();
839
954
  }
840
955
  return value;
841
956
  }
842
957
  },
958
+
843
959
  0xAD: {
844
960
  type: 'BIGBinary',
845
961
  name: 'Binary',
846
962
  dataLengthLength: 2,
847
963
  maximumLength: 8000,
848
- declaration: function (parameter) {
849
- return 'binary';
964
+
965
+ declaration: function declaration(parameter) {
966
+ var length;
967
+ if (parameter.length) {
968
+ length = parameter.length;
969
+ } else if (parameter.value != null) {
970
+ length = parameter.value.length || 1;
971
+ } else if (parameter.value === null && !parameter.output) {
972
+ length = 1;
973
+ } else {
974
+ length = this.maximumLength;
975
+ }
976
+ return 'binary(' + length + ')';
850
977
  },
851
- resolveLength: function (parameter) {
978
+
979
+ resolveLength: function resolveLength(parameter) {
852
980
  if (parameter.value != null) {
853
981
  return parameter.value.length;
854
982
  } else {
855
983
  return this.maximumLength;
856
984
  }
857
985
  },
858
- writeTypeInfo: function (buffer, parameter) {
986
+
987
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
859
988
  buffer.writeUInt8(this.id);
860
989
  return buffer.writeUInt16LE(parameter.length);
861
990
  },
862
- writeParameterData: function (buffer, parameter) {
991
+
992
+ writeParameterData: function writeParameterData(buffer, parameter) {
863
993
  if (parameter.value != null) {
864
994
  buffer.writeUInt16LE(parameter.length);
865
995
  return buffer.writeBuffer(parameter.value.slice(0, Math.min(parameter.length, this.maximumLength)));
@@ -867,24 +997,27 @@ TYPE = {
867
997
  return buffer.writeUInt16LE(NULL);
868
998
  }
869
999
  },
870
- validate: function (value) {
1000
+
1001
+ validate: function validate(value) {
871
1002
  if (value == null) {
872
1003
  return null;
873
1004
  }
874
1005
  if (!Buffer.isBuffer(value)) {
875
- return new TypeError("Invalid buffer.");
1006
+ return new TypeError('Invalid buffer.');
876
1007
  }
877
1008
  return value;
878
1009
  }
879
1010
  },
1011
+
880
1012
  0xAF: {
881
1013
  type: 'BIGCHAR',
882
1014
  name: 'Char',
883
1015
  hasCollation: true,
884
1016
  dataLengthLength: 2,
885
1017
  maximumLength: 8000,
886
- declaration: function (parameter) {
887
- var length;
1018
+
1019
+ declaration: function declaration(parameter) {
1020
+ var length = undefined;
888
1021
  if (parameter.length) {
889
1022
  length = parameter.length;
890
1023
  } else if (parameter.value != null) {
@@ -894,13 +1027,15 @@ TYPE = {
894
1027
  } else {
895
1028
  length = this.maximumLength;
896
1029
  }
1030
+
897
1031
  if (length < this.maximumLength) {
898
- return "char(" + length + ")";
1032
+ return 'char(' + length + ')';
899
1033
  } else {
900
- return "char(" + this.maximumLength + ")";
1034
+ return 'char(' + this.maximumLength + ')';
901
1035
  }
902
1036
  },
903
- resolveLength: function (parameter) {
1037
+
1038
+ resolveLength: function resolveLength(parameter) {
904
1039
  if (parameter.length != null) {
905
1040
  return parameter.length;
906
1041
  } else if (parameter.value != null) {
@@ -913,39 +1048,44 @@ TYPE = {
913
1048
  return this.maximumLength;
914
1049
  }
915
1050
  },
916
- writeTypeInfo: function (buffer, parameter) {
1051
+
1052
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
917
1053
  buffer.writeUInt8(this.id);
918
1054
  buffer.writeUInt16LE(parameter.length);
919
1055
  return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
920
1056
  },
921
- writeParameterData: function (buffer, parameter) {
1057
+
1058
+ writeParameterData: function writeParameterData(buffer, parameter) {
922
1059
  if (parameter.value != null) {
923
1060
  return buffer.writeUsVarbyte(parameter.value, 'ascii');
924
1061
  } else {
925
1062
  return buffer.writeUInt16LE(NULL);
926
1063
  }
927
1064
  },
928
- validate: function (value) {
1065
+
1066
+ validate: function validate(value) {
929
1067
  if (value == null) {
930
1068
  return null;
931
1069
  }
932
1070
  if (typeof value !== 'string') {
933
1071
  if (typeof value.toString !== 'function') {
934
- return TypeError("Invalid string.");
1072
+ return TypeError('Invalid string.');
935
1073
  }
936
1074
  value = value.toString();
937
1075
  }
938
1076
  return value;
939
1077
  }
940
1078
  },
1079
+
941
1080
  0xE7: {
942
1081
  type: 'NVARCHAR',
943
1082
  name: 'NVarChar',
944
1083
  hasCollation: true,
945
1084
  dataLengthLength: 2,
946
1085
  maximumLength: 4000,
947
- declaration: function (parameter) {
948
- var length;
1086
+
1087
+ declaration: function declaration(parameter) {
1088
+ var length = undefined;
949
1089
  if (parameter.length) {
950
1090
  length = parameter.length;
951
1091
  } else if (parameter.value != null) {
@@ -955,13 +1095,15 @@ TYPE = {
955
1095
  } else {
956
1096
  length = this.maximumLength;
957
1097
  }
1098
+
958
1099
  if (length <= this.maximumLength) {
959
- return "nvarchar(" + length + ")";
1100
+ return 'nvarchar(' + length + ')';
960
1101
  } else {
961
- return "nvarchar(max)";
1102
+ return 'nvarchar(max)';
962
1103
  }
963
1104
  },
964
- resolveLength: function (parameter) {
1105
+
1106
+ resolveLength: function resolveLength(parameter) {
965
1107
  if (parameter.length != null) {
966
1108
  return parameter.length;
967
1109
  } else if (parameter.value != null) {
@@ -974,7 +1116,8 @@ TYPE = {
974
1116
  return this.maximumLength;
975
1117
  }
976
1118
  },
977
- writeTypeInfo: function (buffer, parameter) {
1119
+
1120
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
978
1121
  buffer.writeUInt8(this.id);
979
1122
  if (parameter.length <= this.maximumLength) {
980
1123
  buffer.writeUInt16LE(parameter.length * 2);
@@ -983,7 +1126,8 @@ TYPE = {
983
1126
  }
984
1127
  return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
985
1128
  },
986
- writeParameterData: function (buffer, parameter) {
1129
+
1130
+ writeParameterData: function writeParameterData(buffer, parameter) {
987
1131
  if (parameter.value != null) {
988
1132
  if (parameter.length <= this.maximumLength) {
989
1133
  return buffer.writeUsVarbyte(parameter.value, 'ucs2');
@@ -999,27 +1143,30 @@ TYPE = {
999
1143
  }
1000
1144
  }
1001
1145
  },
1002
- validate: function (value) {
1146
+
1147
+ validate: function validate(value) {
1003
1148
  if (value == null) {
1004
1149
  return null;
1005
1150
  }
1006
1151
  if (typeof value !== 'string') {
1007
1152
  if (typeof value.toString !== 'function') {
1008
- return TypeError("Invalid string.");
1153
+ return TypeError('Invalid string.');
1009
1154
  }
1010
1155
  value = value.toString();
1011
1156
  }
1012
1157
  return value;
1013
1158
  }
1014
1159
  },
1160
+
1015
1161
  0xEF: {
1016
1162
  type: 'NCHAR',
1017
1163
  name: 'NChar',
1018
1164
  hasCollation: true,
1019
1165
  dataLengthLength: 2,
1020
1166
  maximumLength: 4000,
1021
- declaration: function (parameter) {
1022
- var length;
1167
+
1168
+ declaration: function declaration(parameter) {
1169
+ var length = undefined;
1023
1170
  if (parameter.length) {
1024
1171
  length = parameter.length;
1025
1172
  } else if (parameter.value != null) {
@@ -1029,13 +1176,15 @@ TYPE = {
1029
1176
  } else {
1030
1177
  length = this.maximumLength;
1031
1178
  }
1179
+
1032
1180
  if (length < this.maximumLength) {
1033
- return "nchar(" + length + ")";
1181
+ return 'nchar(' + length + ')';
1034
1182
  } else {
1035
- return "nchar(" + this.maximumLength + ")";
1183
+ return 'nchar(' + this.maximumLength + ')';
1036
1184
  }
1037
1185
  },
1038
- resolveLength: function (parameter) {
1186
+
1187
+ resolveLength: function resolveLength(parameter) {
1039
1188
  if (parameter.length != null) {
1040
1189
  return parameter.length;
1041
1190
  } else if (parameter.value != null) {
@@ -1048,43 +1197,49 @@ TYPE = {
1048
1197
  return this.maximumLength;
1049
1198
  }
1050
1199
  },
1051
- writeTypeInfo: function (buffer, parameter) {
1200
+
1201
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
1052
1202
  buffer.writeUInt8(this.id);
1053
1203
  buffer.writeUInt16LE(parameter.length * 2);
1054
1204
  return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
1055
1205
  },
1056
- writeParameterData: function (buffer, parameter) {
1206
+
1207
+ writeParameterData: function writeParameterData(buffer, parameter) {
1057
1208
  if (parameter.value != null) {
1058
1209
  return buffer.writeUsVarbyte(parameter.value, 'ucs2');
1059
1210
  } else {
1060
1211
  return buffer.writeUInt16LE(NULL);
1061
1212
  }
1062
1213
  },
1063
- validate: function (value) {
1214
+
1215
+ validate: function validate(value) {
1064
1216
  if (value == null) {
1065
1217
  return null;
1066
1218
  }
1067
1219
  if (typeof value !== 'string') {
1068
1220
  if (typeof value.toString !== 'function') {
1069
- return TypeError("Invalid string.");
1221
+ return TypeError('Invalid string.');
1070
1222
  }
1071
1223
  value = value.toString();
1072
1224
  }
1073
1225
  return value;
1074
1226
  }
1075
1227
  },
1228
+
1076
1229
  0xF1: {
1077
1230
  type: 'XML',
1078
1231
  name: 'Xml',
1079
1232
  hasSchemaPresent: true
1080
1233
  },
1234
+
1081
1235
  0x29: {
1082
1236
  type: 'TIMEN',
1083
1237
  name: 'TimeN',
1084
1238
  aliases: ['Time'],
1085
1239
  hasScale: true,
1086
- dataLengthLength: 0,
1087
- dataLengthFromScale: function (scale) {
1240
+ dataLengthLength: 1,
1241
+
1242
+ dataLengthFromScale: function dataLengthFromScale(scale) {
1088
1243
  switch (scale) {
1089
1244
  case 0:
1090
1245
  case 1:
@@ -1099,10 +1254,12 @@ TYPE = {
1099
1254
  return 5;
1100
1255
  }
1101
1256
  },
1102
- declaration: function (parameter) {
1103
- return "time(" + this.resolveScale(parameter) + ")";
1257
+
1258
+ declaration: function declaration(parameter) {
1259
+ return 'time(' + this.resolveScale(parameter) + ')';
1104
1260
  },
1105
- resolveScale: function (parameter) {
1261
+
1262
+ resolveScale: function resolveScale(parameter) {
1106
1263
  if (parameter.scale != null) {
1107
1264
  return parameter.scale;
1108
1265
  } else if (parameter.value === null) {
@@ -1111,14 +1268,16 @@ TYPE = {
1111
1268
  return 7;
1112
1269
  }
1113
1270
  },
1114
- writeTypeInfo: function (buffer, parameter) {
1271
+
1272
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
1115
1273
  buffer.writeUInt8(this.id);
1116
1274
  return buffer.writeUInt8(parameter.scale);
1117
1275
  },
1118
- writeParameterData: function (buffer, parameter, options) {
1119
- var ref, time;
1276
+
1277
+ writeParameterData: function writeParameterData(buffer, parameter, options) {
1120
1278
  if (parameter.value != null) {
1121
- time = new Date(+parameter.value);
1279
+ var ref = undefined,
1280
+ time = new Date(+parameter.value);
1122
1281
  if (options.useUTC) {
1123
1282
  time = ((time.getUTCHours() * 60 + time.getUTCMinutes()) * 60 + time.getUTCSeconds()) * 1000 + time.getUTCMilliseconds();
1124
1283
  } else {
@@ -1145,7 +1304,8 @@ TYPE = {
1145
1304
  return buffer.writeUInt8(0);
1146
1305
  }
1147
1306
  },
1148
- validate: function (value) {
1307
+
1308
+ validate: function validate(value) {
1149
1309
  if (value == null) {
1150
1310
  return null;
1151
1311
  }
@@ -1154,37 +1314,42 @@ TYPE = {
1154
1314
  }
1155
1315
  value = Date.parse(value);
1156
1316
  if (isNaN(value)) {
1157
- return new TypeError("Invalid time.");
1317
+ return new TypeError('Invalid time.');
1158
1318
  }
1159
1319
  return value;
1160
1320
  }
1161
1321
  },
1322
+
1162
1323
  0x28: {
1163
1324
  type: 'DATEN',
1164
1325
  name: 'DateN',
1165
1326
  aliases: ['Date'],
1166
- dataLengthLength: 0,
1167
- declaration: function (parameter) {
1168
- return "date";
1327
+ dataLengthLength: 1,
1328
+ fixedDataLength: 3,
1329
+
1330
+ declaration: function declaration() {
1331
+ return 'date';
1169
1332
  },
1170
- writeTypeInfo: function (buffer, parameter) {
1333
+
1334
+ writeTypeInfo: function writeTypeInfo(buffer) {
1171
1335
  return buffer.writeUInt8(this.id);
1172
1336
  },
1173
- writeParameterData: function (buffer, parameter, options) {
1174
- var dstDiff;
1337
+
1338
+ writeParameterData: function writeParameterData(buffer, parameter, options) {
1175
1339
  if (parameter.value != null) {
1176
1340
  buffer.writeUInt8(3);
1177
1341
  if (options.useUTC) {
1178
1342
  return buffer.writeUInt24LE(Math.floor((+parameter.value - UTC_YEAR_ONE) / 86400000));
1179
1343
  } else {
1180
- dstDiff = -(parameter.value.getTimezoneOffset() - YEAR_ONE.getTimezoneOffset()) * 60 * 1000;
1344
+ var dstDiff = -(parameter.value.getTimezoneOffset() - YEAR_ONE.getTimezoneOffset()) * 60 * 1000;
1181
1345
  return buffer.writeUInt24LE(Math.floor((+parameter.value - YEAR_ONE + dstDiff) / 86400000));
1182
1346
  }
1183
1347
  } else {
1184
1348
  return buffer.writeUInt8(0);
1185
1349
  }
1186
1350
  },
1187
- validate: function (value) {
1351
+
1352
+ validate: function validate(value) {
1188
1353
  if (value == null) {
1189
1354
  return null;
1190
1355
  }
@@ -1192,18 +1357,20 @@ TYPE = {
1192
1357
  value = Date.parse(value);
1193
1358
  }
1194
1359
  if (isNaN(value)) {
1195
- return new TypeError("Invalid date.");
1360
+ return new TypeError('Invalid date.');
1196
1361
  }
1197
1362
  return value;
1198
1363
  }
1199
1364
  },
1365
+
1200
1366
  0x2A: {
1201
1367
  type: 'DATETIME2N',
1202
1368
  name: 'DateTime2N',
1203
1369
  aliases: ['DateTime2'],
1204
1370
  hasScale: true,
1205
- dataLengthLength: 0,
1206
- dataLengthFromScale: function (scale) {
1371
+ dataLengthLength: 1,
1372
+
1373
+ dataLengthFromScale: function dataLengthFromScale(scale) {
1207
1374
  switch (scale) {
1208
1375
  case 0:
1209
1376
  case 1:
@@ -1218,10 +1385,12 @@ TYPE = {
1218
1385
  return 5;
1219
1386
  }
1220
1387
  },
1221
- declaration: function (parameter) {
1222
- return "datetime2(" + this.resolveScale(parameter) + ")";
1388
+
1389
+ declaration: function declaration(parameter) {
1390
+ return 'datetime2(' + this.resolveScale(parameter) + ')';
1223
1391
  },
1224
- resolveScale: function (parameter) {
1392
+
1393
+ resolveScale: function resolveScale(parameter) {
1225
1394
  if (parameter.scale != null) {
1226
1395
  return parameter.scale;
1227
1396
  } else if (parameter.value === null) {
@@ -1230,14 +1399,16 @@ TYPE = {
1230
1399
  return 7;
1231
1400
  }
1232
1401
  },
1233
- writeTypeInfo: function (buffer, parameter) {
1402
+
1403
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
1234
1404
  buffer.writeUInt8(this.id);
1235
1405
  return buffer.writeUInt8(parameter.scale);
1236
1406
  },
1237
- writeParameterData: function (buffer, parameter, options) {
1238
- var dstDiff, ref, time;
1407
+
1408
+ writeParameterData: function writeParameterData(buffer, parameter, options) {
1239
1409
  if (parameter.value != null) {
1240
- time = new Date(+parameter.value);
1410
+ var ref = undefined,
1411
+ time = new Date(+parameter.value);
1241
1412
  if (options.useUTC) {
1242
1413
  time = ((time.getUTCHours() * 60 + time.getUTCMinutes()) * 60 + time.getUTCSeconds()) * 1000 + time.getUTCMilliseconds();
1243
1414
  } else {
@@ -1265,14 +1436,15 @@ TYPE = {
1265
1436
  if (options.useUTC) {
1266
1437
  return buffer.writeUInt24LE(Math.floor((+parameter.value - UTC_YEAR_ONE) / 86400000));
1267
1438
  } else {
1268
- dstDiff = -(parameter.value.getTimezoneOffset() - YEAR_ONE.getTimezoneOffset()) * 60 * 1000;
1439
+ var dstDiff = -(parameter.value.getTimezoneOffset() - YEAR_ONE.getTimezoneOffset()) * 60 * 1000;
1269
1440
  return buffer.writeUInt24LE(Math.floor((+parameter.value - YEAR_ONE + dstDiff) / 86400000));
1270
1441
  }
1271
1442
  } else {
1272
1443
  return buffer.writeUInt8(0);
1273
1444
  }
1274
1445
  },
1275
- validate: function (value) {
1446
+
1447
+ validate: function validate(value) {
1276
1448
  if (value == null) {
1277
1449
  return null;
1278
1450
  }
@@ -1280,18 +1452,19 @@ TYPE = {
1280
1452
  value = Date.parse(value);
1281
1453
  }
1282
1454
  if (isNaN(value)) {
1283
- return new TypeError("Invalid date.");
1455
+ return new TypeError('Invalid date.');
1284
1456
  }
1285
1457
  return value;
1286
1458
  }
1287
1459
  },
1460
+
1288
1461
  0x2B: {
1289
1462
  type: 'DATETIMEOFFSETN',
1290
1463
  name: 'DateTimeOffsetN',
1291
1464
  aliases: ['DateTimeOffset'],
1292
1465
  hasScale: true,
1293
- dataLengthLength: 0,
1294
- dataLengthFromScale: function (scale) {
1466
+ dataLengthLength: 1,
1467
+ dataLengthFromScale: function dataLengthFromScale(scale) {
1295
1468
  switch (scale) {
1296
1469
  case 0:
1297
1470
  case 1:
@@ -1306,10 +1479,10 @@ TYPE = {
1306
1479
  return 5;
1307
1480
  }
1308
1481
  },
1309
- declaration: function (parameter) {
1310
- return "datetimeoffset(" + this.resolveScale(parameter) + ")";
1482
+ declaration: function declaration(parameter) {
1483
+ return 'datetimeoffset(' + this.resolveScale(parameter) + ')';
1311
1484
  },
1312
- resolveScale: function (parameter) {
1485
+ resolveScale: function resolveScale(parameter) {
1313
1486
  if (parameter.scale != null) {
1314
1487
  return parameter.scale;
1315
1488
  } else if (parameter.value === null) {
@@ -1318,19 +1491,19 @@ TYPE = {
1318
1491
  return 7;
1319
1492
  }
1320
1493
  },
1321
- writeTypeInfo: function (buffer, parameter) {
1494
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
1322
1495
  buffer.writeUInt8(this.id);
1323
1496
  return buffer.writeUInt8(parameter.scale);
1324
1497
  },
1325
- writeParameterData: function (buffer, parameter) {
1326
- var offset, ref, time;
1498
+ writeParameterData: function writeParameterData(buffer, parameter) {
1327
1499
  if (parameter.value != null) {
1328
- time = new Date(+parameter.value);
1500
+ var ref = undefined,
1501
+ time = new Date(+parameter.value);
1329
1502
  time.setUTCFullYear(1970);
1330
1503
  time.setUTCMonth(0);
1331
1504
  time.setUTCDate(1);
1332
1505
  time = (+time / 1000 + ((ref = parameter.value.nanosecondDelta) != null ? ref : 0)) * Math.pow(10, parameter.scale);
1333
- offset = -parameter.value.getTimezoneOffset();
1506
+ var offset = -parameter.value.getTimezoneOffset();
1334
1507
  switch (parameter.scale) {
1335
1508
  case 0:
1336
1509
  case 1:
@@ -1355,7 +1528,7 @@ TYPE = {
1355
1528
  return buffer.writeUInt8(0);
1356
1529
  }
1357
1530
  },
1358
- validate: function (value) {
1531
+ validate: function validate(value) {
1359
1532
  if (value == null) {
1360
1533
  return null;
1361
1534
  }
@@ -1363,79 +1536,107 @@ TYPE = {
1363
1536
  value = Date.parse(value);
1364
1537
  }
1365
1538
  if (isNaN(value)) {
1366
- return new TypeError("Invalid date.");
1539
+ return new TypeError('Invalid date.');
1367
1540
  }
1368
1541
  return value;
1369
1542
  }
1370
1543
  },
1544
+
1371
1545
  0xF0: {
1372
1546
  type: 'UDTTYPE',
1373
1547
  name: 'UDT',
1374
1548
  hasUDTInfo: true
1375
1549
  },
1550
+
1376
1551
  0xF3: {
1377
1552
  type: 'TVPTYPE',
1378
1553
  name: 'TVP',
1379
- declaration: function (parameter) {
1380
- return parameter.value.name + " readonly";
1554
+
1555
+ declaration: function declaration(parameter) {
1556
+ return parameter.value.name + ' readonly';
1381
1557
  },
1382
- writeTypeInfo: function (buffer, parameter) {
1383
- var ref, ref1, ref2, ref3;
1558
+
1559
+ writeTypeInfo: function writeTypeInfo(buffer, parameter) {
1560
+ var ref = undefined,
1561
+ ref1 = undefined,
1562
+ ref2 = undefined,
1563
+ ref3 = undefined;
1384
1564
  buffer.writeUInt8(this.id);
1385
- buffer.writeBVarchar("");
1386
- buffer.writeBVarchar((ref = (ref1 = parameter.value) != null ? ref1.schema : void 0) != null ? ref : "");
1387
- return buffer.writeBVarchar((ref2 = (ref3 = parameter.value) != null ? ref3.name : void 0) != null ? ref2 : "");
1565
+ buffer.writeBVarchar('');
1566
+ buffer.writeBVarchar((ref = (ref1 = parameter.value) != null ? ref1.schema : void 0) != null ? ref : '');
1567
+ buffer.writeBVarchar((ref2 = (ref3 = parameter.value) != null ? ref3.name : void 0) != null ? ref2 : '');
1388
1568
  },
1389
- writeParameterData: function (buffer, parameter, options) {
1390
- var column, i, index, j, k, len, len1, len2, param, ref, ref1, row, value;
1569
+
1570
+ writeParameterData: function writeParameterData(buffer, parameter, options) {
1391
1571
  if (parameter.value == null) {
1392
1572
  buffer.writeUInt16LE(0xFFFF);
1393
1573
  buffer.writeUInt8(0x00);
1394
1574
  buffer.writeUInt8(0x00);
1395
1575
  return;
1396
1576
  }
1577
+
1397
1578
  buffer.writeUInt16LE(parameter.value.columns.length);
1398
- ref = parameter.value.columns;
1399
- for (i = 0, len = ref.length; i < len; i++) {
1400
- column = ref[i];
1579
+
1580
+ var ref = parameter.value.columns;
1581
+ for (var i = 0, len = ref.length; i < len; i++) {
1582
+ var column = ref[i];
1401
1583
  buffer.writeUInt32LE(0x00000000);
1402
1584
  buffer.writeUInt16LE(0x0000);
1403
1585
  column.type.writeTypeInfo(buffer, column);
1404
- buffer.writeBVarchar("");
1586
+ buffer.writeBVarchar('');
1405
1587
  }
1588
+
1406
1589
  buffer.writeUInt8(0x00);
1407
- ref1 = parameter.value.rows;
1408
- for (j = 0, len1 = ref1.length; j < len1; j++) {
1409
- row = ref1[j];
1590
+
1591
+ var ref1 = parameter.value.rows;
1592
+ for (var j = 0, len1 = ref1.length; j < len1; j++) {
1593
+ var row = ref1[j];
1594
+
1410
1595
  buffer.writeUInt8(0x01);
1411
- for (index = k = 0, len2 = row.length; k < len2; index = ++k) {
1412
- value = row[index];
1413
- param = {
1596
+
1597
+ for (var k = 0, len2 = row.length; k < len2; k++) {
1598
+ var value = row[k];
1599
+ var param = {
1414
1600
  value: value,
1415
- length: parameter.value.columns[index].length,
1416
- scale: parameter.value.columns[index].scale,
1417
- precision: parameter.value.columns[index].precision
1601
+ length: parameter.value.columns[k].length,
1602
+ scale: parameter.value.columns[k].scale,
1603
+ precision: parameter.value.columns[k].precision
1418
1604
  };
1419
- parameter.value.columns[index].type.writeParameterData(buffer, param, options);
1605
+ parameter.value.columns[k].type.writeParameterData(buffer, param, options);
1420
1606
  }
1421
1607
  }
1422
- return buffer.writeUInt8(0x00);
1608
+
1609
+ buffer.writeUInt8(0x00);
1423
1610
  },
1424
- validate: function (value) {
1611
+ validate: function validate(value) {
1425
1612
  if (value == null) {
1426
1613
  return null;
1427
1614
  }
1615
+
1428
1616
  if (typeof value !== 'object') {
1429
- return new TypeError("Invalid table.");
1617
+ return new TypeError('Invalid table.');
1430
1618
  }
1619
+
1431
1620
  if (!Array.isArray(value.columns)) {
1432
- return new TypeError("Invalid table.");
1621
+ return new TypeError('Invalid table.');
1433
1622
  }
1623
+
1434
1624
  if (!Array.isArray(value.rows)) {
1435
- return new TypeError("Invalid table.");
1625
+ return new TypeError('Invalid table.');
1436
1626
  }
1627
+
1437
1628
  return value;
1438
1629
  }
1630
+ },
1631
+
1632
+ 0x62: {
1633
+ type: 'SSVARIANTTYPE',
1634
+ name: 'Variant',
1635
+ dataLengthLength: 4,
1636
+
1637
+ declaration: function declaration(parameter) {
1638
+ return 'sql_variant';
1639
+ }
1439
1640
  }
1440
1641
  };
1441
1642
 
@@ -1448,23 +1649,19 @@ TYPE = {
1448
1649
  SSVARIANTTYPE: 0x62 # Sql_Variant (introduced in TDS 7.2)
1449
1650
  */
1450
1651
 
1451
- typeByName = {};
1452
-
1453
- for (id in TYPE) {
1454
- type = TYPE[id];
1652
+ for (var id in TYPE) {
1653
+ var type = TYPE[id];
1455
1654
  type.id = parseInt(id, 10);
1456
1655
  typeByName[type.name] = type;
1457
1656
  if (type.aliases != null && type.aliases instanceof Array) {
1458
- ref = type.aliases;
1459
- for (i = 0, len = ref.length; i < len; i++) {
1460
- alias = ref[i];
1657
+ var ref = type.aliases;
1658
+ var len = ref.length;
1659
+
1660
+ for (var i = 0; i < len; i++) {
1661
+ var alias = ref[i];
1461
1662
  if (!typeByName[alias]) {
1462
1663
  typeByName[alias] = type;
1463
1664
  }
1464
1665
  }
1465
1666
  }
1466
- }
1467
-
1468
- exports.TYPE = TYPE;
1469
-
1470
- exports.typeByName = typeByName;
1667
+ }