tedious 1.13.2 → 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/appveyor.yml +2 -0
- package/lib/all-headers.js +2 -5
- package/lib/buffertools.js +1 -1
- package/lib/bulk-load.js +18 -27
- package/lib/collation.js +78 -6
- package/lib/connection.js +120 -159
- package/lib/data-type.js +73 -72
- package/lib/debug.js +5 -17
- package/lib/errors.js +8 -16
- package/lib/guid-parser.js +2 -5
- package/lib/instance-lookup.js +7 -16
- package/lib/library.js +1 -5
- package/lib/login7-payload.js +16 -34
- package/lib/message-io.js +21 -35
- package/lib/metadata-parser.js +22 -18
- package/lib/ntlm-payload.js +9 -24
- package/lib/packet.js +11 -18
- package/lib/prelogin-payload.js +10 -19
- package/lib/request.js +15 -24
- package/lib/rpcrequest-payload.js +7 -16
- package/lib/special-stored-procedure.js +3 -7
- package/lib/sqlbatch-payload.js +7 -16
- package/lib/stream-parser.js +24 -36
- package/lib/tds-versions.js +2 -8
- package/lib/tedious.js +8 -52
- package/lib/token/colmetadata-token-parser.js +4 -14
- package/lib/token/done-token-parser.js +6 -9
- package/lib/token/env-change-token-parser.js +4 -9
- package/lib/token/infoerror-token-parser.js +9 -12
- package/lib/token/loginack-token-parser.js +8 -8
- package/lib/token/nbcrow-token-parser.js +5 -15
- package/lib/token/order-token-parser.js +3 -9
- package/lib/token/returnstatus-token-parser.js +3 -9
- package/lib/token/returnvalue-token-parser.js +7 -20
- package/lib/token/row-token-parser.js +5 -15
- package/lib/token/sspi-token-parser.js +3 -8
- package/lib/token/stream-parser.js +60 -58
- package/lib/token/token-stream-parser.js +14 -23
- package/lib/token/token.js +3 -7
- package/lib/tracking-buffer/bigint.js +2 -5
- package/lib/tracking-buffer/readable-tracking-buffer.js +6 -13
- package/lib/tracking-buffer/tracking-buffer.js +2 -16
- package/lib/tracking-buffer/writable-tracking-buffer.js +3 -15
- package/lib/transaction.js +7 -12
- package/lib/value-parser.js +95 -69
- package/package.json +6 -1
package/lib/connection.js
CHANGED
|
@@ -8,67 +8,27 @@ var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
|
8
8
|
|
|
9
9
|
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
10
10
|
|
|
11
|
-
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
|
|
12
|
-
|
|
13
|
-
Object.defineProperty(exports, '__esModule', {
|
|
14
|
-
value: true
|
|
15
|
-
});
|
|
16
|
-
|
|
17
11
|
require('./buffertools');
|
|
18
12
|
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
var
|
|
24
|
-
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
var
|
|
30
|
-
|
|
31
|
-
var
|
|
32
|
-
|
|
33
|
-
var
|
|
34
|
-
|
|
35
|
-
var
|
|
36
|
-
|
|
37
|
-
var
|
|
38
|
-
|
|
39
|
-
var _login7Payload2 = _interopRequireDefault(_login7Payload);
|
|
40
|
-
|
|
41
|
-
var _ntlmPayload = require('./ntlm-payload');
|
|
42
|
-
|
|
43
|
-
var _ntlmPayload2 = _interopRequireDefault(_ntlmPayload);
|
|
44
|
-
|
|
45
|
-
var _request = require('./request');
|
|
46
|
-
|
|
47
|
-
var _request2 = _interopRequireDefault(_request);
|
|
48
|
-
|
|
49
|
-
var _rpcrequestPayload = require('./rpcrequest-payload');
|
|
50
|
-
|
|
51
|
-
var _rpcrequestPayload2 = _interopRequireDefault(_rpcrequestPayload);
|
|
52
|
-
|
|
53
|
-
var _sqlbatchPayload = require('./sqlbatch-payload');
|
|
54
|
-
|
|
55
|
-
var _sqlbatchPayload2 = _interopRequireDefault(_sqlbatchPayload);
|
|
56
|
-
|
|
57
|
-
var _messageIo = require('./message-io');
|
|
58
|
-
|
|
59
|
-
var _messageIo2 = _interopRequireDefault(_messageIo);
|
|
60
|
-
|
|
61
|
-
var _net = require('net');
|
|
62
|
-
|
|
63
|
-
var _tokenTokenStreamParser = require('./token/token-stream-parser');
|
|
64
|
-
|
|
65
|
-
var _transaction = require('./transaction');
|
|
66
|
-
|
|
67
|
-
var _crypto = require('crypto');
|
|
68
|
-
|
|
69
|
-
var _crypto2 = _interopRequireDefault(_crypto);
|
|
70
|
-
|
|
71
|
-
var _errors = require('./errors');
|
|
13
|
+
var BulkLoad = require('./bulk-load');
|
|
14
|
+
var Debug = require('./debug');
|
|
15
|
+
var EventEmitter = require('events').EventEmitter;
|
|
16
|
+
var instanceLookup = require('./instance-lookup').instanceLookup;
|
|
17
|
+
var TYPE = require('./packet').TYPE;
|
|
18
|
+
var PreloginPayload = require('./prelogin-payload');
|
|
19
|
+
var Login7Payload = require('./login7-payload');
|
|
20
|
+
var NTLMResponsePayload = require('./ntlm-payload');
|
|
21
|
+
var Request = require('./request');
|
|
22
|
+
var RpcRequestPayload = require('./rpcrequest-payload');
|
|
23
|
+
var SqlBatchPayload = require('./sqlbatch-payload');
|
|
24
|
+
var MessageIO = require('./message-io');
|
|
25
|
+
var Socket = require('net').Socket;
|
|
26
|
+
var TokenStreamParser = require('./token/token-stream-parser').Parser;
|
|
27
|
+
var Transaction = require('./transaction').Transaction;
|
|
28
|
+
var ISOLATION_LEVEL = require('./transaction').ISOLATION_LEVEL;
|
|
29
|
+
var crypto = require('crypto');
|
|
30
|
+
var ConnectionError = require('./errors').ConnectionError;
|
|
31
|
+
var RequestError = require('./errors').RequestError;
|
|
72
32
|
|
|
73
33
|
// A rather basic state machine for managing a connection.
|
|
74
34
|
// Implements something approximating s3.2.1.
|
|
@@ -167,7 +127,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
167
127
|
}
|
|
168
128
|
|
|
169
129
|
if (!this.config.options.isolationLevel) {
|
|
170
|
-
this.config.options.isolationLevel =
|
|
130
|
+
this.config.options.isolationLevel = ISOLATION_LEVEL.READ_COMMITTED;
|
|
171
131
|
}
|
|
172
132
|
|
|
173
133
|
if (this.config.options.encrypt == undefined) {
|
|
@@ -187,7 +147,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
187
147
|
}
|
|
188
148
|
|
|
189
149
|
if (!this.config.options.connectionIsolationLevel) {
|
|
190
|
-
this.config.options.connectionIsolationLevel =
|
|
150
|
+
this.config.options.connectionIsolationLevel = ISOLATION_LEVEL.READ_COMMITTED;
|
|
191
151
|
}
|
|
192
152
|
|
|
193
153
|
if (this.config.options.readOnlyIntent == undefined) {
|
|
@@ -201,10 +161,10 @@ var Connection = (function (_EventEmitter) {
|
|
|
201
161
|
if (!this.config.options.port && !this.config.options.instanceName) {
|
|
202
162
|
this.config.options.port = DEFAULT_PORT;
|
|
203
163
|
} else if (this.config.options.port && this.config.options.instanceName) {
|
|
204
|
-
throw new Error(
|
|
164
|
+
throw new Error('Port and instanceName are mutually exclusive, but ' + this.config.options.port + ' and ' + this.config.options.instanceName + ' provided');
|
|
205
165
|
} else if (this.config.options.port) {
|
|
206
166
|
if (this.config.options.port < 0 || this.config.options.port > 65536) {
|
|
207
|
-
throw new RangeError(
|
|
167
|
+
throw new RangeError('Port should be > 0 and < 65536');
|
|
208
168
|
}
|
|
209
169
|
}
|
|
210
170
|
|
|
@@ -217,7 +177,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
217
177
|
value: function createDebug() {
|
|
218
178
|
var _this = this;
|
|
219
179
|
|
|
220
|
-
this.debug = new
|
|
180
|
+
this.debug = new Debug(this.config.options.debug);
|
|
221
181
|
return this.debug.on('debug', function (message) {
|
|
222
182
|
return _this.emit('debug', message);
|
|
223
183
|
});
|
|
@@ -227,7 +187,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
227
187
|
value: function createTokenStreamParser() {
|
|
228
188
|
var _this2 = this;
|
|
229
189
|
|
|
230
|
-
this.tokenStreamParser = new
|
|
190
|
+
this.tokenStreamParser = new TokenStreamParser(this.debug, void 0, this.config.options);
|
|
231
191
|
|
|
232
192
|
this.tokenStreamParser.on('infoMessage', function (token) {
|
|
233
193
|
return _this2.emit('infoMessage', token);
|
|
@@ -244,16 +204,16 @@ var Connection = (function (_EventEmitter) {
|
|
|
244
204
|
_this2.emit('errorMessage', token);
|
|
245
205
|
if (_this2.loggedIn) {
|
|
246
206
|
if (_this2.request) {
|
|
247
|
-
_this2.request.error =
|
|
207
|
+
_this2.request.error = RequestError(token.message, 'EREQUEST');
|
|
248
208
|
_this2.request.error.number = token.number;
|
|
249
209
|
_this2.request.error.state = token.state;
|
|
250
|
-
_this2.request.error[
|
|
210
|
+
_this2.request.error['class'] = token['class'];
|
|
251
211
|
_this2.request.error.serverName = token.serverName;
|
|
252
212
|
_this2.request.error.procName = token.procName;
|
|
253
213
|
return _this2.request.error.lineNumber = token.lineNumber;
|
|
254
214
|
}
|
|
255
215
|
} else {
|
|
256
|
-
return _this2.loginError =
|
|
216
|
+
return _this2.loginError = ConnectionError(token.message, 'ELOGIN');
|
|
257
217
|
}
|
|
258
218
|
});
|
|
259
219
|
|
|
@@ -272,14 +232,14 @@ var Connection = (function (_EventEmitter) {
|
|
|
272
232
|
this.tokenStreamParser.on('loginack', function (token) {
|
|
273
233
|
if (!token.tdsVersion) {
|
|
274
234
|
// unsupported TDS version
|
|
275
|
-
_this2.loginError =
|
|
235
|
+
_this2.loginError = ConnectionError('Server responded with unknown TDS version.', 'ETDS');
|
|
276
236
|
_this2.loggedIn = false;
|
|
277
237
|
return;
|
|
278
238
|
}
|
|
279
239
|
|
|
280
|
-
if (!token[
|
|
240
|
+
if (!token['interface']) {
|
|
281
241
|
// unsupported interface
|
|
282
|
-
_this2.loginError =
|
|
242
|
+
_this2.loginError = ConnectionError('Server responded with unsupported interface.', 'EINTERFACENOTSUPP');
|
|
283
243
|
_this2.loggedIn = false;
|
|
284
244
|
return;
|
|
285
245
|
}
|
|
@@ -408,11 +368,11 @@ var Connection = (function (_EventEmitter) {
|
|
|
408
368
|
this.tokenStreamParser.on('done', function (token) {
|
|
409
369
|
if (_this2.request) {
|
|
410
370
|
if (token.attention) {
|
|
411
|
-
_this2.dispatchEvent(
|
|
371
|
+
_this2.dispatchEvent('attention');
|
|
412
372
|
}
|
|
413
373
|
if (token.sqlError && !_this2.request.error) {
|
|
414
374
|
// check if the DONE_ERROR flags was set, but an ERROR token was not sent.
|
|
415
|
-
_this2.request.error =
|
|
375
|
+
_this2.request.error = RequestError('An unknown error has occurred.', 'UNKNOWN');
|
|
416
376
|
}
|
|
417
377
|
_this2.request.emit('done', token.rowCount, token.more, _this2.request.rst);
|
|
418
378
|
if (token.rowCount !== void 0) {
|
|
@@ -441,12 +401,12 @@ var Connection = (function (_EventEmitter) {
|
|
|
441
401
|
if (this.config.options.port) {
|
|
442
402
|
return this.connectOnPort(this.config.options.port);
|
|
443
403
|
} else {
|
|
444
|
-
return
|
|
404
|
+
return instanceLookup(this.config.server, this.config.options.instanceName, function (message, port) {
|
|
445
405
|
if (_this3.state === _this3.STATE.FINAL) {
|
|
446
406
|
return;
|
|
447
407
|
}
|
|
448
408
|
if (message) {
|
|
449
|
-
return _this3.emit('connect',
|
|
409
|
+
return _this3.emit('connect', ConnectionError(message, 'EINSTLOOKUP'));
|
|
450
410
|
} else {
|
|
451
411
|
return _this3.connectOnPort(port);
|
|
452
412
|
}
|
|
@@ -458,7 +418,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
458
418
|
value: function connectOnPort(port) {
|
|
459
419
|
var _this4 = this;
|
|
460
420
|
|
|
461
|
-
this.socket = new
|
|
421
|
+
this.socket = new Socket({});
|
|
462
422
|
var connectOpts = {
|
|
463
423
|
host: this.routingData ? this.routingData.server : this.config.server,
|
|
464
424
|
port: this.routingData ? this.routingData.port : port
|
|
@@ -471,7 +431,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
471
431
|
this.socket.on('connect', this.socketConnect);
|
|
472
432
|
this.socket.on('close', this.socketClose);
|
|
473
433
|
this.socket.on('end', this.socketEnd);
|
|
474
|
-
this.messageIo = new
|
|
434
|
+
this.messageIo = new MessageIO(this.socket, this.config.options.packetSize, this.debug);
|
|
475
435
|
this.messageIo.on('data', function (data) {
|
|
476
436
|
_this4.dispatchEvent('data', data);
|
|
477
437
|
});
|
|
@@ -502,9 +462,9 @@ var Connection = (function (_EventEmitter) {
|
|
|
502
462
|
}, {
|
|
503
463
|
key: 'connectTimeout',
|
|
504
464
|
value: function connectTimeout() {
|
|
505
|
-
var message =
|
|
465
|
+
var message = 'Failed to connect to ' + this.config.server + ':' + this.config.options.port + ' in ' + this.config.options.connectTimeout + 'ms';
|
|
506
466
|
this.debug.log(message);
|
|
507
|
-
this.emit('connect',
|
|
467
|
+
this.emit('connect', ConnectionError(message, 'ETIMEOUT'));
|
|
508
468
|
this.connectTimer = void 0;
|
|
509
469
|
return this.dispatchEvent('connectTimeout');
|
|
510
470
|
}
|
|
@@ -512,7 +472,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
512
472
|
key: 'requestTimeout',
|
|
513
473
|
value: function requestTimeout() {
|
|
514
474
|
this.requestTimer = void 0;
|
|
515
|
-
this.messageIo.sendMessage(
|
|
475
|
+
this.messageIo.sendMessage(TYPE.ATTENTION);
|
|
516
476
|
return this.transitionTo(this.STATE.SENT_ATTENTION);
|
|
517
477
|
}
|
|
518
478
|
}, {
|
|
@@ -533,7 +493,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
533
493
|
key: 'transitionTo',
|
|
534
494
|
value: function transitionTo(newState) {
|
|
535
495
|
if (this.state === newState) {
|
|
536
|
-
this.debug.log(
|
|
496
|
+
this.debug.log('State is already ' + newState.name);
|
|
537
497
|
return;
|
|
538
498
|
}
|
|
539
499
|
|
|
@@ -541,7 +501,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
541
501
|
this.state.exit.apply(this);
|
|
542
502
|
}
|
|
543
503
|
|
|
544
|
-
this.debug.log(
|
|
504
|
+
this.debug.log('State change: ' + (this.state ? this.state.name : undefined) + ' -> ' + newState.name);
|
|
545
505
|
this.state = newState;
|
|
546
506
|
|
|
547
507
|
if (this.state.enter) {
|
|
@@ -552,13 +512,13 @@ var Connection = (function (_EventEmitter) {
|
|
|
552
512
|
key: 'dispatchEvent',
|
|
553
513
|
value: function dispatchEvent(eventName) {
|
|
554
514
|
if (this.state.events[eventName]) {
|
|
555
|
-
|
|
556
|
-
|
|
515
|
+
var args = new Array(arguments.length - 1);
|
|
516
|
+
for (var i = 0; i < args.length;) {
|
|
517
|
+
args[i++] = arguments[i];
|
|
557
518
|
}
|
|
558
|
-
|
|
559
519
|
return this.state.events[eventName].apply(this, args);
|
|
560
520
|
} else {
|
|
561
|
-
this.emit('error', new Error(
|
|
521
|
+
this.emit('error', new Error('No event \'' + eventName + '\' in state \'' + this.state.name + '\''));
|
|
562
522
|
return this.close();
|
|
563
523
|
}
|
|
564
524
|
}
|
|
@@ -566,13 +526,13 @@ var Connection = (function (_EventEmitter) {
|
|
|
566
526
|
key: 'socketError',
|
|
567
527
|
value: function socketError(error) {
|
|
568
528
|
if (this.state === this.STATE.CONNECTING) {
|
|
569
|
-
var message =
|
|
529
|
+
var message = 'Failed to connect to ' + this.config.server + ':' + this.config.options.port + ' - ' + error.message;
|
|
570
530
|
this.debug.log(message);
|
|
571
|
-
this.emit('connect',
|
|
531
|
+
this.emit('connect', ConnectionError(message, 'ESOCKET'));
|
|
572
532
|
} else {
|
|
573
|
-
var message =
|
|
533
|
+
var message = 'Connection lost - ' + error.message;
|
|
574
534
|
this.debug.log(message);
|
|
575
|
-
this.emit('error',
|
|
535
|
+
this.emit('error', ConnectionError(message, 'ESOCKET'));
|
|
576
536
|
}
|
|
577
537
|
return this.dispatchEvent('socketError', error);
|
|
578
538
|
}
|
|
@@ -581,21 +541,21 @@ var Connection = (function (_EventEmitter) {
|
|
|
581
541
|
value: function socketConnect() {
|
|
582
542
|
this.socket.setKeepAlive(true, KEEP_ALIVE_INITIAL_DELAY);
|
|
583
543
|
this.closed = false;
|
|
584
|
-
this.debug.log(
|
|
544
|
+
this.debug.log('connected to ' + this.config.server + ':' + this.config.options.port);
|
|
585
545
|
return this.dispatchEvent('socketConnect');
|
|
586
546
|
}
|
|
587
547
|
}, {
|
|
588
548
|
key: 'socketEnd',
|
|
589
549
|
value: function socketEnd() {
|
|
590
|
-
this.debug.log(
|
|
550
|
+
this.debug.log('socket ended');
|
|
591
551
|
return this.transitionTo(this.STATE.FINAL);
|
|
592
552
|
}
|
|
593
553
|
}, {
|
|
594
554
|
key: 'socketClose',
|
|
595
555
|
value: function socketClose() {
|
|
596
|
-
this.debug.log(
|
|
556
|
+
this.debug.log('connection to ' + this.config.server + ':' + this.config.options.port + ' closed');
|
|
597
557
|
if (this.state === this.STATE.REROUTING) {
|
|
598
|
-
this.debug.log(
|
|
558
|
+
this.debug.log('Rerouting to ' + this.routingData.server + ':' + this.routingData.port);
|
|
599
559
|
return this.dispatchEvent('reconnect');
|
|
600
560
|
} else {
|
|
601
561
|
return this.transitionTo(this.STATE.FINAL);
|
|
@@ -604,10 +564,10 @@ var Connection = (function (_EventEmitter) {
|
|
|
604
564
|
}, {
|
|
605
565
|
key: 'sendPreLogin',
|
|
606
566
|
value: function sendPreLogin() {
|
|
607
|
-
var payload = new
|
|
567
|
+
var payload = new PreloginPayload({
|
|
608
568
|
encrypt: this.config.options.encrypt
|
|
609
569
|
});
|
|
610
|
-
this.messageIo.sendMessage(
|
|
570
|
+
this.messageIo.sendMessage(TYPE.PRELOGIN, payload.data);
|
|
611
571
|
return this.debug.payload(function () {
|
|
612
572
|
return payload.toString(' ');
|
|
613
573
|
});
|
|
@@ -625,7 +585,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
625
585
|
}, {
|
|
626
586
|
key: 'processPreLoginResponse',
|
|
627
587
|
value: function processPreLoginResponse() {
|
|
628
|
-
var preloginPayload = new
|
|
588
|
+
var preloginPayload = new PreloginPayload(this.messageBuffer);
|
|
629
589
|
this.debug.payload(function () {
|
|
630
590
|
return preloginPayload.toString(' ');
|
|
631
591
|
});
|
|
@@ -639,7 +599,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
639
599
|
}, {
|
|
640
600
|
key: 'sendLogin7Packet',
|
|
641
601
|
value: function sendLogin7Packet() {
|
|
642
|
-
var payload = new
|
|
602
|
+
var payload = new Login7Payload({
|
|
643
603
|
domain: this.config.domain,
|
|
644
604
|
userName: this.config.userName,
|
|
645
605
|
password: this.config.password,
|
|
@@ -653,7 +613,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
653
613
|
});
|
|
654
614
|
|
|
655
615
|
this.routingData = undefined;
|
|
656
|
-
this.messageIo.sendMessage(
|
|
616
|
+
this.messageIo.sendMessage(TYPE.LOGIN7, payload.data);
|
|
657
617
|
|
|
658
618
|
return this.debug.payload(function () {
|
|
659
619
|
return payload.toString(' ');
|
|
@@ -662,7 +622,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
662
622
|
}, {
|
|
663
623
|
key: 'sendNTLMResponsePacket',
|
|
664
624
|
value: function sendNTLMResponsePacket() {
|
|
665
|
-
var payload = new
|
|
625
|
+
var payload = new NTLMResponsePayload({
|
|
666
626
|
domain: this.config.domain,
|
|
667
627
|
userName: this.config.userName,
|
|
668
628
|
password: this.config.password,
|
|
@@ -673,7 +633,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
673
633
|
ntlmpacket: this.ntlmpacket,
|
|
674
634
|
additional: this.additional
|
|
675
635
|
});
|
|
676
|
-
this.messageIo.sendMessage(
|
|
636
|
+
this.messageIo.sendMessage(TYPE.NTLMAUTH_PKT, payload.data);
|
|
677
637
|
return this.debug.payload(function () {
|
|
678
638
|
return payload.toString(' ');
|
|
679
639
|
});
|
|
@@ -686,15 +646,15 @@ var Connection = (function (_EventEmitter) {
|
|
|
686
646
|
}, {
|
|
687
647
|
key: 'sendInitialSql',
|
|
688
648
|
value: function sendInitialSql() {
|
|
689
|
-
var payload = new
|
|
690
|
-
return this.messageIo.sendMessage(
|
|
649
|
+
var payload = new SqlBatchPayload(this.getInitialSql(), this.currentTransactionDescriptor(), this.config.options);
|
|
650
|
+
return this.messageIo.sendMessage(TYPE.SQL_BATCH, payload.data);
|
|
691
651
|
}
|
|
692
652
|
}, {
|
|
693
653
|
key: 'getInitialSql',
|
|
694
654
|
value: function getInitialSql() {
|
|
695
655
|
var xact_abort = this.config.options.abortTransactionOnError ? 'on' : 'off';
|
|
696
656
|
var enableAnsiNullDefault = this.config.options.enableAnsiNullDefault ? 'on' : 'off';
|
|
697
|
-
return
|
|
657
|
+
return 'set textsize ' + this.config.options.textsize + '\nset quoted_identifier on\nset arithabort off\nset numeric_roundabort off\nset ansi_warnings on\nset ansi_padding on\nset ansi_nulls on\nset ansi_null_dflt_on ' + enableAnsiNullDefault + '\nset concat_null_yields_null on\nset cursor_close_on_commit off\nset implicit_transactions off\nset language us_english\nset dateformat mdy\nset datefirst 7\nset transaction isolation level ' + this.getIsolationLevelText(this.config.options.connectionIsolationLevel) + '\nset xact_abort ' + xact_abort;
|
|
698
658
|
}
|
|
699
659
|
}, {
|
|
700
660
|
key: 'processedInitialSql',
|
|
@@ -711,7 +671,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
711
671
|
if (this.loginError) {
|
|
712
672
|
this.emit('connect', this.loginError);
|
|
713
673
|
} else {
|
|
714
|
-
this.emit('connect',
|
|
674
|
+
this.emit('connect', ConnectionError('Login failed.', 'ELOGIN'));
|
|
715
675
|
}
|
|
716
676
|
return this.dispatchEvent('loginFailed');
|
|
717
677
|
}
|
|
@@ -725,7 +685,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
725
685
|
if (this.loginError) {
|
|
726
686
|
this.emit('connect', this.loginError);
|
|
727
687
|
} else {
|
|
728
|
-
this.emit('connect',
|
|
688
|
+
this.emit('connect', ConnectionError('Login failed.', 'ELOGIN'));
|
|
729
689
|
}
|
|
730
690
|
return this.dispatchEvent('loginFailed');
|
|
731
691
|
}
|
|
@@ -739,7 +699,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
739
699
|
if (this.loginError) {
|
|
740
700
|
this.emit('connect', this.loginError);
|
|
741
701
|
} else {
|
|
742
|
-
this.emit('connect',
|
|
702
|
+
this.emit('connect', ConnectionError('Login failed.', 'ELOGIN'));
|
|
743
703
|
}
|
|
744
704
|
return this.dispatchEvent('loginFailed');
|
|
745
705
|
}
|
|
@@ -747,7 +707,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
747
707
|
}, {
|
|
748
708
|
key: 'execSqlBatch',
|
|
749
709
|
value: function execSqlBatch(request) {
|
|
750
|
-
return this.makeRequest(request,
|
|
710
|
+
return this.makeRequest(request, TYPE.SQL_BATCH, new SqlBatchPayload(request.sqlTextOrProcedure, this.currentTransactionDescriptor(), this.config.options));
|
|
751
711
|
}
|
|
752
712
|
}, {
|
|
753
713
|
key: 'execSql',
|
|
@@ -761,19 +721,19 @@ var Connection = (function (_EventEmitter) {
|
|
|
761
721
|
return request.callback(request.error);
|
|
762
722
|
});
|
|
763
723
|
}
|
|
764
|
-
return this.makeRequest(request,
|
|
724
|
+
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
|
|
765
725
|
}
|
|
766
726
|
}, {
|
|
767
727
|
key: 'newBulkLoad',
|
|
768
728
|
value: function newBulkLoad(table, callback) {
|
|
769
|
-
return new
|
|
729
|
+
return new BulkLoad(table, this.config.options, callback);
|
|
770
730
|
}
|
|
771
731
|
}, {
|
|
772
732
|
key: 'execBulkLoad',
|
|
773
733
|
value: function execBulkLoad(bulkLoad) {
|
|
774
734
|
var _this6 = this;
|
|
775
735
|
|
|
776
|
-
var request = new
|
|
736
|
+
var request = new Request(bulkLoad.getBulkInsertSql(), function (error) {
|
|
777
737
|
if (error) {
|
|
778
738
|
if (error.code === 'UNKNOWN') {
|
|
779
739
|
error.message += ' This is likely because the schema of the BulkLoad does not match the schema of the table you are attempting to insert into.';
|
|
@@ -781,7 +741,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
781
741
|
bulkLoad.error = error;
|
|
782
742
|
return bulkLoad.callback(error);
|
|
783
743
|
} else {
|
|
784
|
-
return _this6.makeRequest(bulkLoad,
|
|
744
|
+
return _this6.makeRequest(bulkLoad, TYPE.BULK_LOAD, bulkLoad.getPayload());
|
|
785
745
|
}
|
|
786
746
|
});
|
|
787
747
|
return this.execSqlBatch(request);
|
|
@@ -790,13 +750,13 @@ var Connection = (function (_EventEmitter) {
|
|
|
790
750
|
key: 'prepare',
|
|
791
751
|
value: function prepare(request) {
|
|
792
752
|
request.transformIntoPrepareRpc();
|
|
793
|
-
return this.makeRequest(request,
|
|
753
|
+
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
|
|
794
754
|
}
|
|
795
755
|
}, {
|
|
796
756
|
key: 'unprepare',
|
|
797
757
|
value: function unprepare(request) {
|
|
798
758
|
request.transformIntoUnprepareRpc();
|
|
799
|
-
return this.makeRequest(request,
|
|
759
|
+
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
|
|
800
760
|
}
|
|
801
761
|
}, {
|
|
802
762
|
key: 'execute',
|
|
@@ -810,7 +770,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
810
770
|
return request.callback(request.error);
|
|
811
771
|
});
|
|
812
772
|
}
|
|
813
|
-
return this.makeRequest(request,
|
|
773
|
+
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
|
|
814
774
|
}
|
|
815
775
|
}, {
|
|
816
776
|
key: 'callProcedure',
|
|
@@ -824,7 +784,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
824
784
|
return request.callback(request.error);
|
|
825
785
|
});
|
|
826
786
|
}
|
|
827
|
-
return this.makeRequest(request,
|
|
787
|
+
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
|
|
828
788
|
}
|
|
829
789
|
}, {
|
|
830
790
|
key: 'beginTransaction',
|
|
@@ -832,44 +792,44 @@ var Connection = (function (_EventEmitter) {
|
|
|
832
792
|
var _this9 = this;
|
|
833
793
|
|
|
834
794
|
isolationLevel || (isolationLevel = this.config.options.isolationLevel);
|
|
835
|
-
var transaction = new
|
|
836
|
-
if (this.config.options.tdsVersion <
|
|
837
|
-
return this.execSqlBatch(new
|
|
795
|
+
var transaction = new Transaction(name || '', isolationLevel);
|
|
796
|
+
if (this.config.options.tdsVersion < '7_2') {
|
|
797
|
+
return this.execSqlBatch(new Request('SET TRANSACTION ISOLATION LEVEL ' + transaction.isolationLevelToTSQL() + ';BEGIN TRAN ' + transaction.name, callback));
|
|
838
798
|
}
|
|
839
|
-
var request = new
|
|
799
|
+
var request = new Request(void 0, function (err) {
|
|
840
800
|
return callback(err, _this9.currentTransactionDescriptor());
|
|
841
801
|
});
|
|
842
|
-
return this.makeRequest(request,
|
|
802
|
+
return this.makeRequest(request, TYPE.TRANSACTION_MANAGER, transaction.beginPayload(this.currentTransactionDescriptor()));
|
|
843
803
|
}
|
|
844
804
|
}, {
|
|
845
805
|
key: 'commitTransaction',
|
|
846
806
|
value: function commitTransaction(callback, name) {
|
|
847
|
-
var transaction = new
|
|
848
|
-
if (this.config.options.tdsVersion <
|
|
849
|
-
return this.execSqlBatch(new
|
|
807
|
+
var transaction = new Transaction(name || '');
|
|
808
|
+
if (this.config.options.tdsVersion < '7_2') {
|
|
809
|
+
return this.execSqlBatch(new Request('COMMIT TRAN ' + transaction.name, callback));
|
|
850
810
|
}
|
|
851
|
-
var request = new
|
|
852
|
-
return this.makeRequest(request,
|
|
811
|
+
var request = new Request(void 0, callback);
|
|
812
|
+
return this.makeRequest(request, TYPE.TRANSACTION_MANAGER, transaction.commitPayload(this.currentTransactionDescriptor()));
|
|
853
813
|
}
|
|
854
814
|
}, {
|
|
855
815
|
key: 'rollbackTransaction',
|
|
856
816
|
value: function rollbackTransaction(callback, name) {
|
|
857
|
-
var transaction = new
|
|
858
|
-
if (this.config.options.tdsVersion <
|
|
859
|
-
return this.execSqlBatch(new
|
|
817
|
+
var transaction = new Transaction(name || '');
|
|
818
|
+
if (this.config.options.tdsVersion < '7_2') {
|
|
819
|
+
return this.execSqlBatch(new Request('ROLLBACK TRAN ' + transaction.name, callback));
|
|
860
820
|
}
|
|
861
|
-
var request = new
|
|
862
|
-
return this.makeRequest(request,
|
|
821
|
+
var request = new Request(void 0, callback);
|
|
822
|
+
return this.makeRequest(request, TYPE.TRANSACTION_MANAGER, transaction.rollbackPayload(this.currentTransactionDescriptor()));
|
|
863
823
|
}
|
|
864
824
|
}, {
|
|
865
825
|
key: 'saveTransaction',
|
|
866
826
|
value: function saveTransaction(callback, name) {
|
|
867
|
-
var transaction = new
|
|
868
|
-
if (this.config.options.tdsVersion <
|
|
869
|
-
return this.execSqlBatch(new
|
|
827
|
+
var transaction = new Transaction(name);
|
|
828
|
+
if (this.config.options.tdsVersion < '7_2') {
|
|
829
|
+
return this.execSqlBatch(new Request('SAVE TRAN ' + transaction.name, callback));
|
|
870
830
|
}
|
|
871
|
-
var request = new
|
|
872
|
-
return this.makeRequest(request,
|
|
831
|
+
var request = new Request(void 0, callback);
|
|
832
|
+
return this.makeRequest(request, TYPE.TRANSACTION_MANAGER, transaction.savePayload(this.currentTransactionDescriptor()));
|
|
873
833
|
}
|
|
874
834
|
}, {
|
|
875
835
|
key: 'transaction',
|
|
@@ -880,15 +840,17 @@ var Connection = (function (_EventEmitter) {
|
|
|
880
840
|
throw new TypeError('`cb` must be a function');
|
|
881
841
|
}
|
|
882
842
|
var useSavepoint = this.inTransaction;
|
|
883
|
-
var name =
|
|
843
|
+
var name = '_tedious_' + crypto.randomBytes(10).toString('hex');
|
|
844
|
+
var self = this;
|
|
884
845
|
var txDone = function txDone(err, done) {
|
|
885
|
-
|
|
886
|
-
|
|
846
|
+
var args = new Array(arguments.length - 2);
|
|
847
|
+
for (var i = 0; i < args.length;) {
|
|
848
|
+
args[i++] = arguments[i + 1];
|
|
887
849
|
}
|
|
888
850
|
|
|
889
851
|
if (err) {
|
|
890
|
-
if (
|
|
891
|
-
return
|
|
852
|
+
if (self.inTransaction && self.state === self.STATE.LOGGED_IN) {
|
|
853
|
+
return self.rollbackTransaction(function (txErr) {
|
|
892
854
|
args.unshift(txErr || err);
|
|
893
855
|
return done.apply(null, args);
|
|
894
856
|
}, name);
|
|
@@ -905,7 +867,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
905
867
|
return done.apply(null, args);
|
|
906
868
|
});
|
|
907
869
|
} else {
|
|
908
|
-
return
|
|
870
|
+
return self.commitTransaction(function (txErr) {
|
|
909
871
|
args.unshift(txErr);
|
|
910
872
|
return done.apply(null, args);
|
|
911
873
|
}, name);
|
|
@@ -918,7 +880,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
918
880
|
return cb(err);
|
|
919
881
|
}
|
|
920
882
|
if (isolationLevel) {
|
|
921
|
-
return _this10.execSqlBatch(new
|
|
883
|
+
return _this10.execSqlBatch(new Request('SET transaction isolation level ' + _this10.getIsolationLevelText(isolationLevel), function (err) {
|
|
922
884
|
return cb(err, txDone);
|
|
923
885
|
}));
|
|
924
886
|
} else {
|
|
@@ -938,9 +900,9 @@ var Connection = (function (_EventEmitter) {
|
|
|
938
900
|
key: 'makeRequest',
|
|
939
901
|
value: function makeRequest(request, packetType, payload) {
|
|
940
902
|
if (this.state !== this.STATE.LOGGED_IN) {
|
|
941
|
-
var message =
|
|
903
|
+
var message = 'Requests can only be made in the ' + this.STATE.LOGGED_IN.name + ' state, not the ' + this.state.name + ' state';
|
|
942
904
|
this.debug.log(message);
|
|
943
|
-
return request.callback(
|
|
905
|
+
return request.callback(RequestError(message, 'EINVALIDSTATE'));
|
|
944
906
|
} else {
|
|
945
907
|
this.request = request;
|
|
946
908
|
this.request.rowCount = 0;
|
|
@@ -959,12 +921,12 @@ var Connection = (function (_EventEmitter) {
|
|
|
959
921
|
key: 'cancel',
|
|
960
922
|
value: function cancel() {
|
|
961
923
|
if (this.state !== this.STATE.SENT_CLIENT_REQUEST) {
|
|
962
|
-
var message =
|
|
924
|
+
var message = 'Requests can only be canceled in the ' + this.STATE.SENT_CLIENT_REQUEST.name + ' state, not the ' + this.state.name + ' state';
|
|
963
925
|
this.debug.log(message);
|
|
964
926
|
return false;
|
|
965
927
|
} else {
|
|
966
928
|
this.request.canceled = true;
|
|
967
|
-
this.messageIo.sendMessage(
|
|
929
|
+
this.messageIo.sendMessage(TYPE.ATTENTION);
|
|
968
930
|
this.transitionTo(this.STATE.SENT_ATTENTION);
|
|
969
931
|
return true;
|
|
970
932
|
}
|
|
@@ -972,7 +934,7 @@ var Connection = (function (_EventEmitter) {
|
|
|
972
934
|
}, {
|
|
973
935
|
key: 'reset',
|
|
974
936
|
value: function reset(callback) {
|
|
975
|
-
var request = new
|
|
937
|
+
var request = new Request(this.getInitialSql(), function (err) {
|
|
976
938
|
return callback(err);
|
|
977
939
|
});
|
|
978
940
|
this.resetConnectionOnNextRequest = true;
|
|
@@ -987,13 +949,13 @@ var Connection = (function (_EventEmitter) {
|
|
|
987
949
|
key: 'getIsolationLevelText',
|
|
988
950
|
value: function getIsolationLevelText(isolationLevel) {
|
|
989
951
|
switch (isolationLevel) {
|
|
990
|
-
case
|
|
952
|
+
case ISOLATION_LEVEL.READ_UNCOMMITTED:
|
|
991
953
|
return 'read uncommitted';
|
|
992
|
-
case
|
|
954
|
+
case ISOLATION_LEVEL.REPEATABLE_READ:
|
|
993
955
|
return 'repeatable read';
|
|
994
|
-
case
|
|
956
|
+
case ISOLATION_LEVEL.SERIALIZABLE:
|
|
995
957
|
return 'serializable';
|
|
996
|
-
case
|
|
958
|
+
case ISOLATION_LEVEL.SNAPSHOT:
|
|
997
959
|
return 'snapshot';
|
|
998
960
|
default:
|
|
999
961
|
return 'read committed';
|
|
@@ -1002,9 +964,9 @@ var Connection = (function (_EventEmitter) {
|
|
|
1002
964
|
}]);
|
|
1003
965
|
|
|
1004
966
|
return Connection;
|
|
1005
|
-
})(
|
|
967
|
+
})(EventEmitter);
|
|
1006
968
|
|
|
1007
|
-
exports
|
|
969
|
+
module.exports = Connection;
|
|
1008
970
|
|
|
1009
971
|
Connection.prototype.STATE = {
|
|
1010
972
|
CONNECTING: {
|
|
@@ -1241,10 +1203,10 @@ Connection.prototype.STATE = {
|
|
|
1241
1203
|
this.request = void 0;
|
|
1242
1204
|
this.transitionTo(this.STATE.LOGGED_IN);
|
|
1243
1205
|
if (sqlRequest.canceled) {
|
|
1244
|
-
return sqlRequest.callback(
|
|
1206
|
+
return sqlRequest.callback(RequestError('Canceled.', 'ECANCEL'));
|
|
1245
1207
|
} else {
|
|
1246
|
-
var message =
|
|
1247
|
-
return sqlRequest.callback(
|
|
1208
|
+
var message = 'Timeout: Request failed to complete in ' + this.config.options.requestTimeout + 'ms';
|
|
1209
|
+
return sqlRequest.callback(RequestError(message, 'ETIMEOUT'));
|
|
1248
1210
|
}
|
|
1249
1211
|
}
|
|
1250
1212
|
}
|
|
@@ -1270,5 +1232,4 @@ Connection.prototype.STATE = {
|
|
|
1270
1232
|
}
|
|
1271
1233
|
}
|
|
1272
1234
|
}
|
|
1273
|
-
};
|
|
1274
|
-
module.exports = exports['default'];
|
|
1235
|
+
};
|