tedious 20.3.2 → 20.3.3

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.
@@ -3,74 +3,76 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.RowTokenReader = exports.ColumnValuesReader = void 0;
7
+ exports.toColumnsMap = toColumnsMap;
7
8
  var _token = require("./token");
8
- var iconv = _interopRequireWildcard(require("iconv-lite"));
9
9
  var _valueParser = require("../value-parser");
10
- var _helpers = require("./helpers");
11
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
10
  // s2.2.7.17
13
11
 
14
- async function rowParser(parser) {
15
- const columns = [];
16
- for (const metadata of parser.colMetadata) {
17
- while (true) {
18
- if ((0, _valueParser.isPLPStream)(metadata)) {
19
- const chunks = await (0, _valueParser.readPLPStream)(parser);
20
- if (chunks === null) {
21
- columns.push({
22
- value: chunks,
23
- metadata
24
- });
25
- } else if (metadata.type.name === 'NVarChar' || metadata.type.name === 'Xml') {
26
- columns.push({
27
- value: Buffer.concat(chunks).toString('ucs2'),
28
- metadata
29
- });
30
- } else if (metadata.type.name === 'VarChar') {
31
- columns.push({
32
- value: iconv.decode(Buffer.concat(chunks), metadata.collation?.codepage ?? 'utf8'),
33
- metadata
34
- });
35
- } else if (metadata.type.name === 'VarBinary' || metadata.type.name === 'UDT') {
36
- columns.push({
37
- value: Buffer.concat(chunks),
38
- metadata
39
- });
40
- }
12
+ /**
13
+ * Reads the column values of a row one by one. Column values - especially PLP
14
+ * values - can be arbitrarily large, so the progress is kept across chunks.
15
+ */
16
+ class ColumnValuesReader {
17
+ // The reader of a PLP column value that is not complete yet.
18
+
19
+ constructor() {
20
+ this.columns = [];
21
+ this.plpReader = undefined;
22
+ }
23
+
24
+ /**
25
+ * Read the remaining column values. Columns flagged in the `nullBitmap`
26
+ * have no data and are `null`.
27
+ */
28
+ readColumns(parser, nullBitmap) {
29
+ const colMetadata = parser.colMetadata;
30
+ while (this.columns.length < colMetadata.length) {
31
+ const index = this.columns.length;
32
+ const metadata = colMetadata[index];
33
+ let value;
34
+ if (nullBitmap !== undefined && nullBitmap[index >> 3] & 1 << (index & 7)) {
35
+ value = null;
36
+ } else if ((0, _valueParser.isPLPStream)(metadata)) {
37
+ this.plpReader ??= new _valueParser.PLPReader(metadata);
38
+ value = this.plpReader.read(parser);
39
+ this.plpReader = undefined;
41
40
  } else {
42
- let result;
43
- try {
44
- result = (0, _valueParser.readValue)(parser.buffer, parser.position, metadata, parser.options);
45
- } catch (err) {
46
- if (err instanceof _helpers.NotEnoughDataError) {
47
- await parser.waitForChunk();
48
- continue;
49
- }
50
- throw err;
51
- }
41
+ const result = (0, _valueParser.readValue)(parser.buffer, parser.position, metadata, parser.options);
52
42
  parser.position = result.offset;
53
- columns.push({
54
- value: result.value,
55
- metadata
56
- });
43
+ value = result.value;
57
44
  }
58
- break;
45
+ this.columns.push({
46
+ value,
47
+ metadata
48
+ });
59
49
  }
60
50
  }
61
- if (parser.options.useColumnNames) {
62
- const columnsMap = Object.create(null);
63
- columns.forEach(column => {
64
- const colName = column.metadata.colName;
65
- if (columnsMap[colName] == null) {
66
- columnsMap[colName] = column;
67
- }
68
- });
69
- return new _token.RowToken(columnsMap);
70
- } else {
71
- return new _token.RowToken(columns);
51
+ }
52
+
53
+ /**
54
+ * Reads a `ROW` token.
55
+ */
56
+ exports.ColumnValuesReader = ColumnValuesReader;
57
+ class RowTokenReader extends ColumnValuesReader {
58
+ read(parser) {
59
+ this.readColumns(parser, undefined);
60
+ return new _token.RowToken(parser.options.useColumnNames ? toColumnsMap(this.columns) : this.columns);
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Map columns by name. If multiple columns share a name, the first one wins.
66
+ */
67
+ exports.RowTokenReader = RowTokenReader;
68
+ function toColumnsMap(columns) {
69
+ const columnsMap = Object.create(null);
70
+ for (const column of columns) {
71
+ const colName = column.metadata.colName;
72
+ if (columnsMap[colName] == null) {
73
+ columnsMap[colName] = column;
74
+ }
72
75
  }
76
+ return columnsMap;
73
77
  }
74
- var _default = exports.default = rowParser;
75
- module.exports = rowParser;
76
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiaWNvbnYiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl92YWx1ZVBhcnNlciIsIl9oZWxwZXJzIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicm93UGFyc2VyIiwicGFyc2VyIiwiY29sdW1ucyIsIm1ldGFkYXRhIiwiY29sTWV0YWRhdGEiLCJpc1BMUFN0cmVhbSIsImNodW5rcyIsInJlYWRQTFBTdHJlYW0iLCJwdXNoIiwidmFsdWUiLCJ0eXBlIiwibmFtZSIsIkJ1ZmZlciIsImNvbmNhdCIsInRvU3RyaW5nIiwiZGVjb2RlIiwiY29sbGF0aW9uIiwiY29kZXBhZ2UiLCJyZXN1bHQiLCJyZWFkVmFsdWUiLCJidWZmZXIiLCJwb3NpdGlvbiIsIm9wdGlvbnMiLCJlcnIiLCJOb3RFbm91Z2hEYXRhRXJyb3IiLCJ3YWl0Rm9yQ2h1bmsiLCJvZmZzZXQiLCJ1c2VDb2x1bW5OYW1lcyIsImNvbHVtbnNNYXAiLCJjcmVhdGUiLCJmb3JFYWNoIiwiY29sdW1uIiwiY29sTmFtZSIsIlJvd1Rva2VuIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL3Jvdy10b2tlbi1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gczIuMi43LjE3XG5cbmltcG9ydCBQYXJzZXIgZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IHR5cGUgQ29sdW1uTWV0YWRhdGEgfSBmcm9tICcuL2NvbG1ldGFkYXRhLXRva2VuLXBhcnNlcic7XG5cbmltcG9ydCB7IFJvd1Rva2VuIH0gZnJvbSAnLi90b2tlbic7XG5pbXBvcnQgKiBhcyBpY29udiBmcm9tICdpY29udi1saXRlJztcblxuaW1wb3J0IHsgaXNQTFBTdHJlYW0sIHJlYWRQTFBTdHJlYW0sIHJlYWRWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXBhcnNlcic7XG5pbXBvcnQgeyBOb3RFbm91Z2hEYXRhRXJyb3IgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgdmFsdWU6IHVua25vd247XG4gIG1ldGFkYXRhOiBDb2x1bW5NZXRhZGF0YTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcm93UGFyc2VyKHBhcnNlcjogUGFyc2VyKTogUHJvbWlzZTxSb3dUb2tlbj4ge1xuICBjb25zdCBjb2x1bW5zOiBDb2x1bW5bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgcGFyc2VyLmNvbE1ldGFkYXRhKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChpc1BMUFN0cmVhbShtZXRhZGF0YSkpIHtcbiAgICAgICAgY29uc3QgY2h1bmtzID0gYXdhaXQgcmVhZFBMUFN0cmVhbShwYXJzZXIpO1xuXG4gICAgICAgIGlmIChjaHVua3MgPT09IG51bGwpIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goeyB2YWx1ZTogY2h1bmtzLCBtZXRhZGF0YSB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YS50eXBlLm5hbWUgPT09ICdOVmFyQ2hhcicgfHwgbWV0YWRhdGEudHlwZS5uYW1lID09PSAnWG1sJykge1xuICAgICAgICAgIGNvbHVtbnMucHVzaCh7IHZhbHVlOiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3VjczInKSwgbWV0YWRhdGEgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEudHlwZS5uYW1lID09PSAnVmFyQ2hhcicpIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goeyB2YWx1ZTogaWNvbnYuZGVjb2RlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSwgbWV0YWRhdGEuY29sbGF0aW9uPy5jb2RlcGFnZSA/PyAndXRmOCcpLCBtZXRhZGF0YSB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YS50eXBlLm5hbWUgPT09ICdWYXJCaW5hcnknIHx8IG1ldGFkYXRhLnR5cGUubmFtZSA9PT0gJ1VEVCcpIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goeyB2YWx1ZTogQnVmZmVyLmNvbmNhdChjaHVua3MpLCBtZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSByZWFkVmFsdWUocGFyc2VyLmJ1ZmZlciwgcGFyc2VyLnBvc2l0aW9uLCBtZXRhZGF0YSwgcGFyc2VyLm9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCBwYXJzZXIud2FpdEZvckNodW5rKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJzZXIucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgICAgICBjb2x1bW5zLnB1c2goeyB2YWx1ZTogcmVzdWx0LnZhbHVlLCBtZXRhZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnNlci5vcHRpb25zLnVzZUNvbHVtbk5hbWVzKSB7XG4gICAgY29uc3QgY29sdW1uc01hcDogeyBba2V5OiBzdHJpbmddOiBDb2x1bW4gfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sTmFtZSA9IGNvbHVtbi5tZXRhZGF0YS5jb2xOYW1lO1xuICAgICAgaWYgKGNvbHVtbnNNYXBbY29sTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb2x1bW5zTWFwW2NvbE5hbWVdID0gY29sdW1uO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBSb3dUb2tlbihjb2x1bW5zTWFwKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IFJvd1Rva2VuKGNvbHVtbnMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJvd1BhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gcm93UGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFLQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFBK0MsU0FBQUUsd0JBQUFHLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFMLHVCQUFBLFlBQUFBLENBQUFHLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsZ0JBQUFQLENBQUEsSUFBQUQsQ0FBQSxnQkFBQUMsQ0FBQSxPQUFBYSxjQUFBLENBQUFDLElBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFN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
78
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiX3ZhbHVlUGFyc2VyIiwiQ29sdW1uVmFsdWVzUmVhZGVyIiwiY29uc3RydWN0b3IiLCJjb2x1bW5zIiwicGxwUmVhZGVyIiwidW5kZWZpbmVkIiwicmVhZENvbHVtbnMiLCJwYXJzZXIiLCJudWxsQml0bWFwIiwiY29sTWV0YWRhdGEiLCJsZW5ndGgiLCJpbmRleCIsIm1ldGFkYXRhIiwidmFsdWUiLCJpc1BMUFN0cmVhbSIsIlBMUFJlYWRlciIsInJlYWQiLCJyZXN1bHQiLCJyZWFkVmFsdWUiLCJidWZmZXIiLCJwb3NpdGlvbiIsIm9wdGlvbnMiLCJvZmZzZXQiLCJwdXNoIiwiZXhwb3J0cyIsIlJvd1Rva2VuUmVhZGVyIiwiUm93VG9rZW4iLCJ1c2VDb2x1bW5OYW1lcyIsInRvQ29sdW1uc01hcCIsImNvbHVtbnNNYXAiLCJPYmplY3QiLCJjcmVhdGUiLCJjb2x1bW4iLCJjb2xOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL3Jvdy10b2tlbi1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gczIuMi43LjE3XG5cbmltcG9ydCBQYXJzZXIsIHsgdHlwZSBUb2tlblJlYWRlciB9IGZyb20gJy4vc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyB0eXBlIENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuXG5pbXBvcnQgeyBSb3dUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgeyBpc1BMUFN0cmVhbSwgUExQUmVhZGVyLCByZWFkVmFsdWUgfSBmcm9tICcuLi92YWx1ZS1wYXJzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gIHZhbHVlOiB1bmtub3duO1xuICBtZXRhZGF0YTogQ29sdW1uTWV0YWRhdGE7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNvbHVtbiB2YWx1ZXMgb2YgYSByb3cgb25lIGJ5IG9uZS4gQ29sdW1uIHZhbHVlcyAtIGVzcGVjaWFsbHkgUExQXG4gKiB2YWx1ZXMgLSBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2UsIHNvIHRoZSBwcm9ncmVzcyBpcyBrZXB0IGFjcm9zcyBjaHVua3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2x1bW5WYWx1ZXNSZWFkZXIge1xuICBkZWNsYXJlIGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8vIFRoZSByZWFkZXIgb2YgYSBQTFAgY29sdW1uIHZhbHVlIHRoYXQgaXMgbm90IGNvbXBsZXRlIHlldC5cbiAgZGVjbGFyZSBwbHBSZWFkZXI6IFBMUFJlYWRlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLnBscFJlYWRlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSByZW1haW5pbmcgY29sdW1uIHZhbHVlcy4gQ29sdW1ucyBmbGFnZ2VkIGluIHRoZSBgbnVsbEJpdG1hcGBcbiAgICogaGF2ZSBubyBkYXRhIGFuZCBhcmUgYG51bGxgLlxuICAgKi9cbiAgcmVhZENvbHVtbnMocGFyc2VyOiBQYXJzZXIsIG51bGxCaXRtYXA6IEJ1ZmZlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNvbE1ldGFkYXRhID0gcGFyc2VyLmNvbE1ldGFkYXRhO1xuXG4gICAgd2hpbGUgKHRoaXMuY29sdW1ucy5sZW5ndGggPCBjb2xNZXRhZGF0YS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmxlbmd0aDtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gY29sTWV0YWRhdGFbaW5kZXhdO1xuXG4gICAgICBsZXQgdmFsdWU7XG4gICAgICBpZiAobnVsbEJpdG1hcCAhPT0gdW5kZWZpbmVkICYmIChudWxsQml0bWFwW2luZGV4ID4+IDNdICYgKDEgPDwgKGluZGV4ICYgNykpKSkge1xuICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGlzUExQU3RyZWFtKG1ldGFkYXRhKSkge1xuICAgICAgICB0aGlzLnBscFJlYWRlciA/Pz0gbmV3IFBMUFJlYWRlcihtZXRhZGF0YSk7XG4gICAgICAgIHZhbHVlID0gdGhpcy5wbHBSZWFkZXIucmVhZChwYXJzZXIpO1xuICAgICAgICB0aGlzLnBscFJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlYWRWYWx1ZShwYXJzZXIuYnVmZmVyLCBwYXJzZXIucG9zaXRpb24sIG1ldGFkYXRhLCBwYXJzZXIub3B0aW9ucyk7XG4gICAgICAgIHBhcnNlci5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgICAgIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh7IHZhbHVlLCBtZXRhZGF0YSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhIGBST1dgIHRva2VuLlxuICovXG5leHBvcnQgY2xhc3MgUm93VG9rZW5SZWFkZXIgZXh0ZW5kcyBDb2x1bW5WYWx1ZXNSZWFkZXIgaW1wbGVtZW50cyBUb2tlblJlYWRlciB7XG4gIHJlYWQocGFyc2VyOiBQYXJzZXIpOiBSb3dUb2tlbiB7XG4gICAgdGhpcy5yZWFkQ29sdW1ucyhwYXJzZXIsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIG5ldyBSb3dUb2tlbihwYXJzZXIub3B0aW9ucy51c2VDb2x1bW5OYW1lcyA/IHRvQ29sdW1uc01hcCh0aGlzLmNvbHVtbnMpIDogdGhpcy5jb2x1bW5zKTtcbiAgfVxufVxuXG4vKipcbiAqIE1hcCBjb2x1bW5zIGJ5IG5hbWUuIElmIG11bHRpcGxlIGNvbHVtbnMgc2hhcmUgYSBuYW1lLCB0aGUgZmlyc3Qgb25lIHdpbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NvbHVtbnNNYXAoY29sdW1uczogQ29sdW1uW10pOiB7IFtrZXk6IHN0cmluZ106IENvbHVtbiB9IHtcbiAgY29uc3QgY29sdW1uc01hcDogeyBba2V5OiBzdHJpbmddOiBDb2x1bW4gfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgIGNvbnN0IGNvbE5hbWUgPSBjb2x1bW4ubWV0YWRhdGEuY29sTmFtZTtcbiAgICBpZiAoY29sdW1uc01hcFtjb2xOYW1lXSA9PSBudWxsKSB7XG4gICAgICBjb2x1bW5zTWFwW2NvbE5hbWVdID0gY29sdW1uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb2x1bW5zTWFwO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBS0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsWUFBQSxHQUFBRCxPQUFBO0FBUEE7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNRSxrQkFBa0IsQ0FBQztFQUc5Qjs7RUFHQUMsV0FBV0EsQ0FBQSxFQUFHO0lBQ1osSUFBSSxDQUFDQyxPQUFPLEdBQUcsRUFBRTtJQUNqQixJQUFJLENBQUNDLFNBQVMsR0FBR0MsU0FBUztFQUM1Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtFQUNFQyxXQUFXQSxDQUFDQyxNQUFjLEVBQUVDLFVBQThCLEVBQUU7SUFDMUQsTUFBTUMsV0FBVyxHQUFHRixNQUFNLENBQUNFLFdBQVc7SUFFdEMsT0FBTyxJQUFJLENBQUNOLE9BQU8sQ0FBQ08sTUFBTSxHQUFHRCxXQUFXLENBQUNDLE1BQU0sRUFBRTtNQUMvQyxNQUFNQyxLQUFLLEdBQUcsSUFBSSxDQUFDUixPQUFPLENBQUNPLE1BQU07TUFDakMsTUFBTUUsUUFBUSxHQUFHSCxXQUFXLENBQUNFLEtBQUssQ0FBQztNQUVuQyxJQUFJRSxLQUFLO01BQ1QsSUFBSUwsVUFBVSxLQUFLSCxTQUFTLElBQUtHLFVBQVUsQ0FBQ0csS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFJLENBQUMsS0FBS0EsS0FBSyxHQUFHLENBQUMsQ0FBRyxFQUFFO1FBQzdFRSxLQUFLLEdBQUcsSUFBSTtNQUNkLENBQUMsTUFBTSxJQUFJLElBQUFDLHdCQUFXLEVBQUNGLFFBQVEsQ0FBQyxFQUFFO1FBQ2hDLElBQUksQ0FBQ1IsU0FBUyxLQUFLLElBQUlXLHNCQUFTLENBQUNILFFBQVEsQ0FBQztRQUMxQ0MsS0FBSyxHQUFHLElBQUksQ0FBQ1QsU0FBUyxDQUFDWSxJQUFJLENBQUNULE1BQU0sQ0FBQztRQUNuQyxJQUFJLENBQUNILFNBQVMsR0FBR0MsU0FBUztNQUM1QixDQUFDLE1BQU07UUFDTCxNQUFNWSxNQUFNLEdBQUcsSUFBQUMsc0JBQVMsRUFBQ1gsTUFBTSxDQUFDWSxNQUFNLEVBQUVaLE1BQU0sQ0FBQ2EsUUFBUSxFQUFFUixRQUFRLEVBQUVMLE1BQU0sQ0FBQ2MsT0FBTyxDQUFDO1FBQ2xGZCxNQUFNLENBQUNhLFFBQVEsR0FBR0gsTUFBTSxDQUFDSyxNQUFNO1FBQy9CVCxLQUFLLEdBQUdJLE1BQU0sQ0FBQ0osS0FBSztNQUN0QjtNQUVBLElBQUksQ0FBQ1YsT0FBTyxDQUFDb0IsSUFBSSxDQUFDO1FBQUVWLEtBQUs7UUFBRUQ7TUFBUyxDQUFDLENBQUM7SUFDeEM7RUFDRjtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUZBWSxPQUFBLENBQUF2QixrQkFBQSxHQUFBQSxrQkFBQTtBQUdPLE1BQU13QixjQUFjLFNBQVN4QixrQkFBa0IsQ0FBd0I7RUFDNUVlLElBQUlBLENBQUNULE1BQWMsRUFBWTtJQUM3QixJQUFJLENBQUNELFdBQVcsQ0FBQ0MsTUFBTSxFQUFFRixTQUFTLENBQUM7SUFDbkMsT0FBTyxJQUFJcUIsZUFBUSxDQUFDbkIsTUFBTSxDQUFDYyxPQUFPLENBQUNNLGNBQWMsR0FBR0MsWUFBWSxDQUFDLElBQUksQ0FBQ3pCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQ0EsT0FBTyxDQUFDO0VBQ2hHO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBRkFxQixPQUFBLENBQUFDLGNBQUEsR0FBQUEsY0FBQTtBQUdPLFNBQVNHLFlBQVlBLENBQUN6QixPQUFpQixFQUE2QjtFQUN6RSxNQUFNMEIsVUFBcUMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDO0VBRWpFLEtBQUssTUFBTUMsTUFBTSxJQUFJN0IsT0FBTyxFQUFFO0lBQzVCLE1BQU04QixPQUFPLEdBQUdELE1BQU0sQ0FBQ3BCLFFBQVEsQ0FBQ3FCLE9BQU87SUFDdkMsSUFBSUosVUFBVSxDQUFDSSxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUU7TUFDL0JKLFVBQVUsQ0FBQ0ksT0FBTyxDQUFDLEdBQUdELE1BQU07SUFDOUI7RUFDRjtFQUVBLE9BQU9ILFVBQVU7QUFDbkIiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"row-token-parser.js","names":["_token","require","iconv","_interopRequireWildcard","_valueParser","_helpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","rowParser","parser","columns","metadata","colMetadata","isPLPStream","chunks","readPLPStream","push","value","type","name","Buffer","concat","toString","decode","collation","codepage","result","readValue","buffer","position","options","err","NotEnoughDataError","waitForChunk","offset","useColumnNames","columnsMap","create","forEach","column","colName","RowToken","_default","exports","module"],"sources":["../../src/token/row-token-parser.ts"],"sourcesContent":["// s2.2.7.17\n\nimport Parser from './stream-parser';\nimport { type ColumnMetadata } from './colmetadata-token-parser';\n\nimport { RowToken } from './token';\nimport * as iconv from 'iconv-lite';\n\nimport { isPLPStream, readPLPStream, readValue } from '../value-parser';\nimport { NotEnoughDataError } from './helpers';\n\ninterface Column {\n value: unknown;\n metadata: ColumnMetadata;\n}\n\nasync function rowParser(parser: Parser): Promise<RowToken> {\n const columns: Column[] = [];\n\n for (const metadata of parser.colMetadata) {\n while (true) {\n if (isPLPStream(metadata)) {\n const chunks = await readPLPStream(parser);\n\n if (chunks === null) {\n columns.push({ value: chunks, metadata });\n } else if (metadata.type.name === 'NVarChar' || metadata.type.name === 'Xml') {\n columns.push({ value: Buffer.concat(chunks).toString('ucs2'), metadata });\n } else if (metadata.type.name === 'VarChar') {\n columns.push({ value: iconv.decode(Buffer.concat(chunks), metadata.collation?.codepage ?? 'utf8'), metadata });\n } else if (metadata.type.name === 'VarBinary' || metadata.type.name === 'UDT') {\n columns.push({ value: Buffer.concat(chunks), metadata });\n }\n } else {\n let result;\n try {\n result = readValue(parser.buffer, parser.position, metadata, parser.options);\n } catch (err) {\n if (err instanceof NotEnoughDataError) {\n await parser.waitForChunk();\n continue;\n }\n\n throw err;\n }\n\n parser.position = result.offset;\n columns.push({ value: result.value, metadata });\n }\n\n break;\n }\n }\n\n if (parser.options.useColumnNames) {\n const columnsMap: { [key: string]: Column } = Object.create(null);\n\n columns.forEach((column) => {\n const colName = column.metadata.colName;\n if (columnsMap[colName] == null) {\n columnsMap[colName] = column;\n }\n });\n\n return new RowToken(columnsMap);\n } else {\n return new RowToken(columns);\n }\n}\n\nexport default rowParser;\nmodule.exports = rowParser;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"row-token-parser.js","names":["_token","require","_valueParser","ColumnValuesReader","constructor","columns","plpReader","undefined","readColumns","parser","nullBitmap","colMetadata","length","index","metadata","value","isPLPStream","PLPReader","read","result","readValue","buffer","position","options","offset","push","exports","RowTokenReader","RowToken","useColumnNames","toColumnsMap","columnsMap","Object","create","column","colName"],"sources":["../../src/token/row-token-parser.ts"],"sourcesContent":["// s2.2.7.17\n\nimport Parser, { type TokenReader } from './stream-parser';\nimport { type ColumnMetadata } from './colmetadata-token-parser';\n\nimport { RowToken } from './token';\n\nimport { isPLPStream, PLPReader, readValue } from '../value-parser';\n\nexport interface Column {\n value: unknown;\n metadata: ColumnMetadata;\n}\n\n/**\n * Reads the column values of a row one by one. Column values - especially PLP\n * values - can be arbitrarily large, so the progress is kept across chunks.\n */\nexport class ColumnValuesReader {\n declare columns: Column[];\n\n // The reader of a PLP column value that is not complete yet.\n declare plpReader: PLPReader | undefined;\n\n constructor() {\n this.columns = [];\n this.plpReader = undefined;\n }\n\n /**\n * Read the remaining column values. Columns flagged in the `nullBitmap`\n * have no data and are `null`.\n */\n readColumns(parser: Parser, nullBitmap: Buffer | undefined) {\n const colMetadata = parser.colMetadata;\n\n while (this.columns.length < colMetadata.length) {\n const index = this.columns.length;\n const metadata = colMetadata[index];\n\n let value;\n if (nullBitmap !== undefined && (nullBitmap[index >> 3] & (1 << (index & 7)))) {\n value = null;\n } else if (isPLPStream(metadata)) {\n this.plpReader ??= new PLPReader(metadata);\n value = this.plpReader.read(parser);\n this.plpReader = undefined;\n } else {\n const result = readValue(parser.buffer, parser.position, metadata, parser.options);\n parser.position = result.offset;\n value = result.value;\n }\n\n this.columns.push({ value, metadata });\n }\n }\n}\n\n/**\n * Reads a `ROW` token.\n */\nexport class RowTokenReader extends ColumnValuesReader implements TokenReader {\n read(parser: Parser): RowToken {\n this.readColumns(parser, undefined);\n return new RowToken(parser.options.useColumnNames ? toColumnsMap(this.columns) : this.columns);\n }\n}\n\n/**\n * Map columns by name. If multiple columns share a name, the first one wins.\n */\nexport function toColumnsMap(columns: Column[]): { [key: string]: Column } {\n const columnsMap: { [key: string]: Column } = Object.create(null);\n\n for (const column of columns) {\n const colName = column.metadata.colName;\n if (columnsMap[colName] == null) {\n columnsMap[colName] = column;\n }\n }\n\n return columnsMap;\n}\n"],"mappings":";;;;;;;AAKA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AAPA;;AAcA;AACA;AACA;AACA;AACO,MAAME,kBAAkB,CAAC;EAG9B;;EAGAC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,OAAO,GAAG,EAAE;IACjB,IAAI,CAACC,SAAS,GAAGC,SAAS;EAC5B;;EAEA;AACF;AACA;AACA;EACEC,WAAWA,CAACC,MAAc,EAAEC,UAA8B,EAAE;IAC1D,MAAMC,WAAW,GAAGF,MAAM,CAACE,WAAW;IAEtC,OAAO,IAAI,CAACN,OAAO,CAACO,MAAM,GAAGD,WAAW,CAACC,MAAM,EAAE;MAC/C,MAAMC,KAAK,GAAG,IAAI,CAACR,OAAO,CAACO,MAAM;MACjC,MAAME,QAAQ,GAAGH,WAAW,CAACE,KAAK,CAAC;MAEnC,IAAIE,KAAK;MACT,IAAIL,UAAU,KAAKH,SAAS,IAAKG,UAAU,CAACG,KAAK,IAAI,CAAC,CAAC,GAAI,CAAC,KAAKA,KAAK,GAAG,CAAC,CAAG,EAAE;QAC7EE,KAAK,GAAG,IAAI;MACd,CAAC,MAAM,IAAI,IAAAC,wBAAW,EAACF,QAAQ,CAAC,EAAE;QAChC,IAAI,CAACR,SAAS,KAAK,IAAIW,sBAAS,CAACH,QAAQ,CAAC;QAC1CC,KAAK,GAAG,IAAI,CAACT,SAAS,CAACY,IAAI,CAACT,MAAM,CAAC;QACnC,IAAI,CAACH,SAAS,GAAGC,SAAS;MAC5B,CAAC,MAAM;QACL,MAAMY,MAAM,GAAG,IAAAC,sBAAS,EAACX,MAAM,CAACY,MAAM,EAAEZ,MAAM,CAACa,QAAQ,EAAER,QAAQ,EAAEL,MAAM,CAACc,OAAO,CAAC;QAClFd,MAAM,CAACa,QAAQ,GAAGH,MAAM,CAACK,MAAM;QAC/BT,KAAK,GAAGI,MAAM,CAACJ,KAAK;MACtB;MAEA,IAAI,CAACV,OAAO,CAACoB,IAAI,CAAC;QAAEV,KAAK;QAAED;MAAS,CAAC,CAAC;IACxC;EACF;AACF;;AAEA;AACA;AACA;AAFAY,OAAA,CAAAvB,kBAAA,GAAAA,kBAAA;AAGO,MAAMwB,cAAc,SAASxB,kBAAkB,CAAwB;EAC5Ee,IAAIA,CAACT,MAAc,EAAY;IAC7B,IAAI,CAACD,WAAW,CAACC,MAAM,EAAEF,SAAS,CAAC;IACnC,OAAO,IAAIqB,eAAQ,CAACnB,MAAM,CAACc,OAAO,CAACM,cAAc,GAAGC,YAAY,CAAC,IAAI,CAACzB,OAAO,CAAC,GAAG,IAAI,CAACA,OAAO,CAAC;EAChG;AACF;;AAEA;AACA;AACA;AAFAqB,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAGO,SAASG,YAAYA,CAACzB,OAAiB,EAA6B;EACzE,MAAM0B,UAAqC,GAAGC,MAAM,CAACC,MAAM,CAAC,IAAI,CAAC;EAEjE,KAAK,MAAMC,MAAM,IAAI7B,OAAO,EAAE;IAC5B,MAAM8B,OAAO,GAAGD,MAAM,CAACpB,QAAQ,CAACqB,OAAO;IACvC,IAAIJ,UAAU,CAACI,OAAO,CAAC,IAAI,IAAI,EAAE;MAC/BJ,UAAU,CAACI,OAAO,CAAC,GAAGD,MAAM;IAC9B;EACF;EAEA,OAAOH,UAAU;AACnB","ignoreList":[]}
@@ -1,36 +1,68 @@
1
- import Debug from '../debug';
2
1
  import { type InternalConnectionOptions } from '../connection';
3
- import { ColInfoToken, ColMetadataToken, DoneProcToken, DoneToken, DoneInProcToken, ErrorMessageToken, InfoMessageToken, RowToken, type EnvChangeToken, LoginAckToken, ReturnStatusToken, OrderToken, FedAuthInfoToken, SSPIToken, ReturnValueToken, NBCRowToken, FeatureExtAckToken, TabNameToken, Token } from './token';
2
+ import { type Token } from './token';
4
3
  import { type ColumnMetadata } from './colmetadata-token-parser';
4
+ import { type Result } from './helpers';
5
5
  export type ParserOptions = Pick<InternalConnectionOptions, 'useUTC' | 'lowerCaseGuids' | 'tdsVersion' | 'useColumnNames' | 'columnNameReplacer' | 'camelCaseColumns'>;
6
+ /**
7
+ * Parses a token that is short enough to simply be parsed again from its
8
+ * start if it is not fully available yet.
9
+ */
10
+ type TokenParser = (buf: Buffer, offset: number, options: ParserOptions) => Result<Token | undefined>;
11
+ /**
12
+ * Parses a token that can grow arbitrarily large, and thus needs to be parsed
13
+ * incrementally.
14
+ *
15
+ * The reader starts parsing right after the token's type byte and keeps its
16
+ * progress across calls: if `read` throws a `NotEnoughDataError`, it is
17
+ * called again once more data has arrived.
18
+ */
19
+ export interface TokenReader {
20
+ read(parser: Parser): Token;
21
+ }
22
+ /**
23
+ * A push-based parser for the tokens contained in a TDS token stream.
24
+ *
25
+ * Data is pushed into the parser as it arrives via `write`, and parsed tokens
26
+ * are pulled out via `read`. Tokens are parsed lazily, one at a time, so any
27
+ * effects of handling a token (e.g. the TDS version negotiated via the
28
+ * `LOGINACK` token) apply to the parsing of all tokens that follow it.
29
+ */
6
30
  declare class Parser {
7
- debug: Debug;
8
- colMetadata: ColumnMetadata[];
9
31
  options: ParserOptions;
10
- iterator: AsyncIterator<Buffer, any, undefined> | Iterator<Buffer, any, undefined>;
32
+ colMetadata: ColumnMetadata[];
11
33
  buffer: Buffer;
12
34
  position: number;
13
- static parseTokens(iterable: AsyncIterable<Buffer> | Iterable<Buffer>, debug: Debug, options: ParserOptions, colMetadata?: ColumnMetadata[]): AsyncGenerator<Token | undefined, void, unknown>;
14
- readToken(type: number): Token | undefined | Promise<Token | undefined>;
15
- readFeatureExtAckToken(): FeatureExtAckToken | Promise<FeatureExtAckToken>;
16
- readTabNameToken(): TabNameToken | Promise<TabNameToken>;
17
- readColInfoToken(): ColInfoToken | Promise<ColInfoToken>;
18
- readNbcRowToken(): Promise<NBCRowToken>;
19
- readReturnValueToken(): Promise<ReturnValueToken>;
20
- readColMetadataToken(): Promise<ColMetadataToken>;
21
- readSSPIToken(): SSPIToken | Promise<SSPIToken>;
22
- readFedAuthInfoToken(): FedAuthInfoToken | Promise<FedAuthInfoToken>;
23
- readOrderToken(): OrderToken | Promise<OrderToken>;
24
- readReturnStatusToken(): ReturnStatusToken | Promise<ReturnStatusToken>;
25
- readLoginAckToken(): LoginAckToken | Promise<LoginAckToken>;
26
- readEnvChangeToken(): EnvChangeToken | undefined | Promise<EnvChangeToken | undefined>;
27
- readRowToken(): RowToken | Promise<RowToken>;
28
- readInfoToken(): InfoMessageToken | Promise<InfoMessageToken>;
29
- readErrorToken(): ErrorMessageToken | Promise<ErrorMessageToken>;
30
- readDoneInProcToken(): DoneInProcToken | Promise<DoneInProcToken>;
31
- readDoneProcToken(): DoneProcToken | Promise<DoneProcToken>;
32
- readDoneToken(): DoneToken | Promise<DoneToken>;
33
- constructor(iterable: AsyncIterable<Buffer> | Iterable<Buffer>, debug: Debug, options: ParserOptions);
34
- waitForChunk(): Promise<void>;
35
+ pending: Buffer[];
36
+ pendingLength: number;
37
+ bytesNeeded: number;
38
+ tokenReader: TokenReader | undefined;
39
+ constructor(options: ParserOptions, colMetadata?: ColumnMetadata[]);
40
+ /**
41
+ * Parse all tokens from the given chunks of data.
42
+ */
43
+ static parseTokens(iterable: AsyncIterable<Buffer> | Iterable<Buffer>, options: ParserOptions, colMetadata?: ColumnMetadata[]): AsyncGenerator<Token, void, undefined>;
44
+ /**
45
+ * Add a chunk of data to be parsed.
46
+ */
47
+ write(chunk: Buffer): void;
48
+ /**
49
+ * Parse the next token, or return `undefined` if more data needs to be
50
+ * written first.
51
+ */
52
+ read(): Token | undefined;
53
+ /**
54
+ * Signal that all data was written.
55
+ *
56
+ * Throws if the data ended in the middle of a token.
57
+ */
58
+ end(): void;
59
+ /**
60
+ * Append the pending chunks to the unconsumed data, if that makes enough
61
+ * data available for parsing to make progress.
62
+ */
63
+ appendPending(): boolean;
64
+ readToken(): Token | undefined;
65
+ parseToken(parser: TokenParser): Token | undefined;
66
+ startTokenReader(reader: TokenReader): Token;
35
67
  }
36
68
  export default Parser;