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.
- package/README.md +1 -1
- package/appveyor.yml +9 -5
- package/benchmarks/README.md +33 -0
- package/benchmarks/common.js +82 -0
- package/benchmarks/index.js +34 -0
- package/benchmarks/query/many-result-rows.js +49 -0
- package/benchmarks/query/nvarchar-large.js +44 -0
- package/benchmarks/query/nvarchar-small.js +44 -0
- package/benchmarks/query/varbinary-4.js +42 -0
- package/benchmarks/query/varbinary-huge.js +46 -0
- package/benchmarks/query/varbinary-large.js +46 -0
- package/benchmarks/query/varbinary-small.js +42 -0
- package/benchmarks/token-parser/colmetadata-token.js +42 -0
- package/benchmarks/token-parser/done-token.js +42 -0
- package/benchmarks/token-parser/simple-tokens.js +366 -0
- package/lib/all-headers.js +9 -11
- package/lib/buffertools.js +17 -13
- package/lib/bulk-load.js +196 -169
- package/lib/collation.js +80 -2
- package/lib/connection.js +1086 -1060
- package/lib/data-type.js +450 -253
- package/lib/debug.js +57 -51
- package/lib/errors.js +40 -55
- package/lib/guid-parser.js +12 -36
- package/lib/instance-lookup.js +57 -54
- package/lib/library.js +3 -2
- package/lib/login7-payload.js +187 -180
- package/lib/message-io.js +169 -199
- package/lib/metadata-parser.js +169 -255
- package/lib/ntlm-payload.js +173 -160
- package/lib/packet.js +166 -152
- package/lib/prelogin-payload.js +170 -160
- package/lib/request.js +122 -122
- package/lib/rpcrequest-payload.js +64 -38
- package/lib/special-stored-procedure.js +3 -2
- package/lib/sqlbatch-payload.js +20 -16
- package/lib/stream-parser.js +116 -104
- package/lib/tds-versions.js +5 -8
- package/lib/tedious.js +8 -14
- package/lib/token/colmetadata-token-parser.js +79 -125
- package/lib/token/done-token-parser.js +47 -129
- package/lib/token/env-change-token-parser.js +90 -126
- package/lib/token/infoerror-token-parser.js +47 -125
- package/lib/token/loginack-token-parser.js +36 -74
- package/lib/token/nbcrow-token-parser.js +40 -64
- package/lib/token/order-token-parser.js +26 -43
- package/lib/token/returnstatus-token-parser.js +11 -23
- package/lib/token/returnvalue-token-parser.js +31 -54
- package/lib/token/row-token-parser.js +39 -52
- package/lib/token/sspi-token-parser.js +14 -32
- package/lib/token/stream-parser.js +424 -304
- package/lib/token/token-stream-parser.js +39 -34
- package/lib/token/token.js +3 -6
- package/lib/tracking-buffer/bigint.js +45 -48
- package/lib/tracking-buffer/readable-tracking-buffer.js +238 -223
- package/lib/tracking-buffer/tracking-buffer.js +3 -9
- package/lib/tracking-buffer/writable-tracking-buffer.js +272 -244
- package/lib/transaction.js +112 -102
- package/lib/value-parser.js +559 -1154
- package/package.json +10 -9
- package/benchmarks/benchmarks.coffee +0 -122
- package/benchmarks/query.coffee +0 -57
package/lib/data-type.js
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
12
|
+
var typeByName = module.exports.typeByName = {};
|
|
9
13
|
|
|
10
|
-
|
|
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
|
-
|
|
23
|
+
|
|
24
|
+
declaration: function declaration() {
|
|
27
25
|
return 'tinyint';
|
|
28
26
|
},
|
|
29
|
-
|
|
27
|
+
|
|
28
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
30
29
|
buffer.writeUInt8(typeByName.IntN.id);
|
|
31
30
|
return buffer.writeUInt8(1);
|
|
32
31
|
},
|
|
33
|
-
|
|
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
|
-
|
|
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(
|
|
48
|
+
return new TypeError('Invalid number.');
|
|
48
49
|
}
|
|
49
50
|
if (value < 0 || value > 255) {
|
|
50
|
-
return new TypeError(
|
|
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
|
-
|
|
60
|
+
|
|
61
|
+
declaration: function declaration() {
|
|
59
62
|
return 'bit';
|
|
60
63
|
},
|
|
61
|
-
|
|
64
|
+
|
|
65
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
62
66
|
buffer.writeUInt8(typeByName.BitN.id);
|
|
63
67
|
return buffer.writeUInt8(1);
|
|
64
68
|
},
|
|
65
|
-
|
|
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
|
-
|
|
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
|
-
|
|
94
|
+
|
|
95
|
+
declaration: function declaration() {
|
|
88
96
|
return 'smallint';
|
|
89
97
|
},
|
|
90
|
-
|
|
98
|
+
|
|
99
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
91
100
|
buffer.writeUInt8(typeByName.IntN.id);
|
|
92
101
|
return buffer.writeUInt8(2);
|
|
93
102
|
},
|
|
94
|
-
|
|
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
|
-
|
|
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(
|
|
119
|
+
return new TypeError('Invalid number.');
|
|
109
120
|
}
|
|
110
121
|
if (value < -32768 || value > 32767) {
|
|
111
|
-
return new TypeError(
|
|
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
|
-
|
|
131
|
+
|
|
132
|
+
declaration: function declaration() {
|
|
120
133
|
return 'int';
|
|
121
134
|
},
|
|
122
|
-
|
|
135
|
+
|
|
136
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
123
137
|
buffer.writeUInt8(typeByName.IntN.id);
|
|
124
138
|
return buffer.writeUInt8(4);
|
|
125
139
|
},
|
|
126
|
-
|
|
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
|
-
|
|
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(
|
|
156
|
+
return new TypeError('Invalid number.');
|
|
141
157
|
}
|
|
142
158
|
if (value < -2147483648 || value > 2147483647) {
|
|
143
|
-
return new TypeError(
|
|
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
|
-
|
|
168
|
+
|
|
169
|
+
declaration: function declaration() {
|
|
152
170
|
return 'smalldatetime';
|
|
153
171
|
},
|
|
154
|
-
|
|
172
|
+
|
|
173
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
155
174
|
buffer.writeUInt8(typeByName.DateTimeN.id);
|
|
156
175
|
return buffer.writeUInt8(4);
|
|
157
176
|
},
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
221
|
+
|
|
222
|
+
declaration: function declaration() {
|
|
193
223
|
return 'real';
|
|
194
224
|
},
|
|
195
|
-
|
|
225
|
+
|
|
226
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
196
227
|
buffer.writeUInt8(typeByName.FloatN.id);
|
|
197
228
|
return buffer.writeUInt8(4);
|
|
198
229
|
},
|
|
199
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
222
|
-
|
|
255
|
+
|
|
256
|
+
declaration: function declaration() {
|
|
257
|
+
return 'money';
|
|
223
258
|
},
|
|
224
|
-
|
|
259
|
+
|
|
260
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
225
261
|
buffer.writeUInt8(typeByName.MoneyN.id);
|
|
226
262
|
return buffer.writeUInt8(8);
|
|
227
263
|
},
|
|
228
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
289
|
+
|
|
290
|
+
declaration: function declaration() {
|
|
251
291
|
return 'datetime';
|
|
252
292
|
},
|
|
253
|
-
|
|
293
|
+
|
|
294
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
254
295
|
buffer.writeUInt8(typeByName.DateTimeN.id);
|
|
255
296
|
return buffer.writeUInt8(8);
|
|
256
297
|
},
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
350
|
+
|
|
351
|
+
declaration: function declaration() {
|
|
300
352
|
return 'float';
|
|
301
353
|
},
|
|
302
|
-
|
|
354
|
+
|
|
355
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
303
356
|
buffer.writeUInt8(typeByName.FloatN.id);
|
|
304
357
|
return buffer.writeUInt8(8);
|
|
305
358
|
},
|
|
306
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
331
|
-
|
|
386
|
+
|
|
387
|
+
declaration: function declaration(parameter) {
|
|
388
|
+
return 'decimal(' + this.resolvePrecision(parameter) + ', ' + this.resolveScale(parameter) + ')';
|
|
332
389
|
},
|
|
333
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
364
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
409
|
-
|
|
470
|
+
|
|
471
|
+
declaration: function declaration(parameter) {
|
|
472
|
+
return 'numeric(' + this.resolvePrecision(parameter) + ', ' + this.resolveScale(parameter) + ')';
|
|
410
473
|
},
|
|
411
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
442
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
485
|
-
|
|
552
|
+
|
|
553
|
+
declaration: function declaration() {
|
|
554
|
+
return 'smallmoney';
|
|
486
555
|
},
|
|
487
|
-
|
|
556
|
+
|
|
557
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
488
558
|
buffer.writeUInt8(typeByName.MoneyN.id);
|
|
489
559
|
return buffer.writeUInt8(4);
|
|
490
560
|
},
|
|
491
|
-
|
|
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
|
-
|
|
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(
|
|
577
|
+
return new TypeError('Invalid number.');
|
|
506
578
|
}
|
|
507
579
|
if (value < -214748.3648 || value > 214748.3647) {
|
|
508
|
-
return new TypeError(
|
|
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
|
-
|
|
589
|
+
|
|
590
|
+
declaration: function declaration() {
|
|
517
591
|
return 'bigint';
|
|
518
592
|
},
|
|
519
|
-
|
|
593
|
+
|
|
594
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
520
595
|
buffer.writeUInt8(typeByName.IntN.id);
|
|
521
596
|
return buffer.writeUInt8(8);
|
|
522
597
|
},
|
|
523
|
-
|
|
524
|
-
|
|
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
|
-
|
|
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
|
-
|
|
623
|
+
|
|
624
|
+
declaration: function declaration() {
|
|
547
625
|
return 'image';
|
|
548
626
|
},
|
|
549
|
-
|
|
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
|
-
|
|
635
|
+
|
|
636
|
+
writeTypeInfo: function writeTypeInfo(buffer, parameter) {
|
|
557
637
|
buffer.writeUInt8(this.id);
|
|
558
638
|
return buffer.writeInt32LE(parameter.length);
|
|
559
639
|
},
|
|
560
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
668
|
+
|
|
669
|
+
declaration: function declaration() {
|
|
586
670
|
return 'text';
|
|
587
671
|
},
|
|
588
|
-
|
|
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
|
-
|
|
680
|
+
|
|
681
|
+
writeTypeInfo: function writeTypeInfo(buffer, parameter) {
|
|
596
682
|
buffer.writeUInt8(typeByName.Text.id);
|
|
597
683
|
return buffer.writeInt32LE(parameter.length);
|
|
598
684
|
},
|
|
599
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
715
|
+
|
|
716
|
+
declaration: function declaration() {
|
|
627
717
|
return 'uniqueidentifier';
|
|
628
718
|
},
|
|
629
|
-
|
|
719
|
+
|
|
720
|
+
resolveLength: function resolveLength() {
|
|
630
721
|
return 16;
|
|
631
722
|
},
|
|
632
|
-
|
|
723
|
+
|
|
724
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
633
725
|
buffer.writeUInt8(typeByName.UniqueIdentifierN.id);
|
|
634
726
|
return buffer.writeUInt8(0x10);
|
|
635
727
|
},
|
|
636
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
710
|
-
|
|
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
|
|
825
|
+
return 'varbinary(' + length + ')';
|
|
722
826
|
} else {
|
|
723
|
-
return
|
|
827
|
+
return 'varbinary(max)';
|
|
724
828
|
}
|
|
725
829
|
},
|
|
726
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
776
|
-
|
|
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
|
|
898
|
+
return 'varchar(' + length + ')';
|
|
788
899
|
} else {
|
|
789
|
-
return
|
|
900
|
+
return 'varchar(max)';
|
|
790
901
|
}
|
|
791
902
|
},
|
|
792
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
849
|
-
|
|
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
|
-
|
|
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
|
-
|
|
986
|
+
|
|
987
|
+
writeTypeInfo: function writeTypeInfo(buffer, parameter) {
|
|
859
988
|
buffer.writeUInt8(this.id);
|
|
860
989
|
return buffer.writeUInt16LE(parameter.length);
|
|
861
990
|
},
|
|
862
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
887
|
-
|
|
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
|
|
1032
|
+
return 'char(' + length + ')';
|
|
899
1033
|
} else {
|
|
900
|
-
return
|
|
1034
|
+
return 'char(' + this.maximumLength + ')';
|
|
901
1035
|
}
|
|
902
1036
|
},
|
|
903
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
948
|
-
|
|
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
|
|
1100
|
+
return 'nvarchar(' + length + ')';
|
|
960
1101
|
} else {
|
|
961
|
-
return
|
|
1102
|
+
return 'nvarchar(max)';
|
|
962
1103
|
}
|
|
963
1104
|
},
|
|
964
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
1022
|
-
|
|
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
|
|
1181
|
+
return 'nchar(' + length + ')';
|
|
1034
1182
|
} else {
|
|
1035
|
-
return
|
|
1183
|
+
return 'nchar(' + this.maximumLength + ')';
|
|
1036
1184
|
}
|
|
1037
1185
|
},
|
|
1038
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
|
1087
|
-
|
|
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
|
-
|
|
1103
|
-
|
|
1257
|
+
|
|
1258
|
+
declaration: function declaration(parameter) {
|
|
1259
|
+
return 'time(' + this.resolveScale(parameter) + ')';
|
|
1104
1260
|
},
|
|
1105
|
-
|
|
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
|
-
|
|
1271
|
+
|
|
1272
|
+
writeTypeInfo: function writeTypeInfo(buffer, parameter) {
|
|
1115
1273
|
buffer.writeUInt8(this.id);
|
|
1116
1274
|
return buffer.writeUInt8(parameter.scale);
|
|
1117
1275
|
},
|
|
1118
|
-
|
|
1119
|
-
|
|
1276
|
+
|
|
1277
|
+
writeParameterData: function writeParameterData(buffer, parameter, options) {
|
|
1120
1278
|
if (parameter.value != null) {
|
|
1121
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
|
1167
|
-
|
|
1168
|
-
|
|
1327
|
+
dataLengthLength: 1,
|
|
1328
|
+
fixedDataLength: 3,
|
|
1329
|
+
|
|
1330
|
+
declaration: function declaration() {
|
|
1331
|
+
return 'date';
|
|
1169
1332
|
},
|
|
1170
|
-
|
|
1333
|
+
|
|
1334
|
+
writeTypeInfo: function writeTypeInfo(buffer) {
|
|
1171
1335
|
return buffer.writeUInt8(this.id);
|
|
1172
1336
|
},
|
|
1173
|
-
|
|
1174
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
|
1206
|
-
|
|
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
|
-
|
|
1222
|
-
|
|
1388
|
+
|
|
1389
|
+
declaration: function declaration(parameter) {
|
|
1390
|
+
return 'datetime2(' + this.resolveScale(parameter) + ')';
|
|
1223
1391
|
},
|
|
1224
|
-
|
|
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
|
-
|
|
1402
|
+
|
|
1403
|
+
writeTypeInfo: function writeTypeInfo(buffer, parameter) {
|
|
1234
1404
|
buffer.writeUInt8(this.id);
|
|
1235
1405
|
return buffer.writeUInt8(parameter.scale);
|
|
1236
1406
|
},
|
|
1237
|
-
|
|
1238
|
-
|
|
1407
|
+
|
|
1408
|
+
writeParameterData: function writeParameterData(buffer, parameter, options) {
|
|
1239
1409
|
if (parameter.value != null) {
|
|
1240
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
1380
|
-
|
|
1554
|
+
|
|
1555
|
+
declaration: function declaration(parameter) {
|
|
1556
|
+
return parameter.value.name + ' readonly';
|
|
1381
1557
|
},
|
|
1382
|
-
|
|
1383
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1390
|
-
|
|
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
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
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
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
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
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
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[
|
|
1416
|
-
scale: parameter.value.columns[
|
|
1417
|
-
precision: parameter.value.columns[
|
|
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[
|
|
1605
|
+
parameter.value.columns[k].type.writeParameterData(buffer, param, options);
|
|
1420
1606
|
}
|
|
1421
1607
|
}
|
|
1422
|
-
|
|
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(
|
|
1617
|
+
return new TypeError('Invalid table.');
|
|
1430
1618
|
}
|
|
1619
|
+
|
|
1431
1620
|
if (!Array.isArray(value.columns)) {
|
|
1432
|
-
return new TypeError(
|
|
1621
|
+
return new TypeError('Invalid table.');
|
|
1433
1622
|
}
|
|
1623
|
+
|
|
1434
1624
|
if (!Array.isArray(value.rows)) {
|
|
1435
|
-
return new TypeError(
|
|
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
|
-
|
|
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
|
-
|
|
1460
|
-
|
|
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
|
+
}
|