tedious 2.2.3 → 2.2.4

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