tedious 1.12.3 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +1 -1
  2. package/appveyor.yml +9 -5
  3. package/benchmarks/README.md +33 -0
  4. package/benchmarks/common.js +82 -0
  5. package/benchmarks/index.js +34 -0
  6. package/benchmarks/query/many-result-rows.js +49 -0
  7. package/benchmarks/query/nvarchar-large.js +44 -0
  8. package/benchmarks/query/nvarchar-small.js +44 -0
  9. package/benchmarks/query/varbinary-4.js +42 -0
  10. package/benchmarks/query/varbinary-huge.js +46 -0
  11. package/benchmarks/query/varbinary-large.js +46 -0
  12. package/benchmarks/query/varbinary-small.js +42 -0
  13. package/benchmarks/token-parser/colmetadata-token.js +42 -0
  14. package/benchmarks/token-parser/done-token.js +42 -0
  15. package/benchmarks/token-parser/simple-tokens.js +366 -0
  16. package/lib/all-headers.js +9 -11
  17. package/lib/buffertools.js +17 -13
  18. package/lib/bulk-load.js +196 -169
  19. package/lib/collation.js +80 -2
  20. package/lib/connection.js +1086 -1060
  21. package/lib/data-type.js +450 -253
  22. package/lib/debug.js +57 -51
  23. package/lib/errors.js +40 -55
  24. package/lib/guid-parser.js +12 -36
  25. package/lib/instance-lookup.js +57 -54
  26. package/lib/library.js +3 -2
  27. package/lib/login7-payload.js +187 -180
  28. package/lib/message-io.js +169 -199
  29. package/lib/metadata-parser.js +169 -255
  30. package/lib/ntlm-payload.js +173 -160
  31. package/lib/packet.js +166 -152
  32. package/lib/prelogin-payload.js +170 -160
  33. package/lib/request.js +122 -122
  34. package/lib/rpcrequest-payload.js +64 -38
  35. package/lib/special-stored-procedure.js +3 -2
  36. package/lib/sqlbatch-payload.js +20 -16
  37. package/lib/stream-parser.js +116 -104
  38. package/lib/tds-versions.js +5 -8
  39. package/lib/tedious.js +8 -14
  40. package/lib/token/colmetadata-token-parser.js +79 -125
  41. package/lib/token/done-token-parser.js +47 -129
  42. package/lib/token/env-change-token-parser.js +90 -126
  43. package/lib/token/infoerror-token-parser.js +47 -125
  44. package/lib/token/loginack-token-parser.js +36 -74
  45. package/lib/token/nbcrow-token-parser.js +40 -64
  46. package/lib/token/order-token-parser.js +26 -43
  47. package/lib/token/returnstatus-token-parser.js +11 -23
  48. package/lib/token/returnvalue-token-parser.js +31 -54
  49. package/lib/token/row-token-parser.js +39 -52
  50. package/lib/token/sspi-token-parser.js +14 -32
  51. package/lib/token/stream-parser.js +424 -304
  52. package/lib/token/token-stream-parser.js +39 -34
  53. package/lib/token/token.js +3 -6
  54. package/lib/tracking-buffer/bigint.js +45 -48
  55. package/lib/tracking-buffer/readable-tracking-buffer.js +238 -223
  56. package/lib/tracking-buffer/tracking-buffer.js +3 -9
  57. package/lib/tracking-buffer/writable-tracking-buffer.js +272 -244
  58. package/lib/transaction.js +112 -102
  59. package/lib/value-parser.js +559 -1154
  60. package/package.json +10 -9
  61. package/benchmarks/benchmarks.coffee +0 -122
  62. package/benchmarks/query.coffee +0 -57
@@ -1,126 +1,48 @@
1
- var _regeneratorRuntime = require('babel-runtime/regenerator').default;
2
-
3
- // Generated by CoffeeScript 1.10.0
4
- var errorParser, infoParser, parseToken;
5
-
6
- parseToken = _regeneratorRuntime.mark(function callee$0$0(parser, options) {
7
- var clazz, length, lineNumber, message, number, procName, serverName, state, token;
8
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
9
- while (1) switch (context$1$0.prev = context$1$0.next) {
10
- case 0:
11
- context$1$0.next = 2;
12
- return parser.readUInt16LE();
13
-
14
- case 2:
15
- length = context$1$0.sent;
16
- context$1$0.next = 5;
17
- return parser.readUInt32LE();
18
-
19
- case 5:
20
- number = context$1$0.sent;
21
- context$1$0.next = 8;
22
- return parser.readUInt8();
23
-
24
- case 8:
25
- state = context$1$0.sent;
26
- context$1$0.next = 11;
27
- return parser.readUInt8();
28
-
29
- case 11:
30
- clazz = context$1$0.sent;
31
- return context$1$0.delegateYield(parser.readUsVarChar(), 't0', 13);
32
-
33
- case 13:
34
- message = context$1$0.t0;
35
- return context$1$0.delegateYield(parser.readBVarChar(), 't1', 15);
36
-
37
- case 15:
38
- serverName = context$1$0.t1;
39
- return context$1$0.delegateYield(parser.readBVarChar(), 't2', 17);
40
-
41
- case 17:
42
- procName = context$1$0.t2;
43
-
44
- if (!(options.tdsVersion < '7_2')) {
45
- context$1$0.next = 24;
46
- break;
47
- }
48
-
49
- context$1$0.next = 21;
50
- return parser.readUInt16LE();
51
-
52
- case 21:
53
- lineNumber = context$1$0.sent;
54
- context$1$0.next = 27;
55
- break;
56
-
57
- case 24:
58
- context$1$0.next = 26;
59
- return parser.readUInt32LE();
60
-
61
- case 26:
62
- lineNumber = context$1$0.sent;
63
-
64
- case 27:
65
- return context$1$0.abrupt('return', token = {
66
- number: number,
67
- state: state,
68
- "class": clazz,
69
- message: message,
70
- serverName: serverName,
71
- procName: procName,
72
- lineNumber: lineNumber
1
+ 'use strict';
2
+
3
+ function parseToken(parser, options, callback) {
4
+ // length
5
+ parser.readUInt16LE(function () {
6
+ parser.readUInt32LE(function (number) {
7
+ parser.readUInt8(function (state) {
8
+ parser.readUInt8(function (clazz) {
9
+ parser.readUsVarChar(function (message) {
10
+ parser.readBVarChar(function (serverName) {
11
+ parser.readBVarChar(function (procName) {
12
+ (options.tdsVersion < '7_2' ? parser.readUInt16LE : parser.readUInt32LE).call(parser, function (lineNumber) {
13
+ callback({
14
+ 'number': number,
15
+ 'state': state,
16
+ 'class': clazz,
17
+ 'message': message,
18
+ 'serverName': serverName,
19
+ 'procName': procName,
20
+ 'lineNumber': lineNumber
21
+ });
22
+ });
23
+ });
24
+ });
25
+ });
73
26
  });
74
-
75
- case 28:
76
- case 'end':
77
- return context$1$0.stop();
78
- }
79
- }, callee$0$0, this);
80
- });
81
-
82
- infoParser = _regeneratorRuntime.mark(function callee$0$0(parser, colMetadata, options) {
83
- var token;
84
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
85
- while (1) switch (context$1$0.prev = context$1$0.next) {
86
- case 0:
87
- return context$1$0.delegateYield(parseToken(parser, options), 't0', 1);
88
-
89
- case 1:
90
- token = context$1$0.t0;
91
-
92
- token.name = 'INFO';
93
- token.event = 'infoMessage';
94
- return context$1$0.abrupt('return', token);
95
-
96
- case 5:
97
- case 'end':
98
- return context$1$0.stop();
99
- }
100
- }, callee$0$0, this);
101
- });
102
-
103
- errorParser = _regeneratorRuntime.mark(function callee$0$0(parser, colMetadata, options) {
104
- var token;
105
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
106
- while (1) switch (context$1$0.prev = context$1$0.next) {
107
- case 0:
108
- return context$1$0.delegateYield(parseToken(parser, options), 't0', 1);
109
-
110
- case 1:
111
- token = context$1$0.t0;
112
-
113
- token.name = 'ERROR';
114
- token.event = 'errorMessage';
115
- return context$1$0.abrupt('return', token);
116
-
117
- case 5:
118
- case 'end':
119
- return context$1$0.stop();
120
- }
121
- }, callee$0$0, this);
122
- });
123
-
124
- exports.infoParser = infoParser;
125
-
126
- exports.errorParser = errorParser;
27
+ });
28
+ });
29
+ });
30
+ }
31
+
32
+ module.exports.infoParser = infoParser;
33
+ function infoParser(parser, colMetadata, options, callback) {
34
+ parseToken(parser, options, function (token) {
35
+ token.name = 'INFO';
36
+ token.event = 'infoMessage';
37
+ callback(token);
38
+ });
39
+ }
40
+
41
+ module.exports.errorParser = errorParser;
42
+ function errorParser(parser, colMetadata, options, callback) {
43
+ parseToken(parser, options, function (token) {
44
+ token.name = 'ERROR';
45
+ token.event = 'errorMessage';
46
+ callback(token);
47
+ });
48
+ }
@@ -1,81 +1,43 @@
1
- var _regeneratorRuntime = require('babel-runtime/regenerator').default;
1
+ 'use strict';
2
2
 
3
- // Generated by CoffeeScript 1.10.0
4
- var interfaceTypes, versions;
3
+ var versions = require('../tds-versions').versionsByValue;
5
4
 
6
- versions = require('../tds-versions').versionsByValue;
7
-
8
- interfaceTypes = {
5
+ var interfaceTypes = {
9
6
  0: 'SQL_DFLT',
10
7
  1: 'SQL_TSQL'
11
8
  };
12
9
 
13
- module.exports = _regeneratorRuntime.mark(function callee$0$0(parser) {
14
- var interfaceNumber, interfaceType, length, progName, progVersion, tdsVersion, tdsVersionNumber;
15
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
16
- while (1) switch (context$1$0.prev = context$1$0.next) {
17
- case 0:
18
- context$1$0.next = 2;
19
- return parser.readUInt16LE();
20
-
21
- case 2:
22
- length = context$1$0.sent;
23
- context$1$0.next = 5;
24
- return parser.readUInt8();
25
-
26
- case 5:
27
- interfaceNumber = context$1$0.sent;
28
-
29
- interfaceType = interfaceTypes[interfaceNumber];
30
- context$1$0.next = 9;
31
- return parser.readUInt32BE();
32
-
33
- case 9:
34
- tdsVersionNumber = context$1$0.sent;
35
-
36
- tdsVersion = versions[tdsVersionNumber];
37
- return context$1$0.delegateYield(parser.readBVarChar(), 't0', 12);
38
-
39
- case 12:
40
- progName = context$1$0.t0;
41
- context$1$0.next = 15;
42
- return parser.readUInt8();
43
-
44
- case 15:
45
- context$1$0.t1 = context$1$0.sent;
46
- context$1$0.next = 18;
47
- return parser.readUInt8();
48
-
49
- case 18:
50
- context$1$0.t2 = context$1$0.sent;
51
- context$1$0.next = 21;
52
- return parser.readUInt8();
53
-
54
- case 21:
55
- context$1$0.t3 = context$1$0.sent;
56
- context$1$0.next = 24;
57
- return parser.readUInt8();
58
-
59
- case 24:
60
- context$1$0.t4 = context$1$0.sent;
61
- progVersion = {
62
- major: context$1$0.t1,
63
- minor: context$1$0.t2,
64
- buildNumHi: context$1$0.t3,
65
- buildNumLow: context$1$0.t4
66
- };
67
- return context$1$0.abrupt('return', {
68
- name: 'LOGINACK',
69
- event: 'loginack',
70
- "interface": interfaceType,
71
- tdsVersion: tdsVersion,
72
- progName: progName,
73
- progVersion: progVersion
10
+ module.exports = function (parser, colMetadata, options, callback) {
11
+ // length
12
+ parser.readUInt16LE(function () {
13
+ parser.readUInt8(function (interfaceNumber) {
14
+ var interfaceType = interfaceTypes[interfaceNumber];
15
+ parser.readUInt32BE(function (tdsVersionNumber) {
16
+ var tdsVersion = versions[tdsVersionNumber];
17
+ parser.readBVarChar(function (progName) {
18
+ parser.readUInt8(function (major) {
19
+ parser.readUInt8(function (minor) {
20
+ parser.readUInt8(function (buildNumHi) {
21
+ parser.readUInt8(function (buildNumLow) {
22
+ callback({
23
+ 'name': 'LOGINACK',
24
+ 'event': 'loginack',
25
+ 'interface': interfaceType,
26
+ 'tdsVersion': tdsVersion,
27
+ 'progName': progName,
28
+ 'progVersion': {
29
+ major: major,
30
+ minor: minor,
31
+ buildNumHi: buildNumHi,
32
+ buildNumLow: buildNumLow
33
+ }
34
+ });
35
+ });
36
+ });
37
+ });
38
+ });
74
39
  });
75
-
76
- case 27:
77
- case 'end':
78
- return context$1$0.stop();
79
- }
80
- }, callee$0$0, this);
81
- });
40
+ });
41
+ });
42
+ });
43
+ };
@@ -1,62 +1,42 @@
1
- var _regeneratorRuntime = require('babel-runtime/regenerator').default;
1
+ 'use strict';
2
2
 
3
- // Generated by CoffeeScript 1.10.0
4
- var sprintf, valueParse;
3
+ // s2.2.7.13 (introduced in TDS 7.3.B)
5
4
 
6
- valueParse = require('../value-parser');
5
+ var valueParse = require('../value-parser');
7
6
 
8
- sprintf = require('sprintf').sprintf;
7
+ function nullHandler(parser, columnMetaData, options, callback) {
8
+ callback(null);
9
+ }
9
10
 
10
- module.exports = _regeneratorRuntime.mark(function callee$0$0(parser, columnsMetaData, options) {
11
- var bitmap, byte, bytes, column, columnMetaData, columns, i, index, j, k, l, len, len1, length, value;
12
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
13
- while (1) switch (context$1$0.prev = context$1$0.next) {
14
- case 0:
15
- length = Math.ceil(columnsMetaData.length / 8);
16
- context$1$0.next = 3;
17
- return parser.readBuffer(length);
11
+ module.exports = function (parser, columnsMetaData, options, callback) {
12
+ var length = Math.ceil(columnsMetaData.length / 8);
13
+ parser.readBuffer(length, function (bytes) {
14
+ var bitmap = [];
18
15
 
19
- case 3:
20
- bytes = context$1$0.sent;
21
-
22
- bitmap = [];
23
- for (j = 0, len = bytes.length; j < len; j++) {
24
- byte = bytes[j];
25
- for (i = k = 0; k <= 7; i = ++k) {
26
- bitmap.push(byte & 1 << i ? true : false);
27
- }
28
- }
29
- columns = options.useColumnNames ? {} : [];
30
- index = l = 0, len1 = columnsMetaData.length;
31
-
32
- case 8:
33
- if (!(l < len1)) {
34
- context$1$0.next = 21;
35
- break;
36
- }
37
-
38
- columnMetaData = columnsMetaData[index];
39
-
40
- if (!bitmap[index]) {
41
- context$1$0.next = 14;
42
- break;
43
- }
16
+ for (var _i = 0, _len = bytes.length; _i < _len; _i++) {
17
+ var byte = bytes[_i];
18
+ for (var j = 0; j <= 7; j++) {
19
+ bitmap.push(byte & 1 << j ? true : false);
20
+ }
21
+ }
44
22
 
45
- value = null;
46
- context$1$0.next = 16;
47
- break;
23
+ var columns = options.useColumnNames ? {} : [];
48
24
 
49
- case 14:
50
- return context$1$0.delegateYield(valueParse(parser, columnMetaData, options), 't0', 15);
25
+ var len = columnsMetaData.length;
26
+ var i = 0;
27
+ function next(done) {
28
+ if (i === len) {
29
+ return done();
30
+ }
51
31
 
52
- case 15:
53
- value = context$1$0.t0;
32
+ var columnMetaData = columnsMetaData[i];
54
33
 
55
- case 16:
56
- column = {
34
+ (bitmap[i] ? nullHandler : valueParse)(parser, columnMetaData, options, function (value) {
35
+ var column = {
57
36
  value: value,
58
37
  metadata: columnMetaData
59
38
  };
39
+
60
40
  if (options.useColumnNames) {
61
41
  if (columns[columnMetaData.colName] == null) {
62
42
  columns[columnMetaData.colName] = column;
@@ -65,21 +45,17 @@ module.exports = _regeneratorRuntime.mark(function callee$0$0(parser, columnsMet
65
45
  columns.push(column);
66
46
  }
67
47
 
68
- case 18:
69
- index = ++l;
70
- context$1$0.next = 8;
71
- break;
72
-
73
- case 21:
74
- return context$1$0.abrupt('return', {
75
- name: 'NBCROW',
76
- event: 'row',
77
- columns: columns
78
- });
79
-
80
- case 22:
81
- case 'end':
82
- return context$1$0.stop();
48
+ i++;
49
+ next(done);
50
+ });
83
51
  }
84
- }, callee$0$0, this);
85
- });
52
+
53
+ next(function () {
54
+ callback({
55
+ name: 'NBCROW',
56
+ event: 'row',
57
+ columns: columns
58
+ });
59
+ });
60
+ });
61
+ };
@@ -1,50 +1,33 @@
1
- var _regeneratorRuntime = require('babel-runtime/regenerator').default;
1
+ 'use strict';
2
2
 
3
- // Generated by CoffeeScript 1.10.0
4
- module.exports = _regeneratorRuntime.mark(function callee$0$0(parser) {
5
- var c, columnCount, i, orderColumns, ref;
6
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
7
- while (1) switch (context$1$0.prev = context$1$0.next) {
8
- case 0:
9
- context$1$0.next = 2;
10
- return parser.readUInt16LE("length");
3
+ // s2.2.7.14
11
4
 
12
- case 2:
13
- context$1$0.t0 = context$1$0.sent;
14
- columnCount = context$1$0.t0 / 2;
5
+ module.exports = function (parser, colMetadata, options, callback) {
6
+ parser.readUInt16LE(function (length) {
7
+ var columnCount = length / 2;
8
+ var orderColumns = [];
15
9
 
16
- orderColumns = [];
17
- c = i = 1, ref = columnCount;
10
+ var i = 0;
11
+ function next(done) {
12
+ if (i === columnCount) {
13
+ return done();
14
+ }
18
15
 
19
- case 6:
20
- if (!(1 <= ref ? i <= ref : i >= ref)) {
21
- context$1$0.next = 15;
22
- break;
23
- }
16
+ parser.readUInt16LE(function (column) {
17
+ orderColumns.push(column);
24
18
 
25
- context$1$0.t1 = orderColumns;
26
- context$1$0.next = 10;
27
- return parser.readUInt16LE();
19
+ i++;
28
20
 
29
- case 10:
30
- context$1$0.t2 = context$1$0.sent;
31
- context$1$0.t1.push.call(context$1$0.t1, context$1$0.t2);
32
-
33
- case 12:
34
- c = 1 <= ref ? ++i : --i;
35
- context$1$0.next = 6;
36
- break;
37
-
38
- case 15:
39
- return context$1$0.abrupt('return', {
40
- name: 'ORDER',
41
- event: 'order',
42
- orderColumns: orderColumns
43
- });
44
-
45
- case 16:
46
- case 'end':
47
- return context$1$0.stop();
21
+ next(done);
22
+ });
48
23
  }
49
- }, callee$0$0, this);
50
- });
24
+
25
+ next(function () {
26
+ callback({
27
+ name: 'ORDER',
28
+ event: 'order',
29
+ orderColumns: orderColumns
30
+ });
31
+ });
32
+ });
33
+ };
@@ -1,25 +1,13 @@
1
- var _regeneratorRuntime = require('babel-runtime/regenerator').default;
1
+ 'use strict';
2
2
 
3
- // Generated by CoffeeScript 1.10.0
4
- module.exports = _regeneratorRuntime.mark(function callee$0$0(parser) {
5
- var token, value;
6
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
7
- while (1) switch (context$1$0.prev = context$1$0.next) {
8
- case 0:
9
- context$1$0.next = 2;
10
- return parser.readInt32LE();
3
+ // s2.2.7.16
11
4
 
12
- case 2:
13
- value = context$1$0.sent;
14
- return context$1$0.abrupt('return', token = {
15
- name: 'RETURNSTATUS',
16
- event: 'returnStatus',
17
- value: value
18
- });
19
-
20
- case 4:
21
- case 'end':
22
- return context$1$0.stop();
23
- }
24
- }, callee$0$0, this);
25
- });
5
+ module.exports = function (parser, colMetadata, options, callback) {
6
+ parser.readInt32LE(function (value) {
7
+ callback({
8
+ name: 'RETURNSTATUS',
9
+ event: 'returnStatus',
10
+ value: value
11
+ });
12
+ });
13
+ };
@@ -1,55 +1,32 @@
1
- var _regeneratorRuntime = require('babel-runtime/regenerator').default;
2
-
3
- // Generated by CoffeeScript 1.10.0
4
- var metadataParse, valueParse;
5
-
6
- metadataParse = require('../metadata-parser');
7
-
8
- valueParse = require('../value-parser');
9
-
10
- module.exports = _regeneratorRuntime.mark(function callee$0$0(parser, colMetadata, options) {
11
- var metadata, paramName, paramOrdinal, status, token, value;
12
- return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
13
- while (1) switch (context$1$0.prev = context$1$0.next) {
14
- case 0:
15
- context$1$0.next = 2;
16
- return parser.readUInt16LE();
17
-
18
- case 2:
19
- paramOrdinal = context$1$0.sent;
20
- return context$1$0.delegateYield(parser.readBVarChar(), 't0', 4);
21
-
22
- case 4:
23
- paramName = context$1$0.t0;
24
- context$1$0.next = 7;
25
- return parser.readUInt8();
26
-
27
- case 7:
28
- status = context$1$0.sent;
29
- return context$1$0.delegateYield(metadataParse(parser, options), 't1', 9);
30
-
31
- case 9:
32
- metadata = context$1$0.t1;
33
- return context$1$0.delegateYield(valueParse(parser, metadata, options), 't2', 11);
34
-
35
- case 11:
36
- value = context$1$0.t2;
37
-
38
- if (paramName.charAt(0) === '@') {
39
- paramName = paramName.slice(1);
40
- }
41
- return context$1$0.abrupt('return', token = {
42
- name: 'RETURNVALUE',
43
- event: 'returnValue',
44
- paramOrdinal: paramOrdinal,
45
- paramName: paramName,
46
- metadata: metadata,
47
- value: value
1
+ 'use strict';
2
+
3
+ // s2.2.7.16
4
+
5
+ var metadataParse = require('../metadata-parser');
6
+ var valueParse = require('../value-parser');
7
+
8
+ module.exports = function (parser, colMetadata, options, callback) {
9
+ parser.readUInt16LE(function (paramOrdinal) {
10
+ parser.readBVarChar(function (paramName) {
11
+ if (paramName.charAt(0) === '@') {
12
+ paramName = paramName.slice(1);
13
+ }
14
+
15
+ // status
16
+ parser.readUInt8(function () {
17
+ metadataParse(parser, options, function (metadata) {
18
+ valueParse(parser, metadata, options, function (value) {
19
+ callback({
20
+ name: 'RETURNVALUE',
21
+ event: 'returnValue',
22
+ paramOrdinal: paramOrdinal,
23
+ paramName: paramName,
24
+ metadata: metadata,
25
+ value: value
26
+ });
27
+ });
48
28
  });
49
-
50
- case 14:
51
- case 'end':
52
- return context$1$0.stop();
53
- }
54
- }, callee$0$0, this);
55
- });
29
+ });
30
+ });
31
+ });
32
+ };