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/prelogin-payload.js
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
var ENCRYPT, MARS, PreloginPayload, SUBBUILD, TOKEN, VERSION, WritableTrackingBuffer, encryptByValue, marsByValue, name, optionBufferSize, sprintf, value;
|
|
1
|
+
'use strict';
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
var sprintf = require('sprintf').sprintf;
|
|
8
|
+
var WritableTrackingBuffer = require('./tracking-buffer/tracking-buffer').WritableTrackingBuffer;
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
var optionBufferSize = 20;
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
var VERSION = 0x000000001;
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
var SUBBUILD = 0x0001;
|
|
15
|
+
|
|
16
|
+
var TOKEN = {
|
|
15
17
|
VERSION: 0x00,
|
|
16
18
|
ENCRYPTION: 0x01,
|
|
17
19
|
INSTOPT: 0x02,
|
|
@@ -20,38 +22,39 @@ TOKEN = {
|
|
|
20
22
|
TERMINATOR: 0xFF
|
|
21
23
|
};
|
|
22
24
|
|
|
23
|
-
ENCRYPT = {
|
|
25
|
+
var ENCRYPT = {
|
|
24
26
|
OFF: 0x00,
|
|
25
27
|
ON: 0x01,
|
|
26
28
|
NOT_SUP: 0x02,
|
|
27
29
|
REQ: 0x03
|
|
28
30
|
};
|
|
29
31
|
|
|
30
|
-
encryptByValue = {};
|
|
32
|
+
var encryptByValue = {};
|
|
31
33
|
|
|
32
|
-
for (
|
|
33
|
-
value = ENCRYPT[
|
|
34
|
-
encryptByValue[value] =
|
|
34
|
+
for (var _name in ENCRYPT) {
|
|
35
|
+
var value = ENCRYPT[_name];
|
|
36
|
+
encryptByValue[value] = _name;
|
|
35
37
|
}
|
|
36
38
|
|
|
37
|
-
MARS = {
|
|
39
|
+
var MARS = {
|
|
38
40
|
OFF: 0x00,
|
|
39
41
|
ON: 0x01
|
|
40
42
|
};
|
|
41
43
|
|
|
42
|
-
marsByValue = {};
|
|
44
|
+
var marsByValue = {};
|
|
43
45
|
|
|
44
|
-
for (
|
|
45
|
-
value = MARS[
|
|
46
|
-
marsByValue[value] =
|
|
46
|
+
for (var _name2 in MARS) {
|
|
47
|
+
var value = MARS[_name2];
|
|
48
|
+
marsByValue[value] = _name2;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
/*
|
|
50
52
|
s2.2.6.4
|
|
51
53
|
*/
|
|
52
|
-
|
|
53
|
-
PreloginPayload = (function () {
|
|
54
|
+
module.exports = (function () {
|
|
54
55
|
function PreloginPayload(bufferOrOptions) {
|
|
56
|
+
_classCallCheck(this, PreloginPayload);
|
|
57
|
+
|
|
55
58
|
if (bufferOrOptions instanceof Buffer) {
|
|
56
59
|
this.data = bufferOrOptions;
|
|
57
60
|
} else {
|
|
@@ -61,150 +64,157 @@ PreloginPayload = (function () {
|
|
|
61
64
|
this.extractOptions();
|
|
62
65
|
}
|
|
63
66
|
|
|
64
|
-
PreloginPayload
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
_createClass(PreloginPayload, [{
|
|
68
|
+
key: 'createOptions',
|
|
69
|
+
value: function createOptions() {
|
|
70
|
+
var options = [this.createVersionOption(), this.createEncryptionOption(), this.createInstanceOption(), this.createThreadIdOption(), this.createMarsOption()];
|
|
71
|
+
|
|
72
|
+
var length = 0;
|
|
73
|
+
for (var i = 0, len = options.length; i < len; i++) {
|
|
74
|
+
var option = options[i];
|
|
75
|
+
length += 5 + option.data.length;
|
|
76
|
+
}
|
|
77
|
+
length++; // terminator
|
|
78
|
+
this.data = new Buffer(length);
|
|
79
|
+
var optionOffset = 0;
|
|
80
|
+
var optionDataOffset = 5 * options.length + 1;
|
|
81
|
+
|
|
82
|
+
for (var j = 0, len = options.length; j < len; j++) {
|
|
83
|
+
var option = options[j];
|
|
84
|
+
this.data.writeUInt8(option.token, optionOffset + 0);
|
|
85
|
+
this.data.writeUInt16BE(optionDataOffset, optionOffset + 1);
|
|
86
|
+
this.data.writeUInt16BE(option.data.length, optionOffset + 3);
|
|
87
|
+
optionOffset += 5;
|
|
88
|
+
option.data.copy(this.data, optionDataOffset);
|
|
89
|
+
optionDataOffset += option.data.length;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return this.data.writeUInt8(TOKEN.TERMINATOR, optionOffset);
|
|
71
93
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
option.data.copy(this.data, optionDataOffset);
|
|
83
|
-
optionDataOffset += option.data.length;
|
|
94
|
+
}, {
|
|
95
|
+
key: 'createVersionOption',
|
|
96
|
+
value: function createVersionOption() {
|
|
97
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
98
|
+
buffer.writeUInt32BE(VERSION);
|
|
99
|
+
buffer.writeUInt16BE(SUBBUILD);
|
|
100
|
+
return {
|
|
101
|
+
token: TOKEN.VERSION,
|
|
102
|
+
data: buffer.data
|
|
103
|
+
};
|
|
84
104
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
buffer.writeUInt8(
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
}, {
|
|
106
|
+
key: 'createEncryptionOption',
|
|
107
|
+
value: function createEncryptionOption() {
|
|
108
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
109
|
+
if (this.options.encrypt) {
|
|
110
|
+
buffer.writeUInt8(ENCRYPT.ON);
|
|
111
|
+
} else {
|
|
112
|
+
buffer.writeUInt8(ENCRYPT.NOT_SUP);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
token: TOKEN.ENCRYPTION,
|
|
116
|
+
data: buffer.data
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}, {
|
|
120
|
+
key: 'createInstanceOption',
|
|
121
|
+
value: function createInstanceOption() {
|
|
122
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
123
|
+
buffer.writeUInt8(0x00);
|
|
124
|
+
return {
|
|
125
|
+
token: TOKEN.INSTOPT,
|
|
126
|
+
data: buffer.data
|
|
127
|
+
};
|
|
106
128
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
case TOKEN.ENCRYPTION:
|
|
155
|
-
this.extractEncryption(dataOffset);
|
|
156
|
-
break;
|
|
157
|
-
case TOKEN.INSTOPT:
|
|
158
|
-
this.extractInstance(dataOffset);
|
|
159
|
-
break;
|
|
160
|
-
case TOKEN.THREADID:
|
|
161
|
-
if (dataLength > 0) {
|
|
162
|
-
this.extractThreadId(dataOffset);
|
|
163
|
-
}
|
|
164
|
-
break;
|
|
165
|
-
case TOKEN.MARS:
|
|
166
|
-
this.extractMars(dataOffset);
|
|
129
|
+
}, {
|
|
130
|
+
key: 'createThreadIdOption',
|
|
131
|
+
value: function createThreadIdOption() {
|
|
132
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
133
|
+
buffer.writeUInt32BE(0x00);
|
|
134
|
+
return {
|
|
135
|
+
token: TOKEN.THREADID,
|
|
136
|
+
data: buffer.data
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}, {
|
|
140
|
+
key: 'createMarsOption',
|
|
141
|
+
value: function createMarsOption() {
|
|
142
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
143
|
+
buffer.writeUInt8(MARS.OFF);
|
|
144
|
+
return {
|
|
145
|
+
token: TOKEN.MARS,
|
|
146
|
+
data: buffer.data
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}, {
|
|
150
|
+
key: 'extractOptions',
|
|
151
|
+
value: function extractOptions() {
|
|
152
|
+
var offset = 0;
|
|
153
|
+
while (this.data[offset] !== TOKEN.TERMINATOR) {
|
|
154
|
+
var dataOffset = this.data.readUInt16BE(offset + 1);
|
|
155
|
+
var dataLength = this.data.readUInt16BE(offset + 3);
|
|
156
|
+
switch (this.data[offset]) {
|
|
157
|
+
case TOKEN.VERSION:
|
|
158
|
+
this.extractVersion(dataOffset);
|
|
159
|
+
break;
|
|
160
|
+
case TOKEN.ENCRYPTION:
|
|
161
|
+
this.extractEncryption(dataOffset);
|
|
162
|
+
break;
|
|
163
|
+
case TOKEN.INSTOPT:
|
|
164
|
+
this.extractInstance(dataOffset);
|
|
165
|
+
break;
|
|
166
|
+
case TOKEN.THREADID:
|
|
167
|
+
if (dataLength > 0) {
|
|
168
|
+
this.extractThreadId(dataOffset);
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
case TOKEN.MARS:
|
|
172
|
+
this.extractMars(dataOffset);
|
|
173
|
+
}
|
|
174
|
+
offset += 5;
|
|
175
|
+
dataOffset += dataLength;
|
|
167
176
|
}
|
|
168
|
-
offset += 5;
|
|
169
|
-
results.push(dataOffset += dataLength);
|
|
170
177
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
178
|
+
}, {
|
|
179
|
+
key: 'extractVersion',
|
|
180
|
+
value: function extractVersion(offset) {
|
|
181
|
+
return this.version = {
|
|
182
|
+
major: this.data.readUInt8(offset + 0),
|
|
183
|
+
minor: this.data.readUInt8(offset + 1),
|
|
184
|
+
patch: this.data.readUInt8(offset + 2),
|
|
185
|
+
trivial: this.data.readUInt8(offset + 3),
|
|
186
|
+
subbuild: this.data.readUInt16BE(offset + 4)
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}, {
|
|
190
|
+
key: 'extractEncryption',
|
|
191
|
+
value: function extractEncryption(offset) {
|
|
192
|
+
this.encryption = this.data.readUInt8(offset);
|
|
193
|
+
return this.encryptionString = encryptByValue[this.encryption];
|
|
194
|
+
}
|
|
195
|
+
}, {
|
|
196
|
+
key: 'extractInstance',
|
|
197
|
+
value: function extractInstance(offset) {
|
|
198
|
+
return this.instance = this.data.readUInt8(offset);
|
|
199
|
+
}
|
|
200
|
+
}, {
|
|
201
|
+
key: 'extractThreadId',
|
|
202
|
+
value: function extractThreadId(offset) {
|
|
203
|
+
return this.threadId = this.data.readUInt32BE(offset);
|
|
204
|
+
}
|
|
205
|
+
}, {
|
|
206
|
+
key: 'extractMars',
|
|
207
|
+
value: function extractMars(offset) {
|
|
208
|
+
this.mars = this.data.readUInt8(offset);
|
|
209
|
+
return this.marsString = marsByValue[this.mars];
|
|
210
|
+
}
|
|
211
|
+
}, {
|
|
212
|
+
key: 'toString',
|
|
213
|
+
value: function toString(indent) {
|
|
214
|
+
indent || (indent = '');
|
|
215
|
+
return indent + 'PreLogin - ' + sprintf('version:%d.%d.%d.%d %d, encryption:0x%02X(%s), instopt:0x%02X, threadId:0x%08X, mars:0x%02X(%s)', this.version.major, this.version.minor, this.version.patch, this.version.trivial, this.version.subbuild, this.encryption ? this.encryption : 0, this.encryptionString ? this.encryptionString : 0, this.instance ? this.instance : 0, this.threadId ? this.threadId : 0, this.mars ? this.mars : 0, this.marsString ? this.marsString : 0);
|
|
216
|
+
}
|
|
217
|
+
}]);
|
|
206
218
|
|
|
207
219
|
return PreloginPayload;
|
|
208
|
-
})();
|
|
209
|
-
|
|
210
|
-
module.exports = PreloginPayload;
|
|
220
|
+
})();
|
package/lib/request.js
CHANGED
|
@@ -1,31 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
var EventEmitter,
|
|
3
|
-
Request,
|
|
4
|
-
RequestError,
|
|
5
|
-
TYPES,
|
|
6
|
-
extend = function (child, parent) {
|
|
7
|
-
for (var key in parent) {
|
|
8
|
-
if (hasProp.call(parent, key)) child[key] = parent[key];
|
|
9
|
-
}function ctor() {
|
|
10
|
-
this.constructor = child;
|
|
11
|
-
}ctor.prototype = parent.prototype;child.prototype = new ctor();child.__super__ = parent.prototype;return child;
|
|
12
|
-
},
|
|
13
|
-
hasProp = ({}).hasOwnProperty;
|
|
1
|
+
'use strict';
|
|
14
2
|
|
|
15
|
-
|
|
3
|
+
var _get = require('babel-runtime/helpers/get')['default'];
|
|
16
4
|
|
|
17
|
-
|
|
5
|
+
var _inherits = require('babel-runtime/helpers/inherits')['default'];
|
|
18
6
|
|
|
19
|
-
|
|
7
|
+
var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
20
8
|
|
|
21
|
-
|
|
22
|
-
extend(Request, superClass);
|
|
9
|
+
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
23
10
|
|
|
24
|
-
|
|
11
|
+
var EventEmitter = require('events').EventEmitter;
|
|
12
|
+
var TYPES = require('./data-type').typeByName;
|
|
13
|
+
var RequestError = require('./errors').RequestError;
|
|
25
14
|
|
|
26
|
-
|
|
15
|
+
module.exports = (function (_EventEmitter) {
|
|
16
|
+
_inherits(Request, _EventEmitter);
|
|
27
17
|
|
|
28
18
|
function Request(sqlTextOrProcedure, callback) {
|
|
19
|
+
_classCallCheck(this, Request);
|
|
20
|
+
|
|
21
|
+
_get(Object.getPrototypeOf(Request.prototype), 'constructor', this).call(this);
|
|
22
|
+
|
|
29
23
|
this.sqlTextOrProcedure = sqlTextOrProcedure;
|
|
30
24
|
this.callback = callback;
|
|
31
25
|
this.parameters = [];
|
|
@@ -42,124 +36,130 @@ Request = (function (superClass) {
|
|
|
42
36
|
};
|
|
43
37
|
}
|
|
44
38
|
|
|
45
|
-
Request
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
options
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
type: type,
|
|
52
|
-
name: name,
|
|
53
|
-
value: value,
|
|
54
|
-
output: options.output || (options.output = false),
|
|
55
|
-
length: options.length,
|
|
56
|
-
precision: options.precision,
|
|
57
|
-
scale: options.scale
|
|
58
|
-
};
|
|
59
|
-
this.parameters.push(parameter);
|
|
60
|
-
return this.parametersByName[name] = parameter;
|
|
61
|
-
};
|
|
39
|
+
_createClass(Request, [{
|
|
40
|
+
key: 'addParameter',
|
|
41
|
+
value: function addParameter(name, type, value, options) {
|
|
42
|
+
if (options == null) {
|
|
43
|
+
options = {};
|
|
44
|
+
}
|
|
62
45
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
46
|
+
var parameter = {
|
|
47
|
+
type: type,
|
|
48
|
+
name: name,
|
|
49
|
+
value: value,
|
|
50
|
+
output: options.output || (options.output = false),
|
|
51
|
+
length: options.length,
|
|
52
|
+
precision: options.precision,
|
|
53
|
+
scale: options.scale
|
|
54
|
+
};
|
|
55
|
+
this.parameters.push(parameter);
|
|
56
|
+
return this.parametersByName[name] = parameter;
|
|
66
57
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
var i, len, parameter, paramsParameter;
|
|
73
|
-
paramsParameter = '';
|
|
74
|
-
for (i = 0, len = parameters.length; i < len; i++) {
|
|
75
|
-
parameter = parameters[i];
|
|
76
|
-
if (paramsParameter.length > 0) {
|
|
77
|
-
paramsParameter += ', ';
|
|
58
|
+
}, {
|
|
59
|
+
key: 'addOutputParameter',
|
|
60
|
+
value: function addOutputParameter(name, type, value, options) {
|
|
61
|
+
if (options == null) {
|
|
62
|
+
options = {};
|
|
78
63
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
64
|
+
options.output = true;
|
|
65
|
+
return this.addParameter(name, type, value, options);
|
|
66
|
+
}
|
|
67
|
+
}, {
|
|
68
|
+
key: 'makeParamsParameter',
|
|
69
|
+
value: function makeParamsParameter(parameters) {
|
|
70
|
+
var paramsParameter = '';
|
|
71
|
+
for (var i = 0, len = parameters.length; i < len; i++) {
|
|
72
|
+
var parameter = parameters[i];
|
|
73
|
+
if (paramsParameter.length > 0) {
|
|
74
|
+
paramsParameter += ', ';
|
|
75
|
+
}
|
|
76
|
+
paramsParameter += '@' + parameter.name + ' ';
|
|
77
|
+
paramsParameter += parameter.type.declaration(parameter);
|
|
78
|
+
if (parameter.output) {
|
|
79
|
+
paramsParameter += ' OUTPUT';
|
|
80
|
+
}
|
|
83
81
|
}
|
|
82
|
+
return paramsParameter;
|
|
84
83
|
}
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
}, {
|
|
85
|
+
key: 'transformIntoExecuteSqlRpc',
|
|
86
|
+
value: function transformIntoExecuteSqlRpc() {
|
|
87
|
+
if (this.validateParameters()) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
this.originalParameters = this.parameters;
|
|
92
|
+
this.parameters = [];
|
|
93
|
+
this.addParameter('statement', TYPES.NVarChar, this.sqlTextOrProcedure);
|
|
94
|
+
if (this.originalParameters.length) {
|
|
95
|
+
this.addParameter('params', TYPES.NVarChar, this.makeParamsParameter(this.originalParameters));
|
|
96
|
+
}
|
|
87
97
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
98
|
+
for (var i = 0, len = this.originalParameters.length; i < len; i++) {
|
|
99
|
+
var parameter = this.originalParameters[i];
|
|
100
|
+
this.parameters.push(parameter);
|
|
101
|
+
}
|
|
102
|
+
return this.sqlTextOrProcedure = 'sp_executesql';
|
|
92
103
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
}, {
|
|
105
|
+
key: 'transformIntoPrepareRpc',
|
|
106
|
+
value: function transformIntoPrepareRpc() {
|
|
107
|
+
var _this = this;
|
|
108
|
+
|
|
109
|
+
this.originalParameters = this.parameters;
|
|
110
|
+
this.parameters = [];
|
|
111
|
+
this.addOutputParameter('handle', TYPES.Int);
|
|
97
112
|
this.addParameter('params', TYPES.NVarChar, this.makeParamsParameter(this.originalParameters));
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
this.parameters.push(parameter);
|
|
103
|
-
}
|
|
104
|
-
return this.sqlTextOrProcedure = 'sp_executesql';
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
Request.prototype.transformIntoPrepareRpc = function () {
|
|
108
|
-
this.originalParameters = this.parameters;
|
|
109
|
-
this.parameters = [];
|
|
110
|
-
this.addOutputParameter('handle', TYPES.Int);
|
|
111
|
-
this.addParameter('params', TYPES.NVarChar, this.makeParamsParameter(this.originalParameters));
|
|
112
|
-
this.addParameter('stmt', TYPES.NVarChar, this.sqlTextOrProcedure);
|
|
113
|
-
this.sqlTextOrProcedure = 'sp_prepare';
|
|
114
|
-
this.preparing = true;
|
|
115
|
-
return this.on('returnValue', (function (_this) {
|
|
116
|
-
return function (name, value, metadata) {
|
|
113
|
+
this.addParameter('stmt', TYPES.NVarChar, this.sqlTextOrProcedure);
|
|
114
|
+
this.sqlTextOrProcedure = 'sp_prepare';
|
|
115
|
+
this.preparing = true;
|
|
116
|
+
return this.on('returnValue', function (name, value) {
|
|
117
117
|
if (name === 'handle') {
|
|
118
118
|
return _this.handle = value;
|
|
119
119
|
} else {
|
|
120
|
-
return _this.error = RequestError(
|
|
120
|
+
return _this.error = RequestError('Tedious > Unexpected output parameter ' + name + ' from sp_prepare');
|
|
121
121
|
}
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}, {
|
|
125
|
+
key: 'transformIntoUnprepareRpc',
|
|
126
|
+
value: function transformIntoUnprepareRpc() {
|
|
127
|
+
this.parameters = [];
|
|
128
|
+
this.addParameter('handle', TYPES.Int, this.handle);
|
|
129
|
+
return this.sqlTextOrProcedure = 'sp_unprepare';
|
|
130
|
+
}
|
|
131
|
+
}, {
|
|
132
|
+
key: 'transformIntoExecuteRpc',
|
|
133
|
+
value: function transformIntoExecuteRpc(parameters) {
|
|
134
|
+
this.parameters = [];
|
|
135
|
+
this.addParameter('handle', TYPES.Int, this.handle);
|
|
136
|
+
|
|
137
|
+
for (var i = 0, len = this.originalParameters.length; i < len; i++) {
|
|
138
|
+
var parameter = this.originalParameters[i];
|
|
139
|
+
parameter.value = parameters[parameter.name];
|
|
140
|
+
this.parameters.push(parameter);
|
|
141
|
+
}
|
|
125
142
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return this.sqlTextOrProcedure = 'sp_unprepare';
|
|
130
|
-
};
|
|
143
|
+
if (this.validateParameters()) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
131
146
|
|
|
132
|
-
|
|
133
|
-
var i, len, parameter, ref;
|
|
134
|
-
this.parameters = [];
|
|
135
|
-
this.addParameter('handle', TYPES.Int, this.handle);
|
|
136
|
-
ref = this.originalParameters;
|
|
137
|
-
for (i = 0, len = ref.length; i < len; i++) {
|
|
138
|
-
parameter = ref[i];
|
|
139
|
-
parameter.value = parameters[parameter.name];
|
|
140
|
-
this.parameters.push(parameter);
|
|
147
|
+
return this.sqlTextOrProcedure = 'sp_execute';
|
|
141
148
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
parameter = ref[i];
|
|
153
|
-
value = parameter.type.validate(parameter.value);
|
|
154
|
-
if (value instanceof TypeError) {
|
|
155
|
-
return this.error = new RequestError("Validation failed for parameter '" + parameter.name + "'. " + value.message, "EPARAM");
|
|
149
|
+
}, {
|
|
150
|
+
key: 'validateParameters',
|
|
151
|
+
value: function validateParameters() {
|
|
152
|
+
for (var i = 0, len = this.parameters.length; i < len; i++) {
|
|
153
|
+
var parameter = this.parameters[i];
|
|
154
|
+
var value = parameter.type.validate(parameter.value);
|
|
155
|
+
if (value instanceof TypeError) {
|
|
156
|
+
return this.error = new RequestError('Validation failed for parameter \'' + parameter.name + '\'. ' + value.message, 'EPARAM');
|
|
157
|
+
}
|
|
158
|
+
parameter.value = value;
|
|
156
159
|
}
|
|
157
|
-
|
|
160
|
+
return null;
|
|
158
161
|
}
|
|
159
|
-
|
|
160
|
-
};
|
|
162
|
+
}]);
|
|
161
163
|
|
|
162
164
|
return Request;
|
|
163
|
-
})(EventEmitter);
|
|
164
|
-
|
|
165
|
-
module.exports = Request;
|
|
165
|
+
})(EventEmitter);
|