tedious 20.2.1 → 20.2.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.
@@ -1,8 +1,40 @@
1
1
  import BulkLoad from './bulk-load';
2
+ export type Row = unknown[] | {
3
+ [colName: string]: unknown;
4
+ };
5
+ /**
6
+ * The TDS byte stream of a bulk load: COLMETADATA, a ROW token per row,
7
+ * and a DONE token at the end, serialized from the bulk load's row source.
8
+ *
9
+ * The payload owns the row source's iterator the way a `for await` loop
10
+ * would: it requests the first row as soon as it is created, so that a
11
+ * stream source is observed from the moment it is handed over, and it
12
+ * closes the source through the iterator's `return()` whenever the bulk
13
+ * load does not run to completion, whether the rows were being read
14
+ * ([[Symbol.asyncIterator]]) or never got to be ([[close]]).
15
+ *
16
+ * Rows are written into one buffer that lives for the whole bulk load.
17
+ * Its contents are yielded once it holds a chunk's worth
18
+ * (`WritableTrackingBuffer.CHUNK_SIZE`), checked after every cell, and at
19
+ * the end. Rows from a synchronous source are serialized without an
20
+ * event-loop turn in between; rows from an asynchronous source are awaited
21
+ * one at a time.
22
+ *
23
+ * @private
24
+ */
2
25
  export declare class BulkLoadPayload implements AsyncIterable<Buffer> {
3
26
  bulkLoad: BulkLoad;
4
- iterator: AsyncIterableIterator<Buffer>;
5
- constructor(bulkLoad: BulkLoad);
6
- [Symbol.asyncIterator](): AsyncIterableIterator<Buffer<ArrayBufferLike>>;
27
+ iterator: Iterator<Row> | AsyncIterator<Row>;
28
+ pending: IteratorResult<Row> | Promise<IteratorResult<Row>> | undefined;
29
+ constructor(bulkLoad: BulkLoad, rows: Iterable<Row> | AsyncIterable<Row>);
30
+ /**
31
+ * Closes the row source of a bulk load whose rows will not be read:
32
+ * the `INSERT BULK` statement was rejected, the bulk load was canceled,
33
+ * or the connection is no longer logged in. Best effort: a read still
34
+ * pending in the source cannot be interrupted, and a close that fails
35
+ * has nothing left to report to.
36
+ */
37
+ close(): void;
38
+ [Symbol.asyncIterator](): AsyncGenerator<Buffer<ArrayBufferLike>, void, unknown>;
7
39
  toString(indent?: string): string;
8
40
  }
@@ -4,20 +4,185 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.BulkLoadPayload = void 0;
7
+ var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));
8
+ var _token = require("./token/token");
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ const rowTokenBuffer = Buffer.from([_token.TYPE.ROW]);
11
+ const textPointerAndTimestampBuffer = Buffer.from([
12
+ // TextPointer length
13
+ 0x10,
14
+ // TextPointer
15
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16
+ // Timestamp
17
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
18
+ const textPointerNullBuffer = Buffer.from([0x00]);
19
+ function isPromiseLike(value) {
20
+ return value != null && typeof value.then === 'function';
21
+ }
22
+ function ignoreError() {}
23
+
24
+ /**
25
+ * The TDS byte stream of a bulk load: COLMETADATA, a ROW token per row,
26
+ * and a DONE token at the end, serialized from the bulk load's row source.
27
+ *
28
+ * The payload owns the row source's iterator the way a `for await` loop
29
+ * would: it requests the first row as soon as it is created, so that a
30
+ * stream source is observed from the moment it is handed over, and it
31
+ * closes the source through the iterator's `return()` whenever the bulk
32
+ * load does not run to completion, whether the rows were being read
33
+ * ([[Symbol.asyncIterator]]) or never got to be ([[close]]).
34
+ *
35
+ * Rows are written into one buffer that lives for the whole bulk load.
36
+ * Its contents are yielded once it holds a chunk's worth
37
+ * (`WritableTrackingBuffer.CHUNK_SIZE`), checked after every cell, and at
38
+ * the end. Rows from a synchronous source are serialized without an
39
+ * event-loop turn in between; rows from an asynchronous source are awaited
40
+ * one at a time.
41
+ *
42
+ * @private
43
+ */
7
44
  class BulkLoadPayload {
8
- constructor(bulkLoad) {
45
+ constructor(bulkLoad, rows) {
9
46
  this.bulkLoad = bulkLoad;
47
+ this.iterator = typeof rows[Symbol.asyncIterator] === 'function' ? rows[Symbol.asyncIterator]() : rows[Symbol.iterator]();
48
+
49
+ // The first row is requested now, before the `INSERT BULK` statement
50
+ // has gone out. For a stream source this is what attaches its
51
+ // iterator's listeners: an error it emits while the statement is in
52
+ // flight is kept and reported on the next read, instead of being an
53
+ // unhandled `'error'` event. The read is awaited when the rows are
54
+ // serialized; its rejection is not unhandled until then, and neither
55
+ // is a synchronous source's throw, which reaches the bulk load's
56
+ // callback the same way.
57
+ let first;
58
+ try {
59
+ first = this.iterator.next();
60
+ } catch (err) {
61
+ first = Promise.reject(err);
62
+ }
63
+ if (isPromiseLike(first)) {
64
+ const read = Promise.resolve(first);
65
+ read.then(undefined, ignoreError);
66
+ this.pending = read;
67
+ } else {
68
+ this.pending = first;
69
+ }
70
+ }
10
71
 
11
- // We need to grab the iterator here so that `error` event handlers are set up
12
- // as early as possible (and are not potentially lost).
13
- this.iterator = this.bulkLoad.rowToPacketTransform[Symbol.asyncIterator]();
72
+ /**
73
+ * Closes the row source of a bulk load whose rows will not be read:
74
+ * the `INSERT BULK` statement was rejected, the bulk load was canceled,
75
+ * or the connection is no longer logged in. Best effort: a read still
76
+ * pending in the source cannot be interrupted, and a close that fails
77
+ * has nothing left to report to.
78
+ */
79
+ close() {
80
+ const iterator = this.iterator;
81
+ if (typeof iterator.return !== 'function') {
82
+ return;
83
+ }
84
+ try {
85
+ const closing = iterator.return();
86
+ if (isPromiseLike(closing)) {
87
+ Promise.resolve(closing).then(undefined, ignoreError);
88
+ }
89
+ } catch {
90
+ // Nothing left to report to.
91
+ }
14
92
  }
15
- [Symbol.asyncIterator]() {
16
- return this.iterator;
93
+ async *[Symbol.asyncIterator]() {
94
+ const bulkLoad = this.bulkLoad;
95
+ const options = bulkLoad.options;
96
+ const columns = bulkLoad.columns;
97
+ const iterator = this.iterator;
98
+
99
+ // Per column, not per cell: a text type's value is written behind a
100
+ // text pointer and timestamp, or as a null pointer.
101
+ const isTextType = columns.map(c => c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText');
102
+ const buffer = new _writableTrackingBuffer.default();
103
+ buffer.writeBuffer(bulkLoad.getColMetaData());
104
+ let done = false;
105
+ let closed = false;
106
+ try {
107
+ while (true) {
108
+ let result = this.pending ?? iterator.next();
109
+ this.pending = undefined;
110
+ if (isPromiseLike(result)) {
111
+ result = await result;
112
+ }
113
+ if (result.done) {
114
+ done = true;
115
+ break;
116
+ }
117
+
118
+ // A row given as a promise is settled first, as `Readable.from`
119
+ // settled it before handing it on.
120
+ let row = result.value;
121
+ if (isPromiseLike(row)) {
122
+ row = await row;
123
+ }
124
+ buffer.writeBuffer(rowTokenBuffer);
125
+ const isArray = Array.isArray(row);
126
+ for (let i = 0; i < columns.length; i++) {
127
+ const c = columns[i];
128
+ const value = c.type.validate(isArray ? row[i] : row[c.objName], c.collation);
129
+ const parameter = {
130
+ length: c.length,
131
+ scale: c.scale,
132
+ precision: c.precision,
133
+ value: value
134
+ };
135
+ if (isTextType[i] && value == null) {
136
+ buffer.writeBuffer(textPointerNullBuffer);
137
+ } else {
138
+ if (isTextType[i]) {
139
+ buffer.writeBuffer(textPointerAndTimestampBuffer);
140
+ }
141
+ buffer.writeBuffer(c.type.generateParameterLength(parameter, options));
142
+ for (const chunk of c.type.generateParameterData(parameter, options)) {
143
+ buffer.writeBuffer(chunk);
144
+ }
145
+ }
146
+
147
+ // Checked after every cell, not only after every row, so that a
148
+ // wide row of large cells goes downstream as it is serialized.
149
+ if (buffer.length >= _writableTrackingBuffer.default.CHUNK_SIZE) {
150
+ for (const chunk of buffer.getBuffers()) {
151
+ yield chunk;
152
+ }
153
+ buffer.consume(buffer.length);
154
+ }
155
+ }
156
+ }
157
+ } catch (err) {
158
+ // A failed row closes the source as a `for await` would. A close
159
+ // that fails must not replace the row error the bulk load is
160
+ // failing with.
161
+ closed = true;
162
+ if (typeof iterator.return === 'function') {
163
+ try {
164
+ await iterator.return();
165
+ } catch {
166
+ // The row error is what surfaces.
167
+ }
168
+ }
169
+ throw err;
170
+ } finally {
171
+ // The consumer stopped pulling (e.g. because the bulk load was
172
+ // canceled): close the source as a `for await` would.
173
+ if (!done && !closed && typeof iterator.return === 'function') {
174
+ await iterator.return();
175
+ }
176
+ }
177
+ buffer.writeBuffer(bulkLoad.createDoneToken());
178
+ for (const chunk of buffer.getBuffers()) {
179
+ yield chunk;
180
+ }
181
+ buffer.consume(buffer.length);
17
182
  }
18
183
  toString(indent = '') {
19
184
  return indent + 'BulkLoad';
20
185
  }
21
186
  }
22
187
  exports.BulkLoadPayload = BulkLoadPayload;
23
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWxrTG9hZFBheWxvYWQiLCJjb25zdHJ1Y3RvciIsImJ1bGtMb2FkIiwiaXRlcmF0b3IiLCJyb3dUb1BhY2tldFRyYW5zZm9ybSIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZyIsImluZGVudCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvYnVsay1sb2FkLXBheWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ1bGtMb2FkIGZyb20gJy4vYnVsay1sb2FkJztcblxuZXhwb3J0IGNsYXNzIEJ1bGtMb2FkUGF5bG9hZCBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8QnVmZmVyPiB7XG4gIGRlY2xhcmUgYnVsa0xvYWQ6IEJ1bGtMb2FkO1xuICBkZWNsYXJlIGl0ZXJhdG9yOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8QnVmZmVyPjtcblxuICBjb25zdHJ1Y3RvcihidWxrTG9hZDogQnVsa0xvYWQpIHtcbiAgICB0aGlzLmJ1bGtMb2FkID0gYnVsa0xvYWQ7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGdyYWIgdGhlIGl0ZXJhdG9yIGhlcmUgc28gdGhhdCBgZXJyb3JgIGV2ZW50IGhhbmRsZXJzIGFyZSBzZXQgdXBcbiAgICAvLyBhcyBlYXJseSBhcyBwb3NzaWJsZSAoYW5kIGFyZSBub3QgcG90ZW50aWFsbHkgbG9zdCkuXG4gICAgdGhpcy5pdGVyYXRvciA9IHRoaXMuYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIH1cblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yO1xuICB9XG5cbiAgdG9TdHJpbmcoaW5kZW50ID0gJycpIHtcbiAgICByZXR1cm4gaW5kZW50ICsgKCdCdWxrTG9hZCcpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVPLE1BQU1BLGVBQWUsQ0FBa0M7RUFJNURDLFdBQVdBLENBQUNDLFFBQWtCLEVBQUU7SUFDOUIsSUFBSSxDQUFDQSxRQUFRLEdBQUdBLFFBQVE7O0lBRXhCO0lBQ0E7SUFDQSxJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJLENBQUNELFFBQVEsQ0FBQ0Usb0JBQW9CLENBQUNDLE1BQU0sQ0FBQ0MsYUFBYSxDQUFDLENBQUMsQ0FBQztFQUM1RTtFQUVBLENBQUNELE1BQU0sQ0FBQ0MsYUFBYSxJQUFJO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDSCxRQUFRO0VBQ3RCO0VBRUFJLFFBQVFBLENBQUNDLE1BQU0sR0FBRyxFQUFFLEVBQUU7SUFDcEIsT0FBT0EsTUFBTSxHQUFJLFVBQVc7RUFDOUI7QUFDRjtBQUFDQyxPQUFBLENBQUFULGVBQUEsR0FBQUEsZUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
188
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3Rva2VuIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwicm93VG9rZW5CdWZmZXIiLCJCdWZmZXIiLCJmcm9tIiwiVE9LRU5fVFlQRSIsIlJPVyIsInRleHRQb2ludGVyQW5kVGltZXN0YW1wQnVmZmVyIiwidGV4dFBvaW50ZXJOdWxsQnVmZmVyIiwiaXNQcm9taXNlTGlrZSIsInZhbHVlIiwidGhlbiIsImlnbm9yZUVycm9yIiwiQnVsa0xvYWRQYXlsb2FkIiwiY29uc3RydWN0b3IiLCJidWxrTG9hZCIsInJvd3MiLCJpdGVyYXRvciIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJmaXJzdCIsIm5leHQiLCJlcnIiLCJQcm9taXNlIiwicmVqZWN0IiwicmVhZCIsInJlc29sdmUiLCJ1bmRlZmluZWQiLCJwZW5kaW5nIiwiY2xvc2UiLCJyZXR1cm4iLCJjbG9zaW5nIiwib3B0aW9ucyIsImNvbHVtbnMiLCJpc1RleHRUeXBlIiwibWFwIiwiYyIsInR5cGUiLCJuYW1lIiwiYnVmZmVyIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIndyaXRlQnVmZmVyIiwiZ2V0Q29sTWV0YURhdGEiLCJkb25lIiwiY2xvc2VkIiwicmVzdWx0Iiwicm93IiwiaXNBcnJheSIsIkFycmF5IiwiaSIsImxlbmd0aCIsInZhbGlkYXRlIiwib2JqTmFtZSIsImNvbGxhdGlvbiIsInBhcmFtZXRlciIsInNjYWxlIiwicHJlY2lzaW9uIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJjaHVuayIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsIkNIVU5LX1NJWkUiLCJnZXRCdWZmZXJzIiwiY29uc3VtZSIsImNyZWF0ZURvbmVUb2tlbiIsInRvU3RyaW5nIiwiaW5kZW50IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWxrLWxvYWQtcGF5bG9hZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQnVsa0xvYWQgZnJvbSAnLi9idWxrLWxvYWQnO1xuaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCB7IFRZUEUgYXMgVE9LRU5fVFlQRSB9IGZyb20gJy4vdG9rZW4vdG9rZW4nO1xuXG5leHBvcnQgdHlwZSBSb3cgPSB1bmtub3duW10gfCB7IFtjb2xOYW1lOiBzdHJpbmddOiB1bmtub3duIH07XG5cbmNvbnN0IHJvd1Rva2VuQnVmZmVyID0gQnVmZmVyLmZyb20oWyBUT0tFTl9UWVBFLlJPVyBdKTtcbmNvbnN0IHRleHRQb2ludGVyQW5kVGltZXN0YW1wQnVmZmVyID0gQnVmZmVyLmZyb20oW1xuICAvLyBUZXh0UG9pbnRlciBsZW5ndGhcbiAgMHgxMCxcblxuICAvLyBUZXh0UG9pbnRlclxuICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuXG4gIC8vIFRpbWVzdGFtcFxuICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXG5dKTtcbmNvbnN0IHRleHRQb2ludGVyTnVsbEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaWdub3JlRXJyb3IoKSB7fVxuXG4vKipcbiAqIFRoZSBURFMgYnl0ZSBzdHJlYW0gb2YgYSBidWxrIGxvYWQ6IENPTE1FVEFEQVRBLCBhIFJPVyB0b2tlbiBwZXIgcm93LFxuICogYW5kIGEgRE9ORSB0b2tlbiBhdCB0aGUgZW5kLCBzZXJpYWxpemVkIGZyb20gdGhlIGJ1bGsgbG9hZCdzIHJvdyBzb3VyY2UuXG4gKlxuICogVGhlIHBheWxvYWQgb3ducyB0aGUgcm93IHNvdXJjZSdzIGl0ZXJhdG9yIHRoZSB3YXkgYSBgZm9yIGF3YWl0YCBsb29wXG4gKiB3b3VsZDogaXQgcmVxdWVzdHMgdGhlIGZpcnN0IHJvdyBhcyBzb29uIGFzIGl0IGlzIGNyZWF0ZWQsIHNvIHRoYXQgYVxuICogc3RyZWFtIHNvdXJjZSBpcyBvYnNlcnZlZCBmcm9tIHRoZSBtb21lbnQgaXQgaXMgaGFuZGVkIG92ZXIsIGFuZCBpdFxuICogY2xvc2VzIHRoZSBzb3VyY2UgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBgcmV0dXJuKClgIHdoZW5ldmVyIHRoZSBidWxrXG4gKiBsb2FkIGRvZXMgbm90IHJ1biB0byBjb21wbGV0aW9uLCB3aGV0aGVyIHRoZSByb3dzIHdlcmUgYmVpbmcgcmVhZFxuICogKFtbU3ltYm9sLmFzeW5jSXRlcmF0b3JdXSkgb3IgbmV2ZXIgZ290IHRvIGJlIChbW2Nsb3NlXV0pLlxuICpcbiAqIFJvd3MgYXJlIHdyaXR0ZW4gaW50byBvbmUgYnVmZmVyIHRoYXQgbGl2ZXMgZm9yIHRoZSB3aG9sZSBidWxrIGxvYWQuXG4gKiBJdHMgY29udGVudHMgYXJlIHlpZWxkZWQgb25jZSBpdCBob2xkcyBhIGNodW5rJ3Mgd29ydGhcbiAqIChgV3JpdGFibGVUcmFja2luZ0J1ZmZlci5DSFVOS19TSVpFYCksIGNoZWNrZWQgYWZ0ZXIgZXZlcnkgY2VsbCwgYW5kIGF0XG4gKiB0aGUgZW5kLiBSb3dzIGZyb20gYSBzeW5jaHJvbm91cyBzb3VyY2UgYXJlIHNlcmlhbGl6ZWQgd2l0aG91dCBhblxuICogZXZlbnQtbG9vcCB0dXJuIGluIGJldHdlZW47IHJvd3MgZnJvbSBhbiBhc3luY2hyb25vdXMgc291cmNlIGFyZSBhd2FpdGVkXG4gKiBvbmUgYXQgYSB0aW1lLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrTG9hZFBheWxvYWQgaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4ge1xuICBkZWNsYXJlIGJ1bGtMb2FkOiBCdWxrTG9hZDtcbiAgZGVjbGFyZSBpdGVyYXRvcjogSXRlcmF0b3I8Um93PiB8IEFzeW5jSXRlcmF0b3I8Um93PjtcbiAgZGVjbGFyZSBwZW5kaW5nOiBJdGVyYXRvclJlc3VsdDxSb3c+IHwgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxSb3c+PiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihidWxrTG9hZDogQnVsa0xvYWQsIHJvd3M6IEl0ZXJhYmxlPFJvdz4gfCBBc3luY0l0ZXJhYmxlPFJvdz4pIHtcbiAgICB0aGlzLmJ1bGtMb2FkID0gYnVsa0xvYWQ7XG5cbiAgICB0aGlzLml0ZXJhdG9yID0gdHlwZW9mIChyb3dzIGFzIFBhcnRpYWw8QXN5bmNJdGVyYWJsZTxSb3c+PilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nID9cbiAgICAgIChyb3dzIGFzIEFzeW5jSXRlcmFibGU8Um93PilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgOlxuICAgICAgKHJvd3MgYXMgSXRlcmFibGU8Um93PilbU3ltYm9sLml0ZXJhdG9yXSgpO1xuXG4gICAgLy8gVGhlIGZpcnN0IHJvdyBpcyByZXF1ZXN0ZWQgbm93LCBiZWZvcmUgdGhlIGBJTlNFUlQgQlVMS2Agc3RhdGVtZW50XG4gICAgLy8gaGFzIGdvbmUgb3V0LiBGb3IgYSBzdHJlYW0gc291cmNlIHRoaXMgaXMgd2hhdCBhdHRhY2hlcyBpdHNcbiAgICAvLyBpdGVyYXRvcidzIGxpc3RlbmVyczogYW4gZXJyb3IgaXQgZW1pdHMgd2hpbGUgdGhlIHN0YXRlbWVudCBpcyBpblxuICAgIC8vIGZsaWdodCBpcyBrZXB0IGFuZCByZXBvcnRlZCBvbiB0aGUgbmV4dCByZWFkLCBpbnN0ZWFkIG9mIGJlaW5nIGFuXG4gICAgLy8gdW5oYW5kbGVkIGAnZXJyb3InYCBldmVudC4gVGhlIHJlYWQgaXMgYXdhaXRlZCB3aGVuIHRoZSByb3dzIGFyZVxuICAgIC8vIHNlcmlhbGl6ZWQ7IGl0cyByZWplY3Rpb24gaXMgbm90IHVuaGFuZGxlZCB1bnRpbCB0aGVuLCBhbmQgbmVpdGhlclxuICAgIC8vIGlzIGEgc3luY2hyb25vdXMgc291cmNlJ3MgdGhyb3csIHdoaWNoIHJlYWNoZXMgdGhlIGJ1bGsgbG9hZCdzXG4gICAgLy8gY2FsbGJhY2sgdGhlIHNhbWUgd2F5LlxuICAgIGxldCBmaXJzdDogSXRlcmF0b3JSZXN1bHQ8Um93PiB8IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Um93Pj47XG4gICAgdHJ5IHtcbiAgICAgIGZpcnN0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBmaXJzdCA9IFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJvbWlzZUxpa2UoZmlyc3QpKSB7XG4gICAgICBjb25zdCByZWFkID0gUHJvbWlzZS5yZXNvbHZlKGZpcnN0KTtcbiAgICAgIHJlYWQudGhlbih1bmRlZmluZWQsIGlnbm9yZUVycm9yKTtcbiAgICAgIHRoaXMucGVuZGluZyA9IHJlYWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVuZGluZyA9IGZpcnN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHJvdyBzb3VyY2Ugb2YgYSBidWxrIGxvYWQgd2hvc2Ugcm93cyB3aWxsIG5vdCBiZSByZWFkOlxuICAgKiB0aGUgYElOU0VSVCBCVUxLYCBzdGF0ZW1lbnQgd2FzIHJlamVjdGVkLCB0aGUgYnVsayBsb2FkIHdhcyBjYW5jZWxlZCxcbiAgICogb3IgdGhlIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyIGxvZ2dlZCBpbi4gQmVzdCBlZmZvcnQ6IGEgcmVhZCBzdGlsbFxuICAgKiBwZW5kaW5nIGluIHRoZSBzb3VyY2UgY2Fubm90IGJlIGludGVycnVwdGVkLCBhbmQgYSBjbG9zZSB0aGF0IGZhaWxzXG4gICAqIGhhcyBub3RoaW5nIGxlZnQgdG8gcmVwb3J0IHRvLlxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3IucmV0dXJuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsb3NpbmcgPSBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKGNsb3NpbmcpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShjbG9zaW5nKS50aGVuKHVuZGVmaW5lZCwgaWdub3JlRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIHJlcG9ydCB0by5cbiAgICB9XG4gIH1cblxuICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICBjb25zdCBidWxrTG9hZCA9IHRoaXMuYnVsa0xvYWQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGJ1bGtMb2FkLm9wdGlvbnM7XG4gICAgY29uc3QgY29sdW1ucyA9IGJ1bGtMb2FkLmNvbHVtbnM7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuXG4gICAgLy8gUGVyIGNvbHVtbiwgbm90IHBlciBjZWxsOiBhIHRleHQgdHlwZSdzIHZhbHVlIGlzIHdyaXR0ZW4gYmVoaW5kIGFcbiAgICAvLyB0ZXh0IHBvaW50ZXIgYW5kIHRpbWVzdGFtcCwgb3IgYXMgYSBudWxsIHBvaW50ZXIuXG4gICAgY29uc3QgaXNUZXh0VHlwZSA9IGNvbHVtbnMubWFwKChjKSA9PiBjLnR5cGUubmFtZSA9PT0gJ1RleHQnIHx8IGMudHlwZS5uYW1lID09PSAnSW1hZ2UnIHx8IGMudHlwZS5uYW1lID09PSAnTlRleHQnKTtcblxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG4gICAgYnVmZmVyLndyaXRlQnVmZmVyKGJ1bGtMb2FkLmdldENvbE1ldGFEYXRhKCkpO1xuXG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBsZXQgY2xvc2VkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBlbmRpbmcgPz8gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB0aGlzLnBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgcm93IGdpdmVuIGFzIGEgcHJvbWlzZSBpcyBzZXR0bGVkIGZpcnN0LCBhcyBgUmVhZGFibGUuZnJvbWBcbiAgICAgICAgLy8gc2V0dGxlZCBpdCBiZWZvcmUgaGFuZGluZyBpdCBvbi5cbiAgICAgICAgbGV0IHJvdyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2Uocm93KSkge1xuICAgICAgICAgIHJvdyA9IGF3YWl0IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihyb3dUb2tlbkJ1ZmZlcik7XG5cbiAgICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocm93KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGNvbHVtbnNbaV07XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjLnR5cGUudmFsaWRhdGUoaXNBcnJheSA/IChyb3cgYXMgdW5rbm93bltdKVtpXSA6IChyb3cgYXMgeyBbY29sTmFtZTogc3RyaW5nXTogdW5rbm93biB9KVtjLm9iak5hbWVdLCBjLmNvbGxhdGlvbik7XG5cbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSB7XG4gICAgICAgICAgICBsZW5ndGg6IGMubGVuZ3RoLFxuICAgICAgICAgICAgc2NhbGU6IGMuc2NhbGUsXG4gICAgICAgICAgICBwcmVjaXNpb246IGMucHJlY2lzaW9uLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChpc1RleHRUeXBlW2ldICYmIHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcih0ZXh0UG9pbnRlck51bGxCdWZmZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNUZXh0VHlwZVtpXSkge1xuICAgICAgICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIodGV4dFBvaW50ZXJBbmRUaW1lc3RhbXBCdWZmZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIoYy50eXBlLmdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjLnR5cGUuZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVja2VkIGFmdGVyIGV2ZXJ5IGNlbGwsIG5vdCBvbmx5IGFmdGVyIGV2ZXJ5IHJvdywgc28gdGhhdCBhXG4gICAgICAgICAgLy8gd2lkZSByb3cgb2YgbGFyZ2UgY2VsbHMgZ29lcyBkb3duc3RyZWFtIGFzIGl0IGlzIHNlcmlhbGl6ZWQuXG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPj0gV3JpdGFibGVUcmFja2luZ0J1ZmZlci5DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ1ZmZlci5nZXRCdWZmZXJzKCkpIHtcbiAgICAgICAgICAgICAgeWllbGQgY2h1bms7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIuY29uc3VtZShidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEEgZmFpbGVkIHJvdyBjbG9zZXMgdGhlIHNvdXJjZSBhcyBhIGBmb3IgYXdhaXRgIHdvdWxkLiBBIGNsb3NlXG4gICAgICAvLyB0aGF0IGZhaWxzIG11c3Qgbm90IHJlcGxhY2UgdGhlIHJvdyBlcnJvciB0aGUgYnVsayBsb2FkIGlzXG4gICAgICAvLyBmYWlsaW5nIHdpdGguXG4gICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gVGhlIHJvdyBlcnJvciBpcyB3aGF0IHN1cmZhY2VzLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFRoZSBjb25zdW1lciBzdG9wcGVkIHB1bGxpbmcgKGUuZy4gYmVjYXVzZSB0aGUgYnVsayBsb2FkIHdhc1xuICAgICAgLy8gY2FuY2VsZWQpOiBjbG9zZSB0aGUgc291cmNlIGFzIGEgYGZvciBhd2FpdGAgd291bGQuXG4gICAgICBpZiAoIWRvbmUgJiYgIWNsb3NlZCAmJiB0eXBlb2YgaXRlcmF0b3IucmV0dXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihidWxrTG9hZC5jcmVhdGVEb25lVG9rZW4oKSk7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBidWZmZXIuZ2V0QnVmZmVycygpKSB7XG4gICAgICB5aWVsZCBjaHVuaztcbiAgICB9XG4gICAgYnVmZmVyLmNvbnN1bWUoYnVmZmVyLmxlbmd0aCk7XG4gIH1cblxuICB0b1N0cmluZyhpbmRlbnQgPSAnJykge1xuICAgIHJldHVybiBpbmRlbnQgKyAoJ0J1bGtMb2FkJyk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsdUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUFtRCxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUluRCxNQUFNRyxjQUFjLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDLENBQUVDLFdBQVUsQ0FBQ0MsR0FBRyxDQUFFLENBQUM7QUFDdEQsTUFBTUMsNkJBQTZCLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDO0FBQ2hEO0FBQ0EsSUFBSTtBQUVKO0FBQ0EsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtBQUU5RjtBQUNBLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQy9DLENBQUM7QUFDRixNQUFNSSxxQkFBcUIsR0FBR0wsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUVqRCxTQUFTSyxh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
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-load-payload.js","names":["BulkLoadPayload","constructor","bulkLoad","iterator","rowToPacketTransform","Symbol","asyncIterator","toString","indent","exports"],"sources":["../src/bulk-load-payload.ts"],"sourcesContent":["import BulkLoad from './bulk-load';\n\nexport class BulkLoadPayload implements AsyncIterable<Buffer> {\n declare bulkLoad: BulkLoad;\n declare iterator: AsyncIterableIterator<Buffer>;\n\n constructor(bulkLoad: BulkLoad) {\n this.bulkLoad = bulkLoad;\n\n // We need to grab the iterator here so that `error` event handlers are set up\n // as early as possible (and are not potentially lost).\n this.iterator = this.bulkLoad.rowToPacketTransform[Symbol.asyncIterator]();\n }\n\n [Symbol.asyncIterator]() {\n return this.iterator;\n }\n\n toString(indent = '') {\n return indent + ('BulkLoad');\n }\n}\n"],"mappings":";;;;;;AAEO,MAAMA,eAAe,CAAkC;EAI5DC,WAAWA,CAACC,QAAkB,EAAE;IAC9B,IAAI,CAACA,QAAQ,GAAGA,QAAQ;;IAExB;IACA;IACA,IAAI,CAACC,QAAQ,GAAG,IAAI,CAACD,QAAQ,CAACE,oBAAoB,CAACC,MAAM,CAACC,aAAa,CAAC,CAAC,CAAC;EAC5E;EAEA,CAACD,MAAM,CAACC,aAAa,IAAI;IACvB,OAAO,IAAI,CAACH,QAAQ;EACtB;EAEAI,QAAQA,CAACC,MAAM,GAAG,EAAE,EAAE;IACpB,OAAOA,MAAM,GAAI,UAAW;EAC9B;AACF;AAACC,OAAA,CAAAT,eAAA,GAAAA,eAAA","ignoreList":[]}
1
+ {"version":3,"file":"bulk-load-payload.js","names":["_writableTrackingBuffer","_interopRequireDefault","require","_token","e","__esModule","default","rowTokenBuffer","Buffer","from","TOKEN_TYPE","ROW","textPointerAndTimestampBuffer","textPointerNullBuffer","isPromiseLike","value","then","ignoreError","BulkLoadPayload","constructor","bulkLoad","rows","iterator","Symbol","asyncIterator","first","next","err","Promise","reject","read","resolve","undefined","pending","close","return","closing","options","columns","isTextType","map","c","type","name","buffer","WritableTrackingBuffer","writeBuffer","getColMetaData","done","closed","result","row","isArray","Array","i","length","validate","objName","collation","parameter","scale","precision","generateParameterLength","chunk","generateParameterData","CHUNK_SIZE","getBuffers","consume","createDoneToken","toString","indent","exports"],"sources":["../src/bulk-load-payload.ts"],"sourcesContent":["import BulkLoad from './bulk-load';\nimport WritableTrackingBuffer from './tracking-buffer/writable-tracking-buffer';\nimport { TYPE as TOKEN_TYPE } from './token/token';\n\nexport type Row = unknown[] | { [colName: string]: unknown };\n\nconst rowTokenBuffer = Buffer.from([ TOKEN_TYPE.ROW ]);\nconst textPointerAndTimestampBuffer = Buffer.from([\n // TextPointer length\n 0x10,\n\n // TextPointer\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n // Timestamp\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n]);\nconst textPointerNullBuffer = Buffer.from([0x00]);\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return value != null && typeof (value as PromiseLike<T>).then === 'function';\n}\n\nfunction ignoreError() {}\n\n/**\n * The TDS byte stream of a bulk load: COLMETADATA, a ROW token per row,\n * and a DONE token at the end, serialized from the bulk load's row source.\n *\n * The payload owns the row source's iterator the way a `for await` loop\n * would: it requests the first row as soon as it is created, so that a\n * stream source is observed from the moment it is handed over, and it\n * closes the source through the iterator's `return()` whenever the bulk\n * load does not run to completion, whether the rows were being read\n * ([[Symbol.asyncIterator]]) or never got to be ([[close]]).\n *\n * Rows are written into one buffer that lives for the whole bulk load.\n * Its contents are yielded once it holds a chunk's worth\n * (`WritableTrackingBuffer.CHUNK_SIZE`), checked after every cell, and at\n * the end. Rows from a synchronous source are serialized without an\n * event-loop turn in between; rows from an asynchronous source are awaited\n * one at a time.\n *\n * @private\n */\nexport class BulkLoadPayload implements AsyncIterable<Buffer> {\n declare bulkLoad: BulkLoad;\n declare iterator: Iterator<Row> | AsyncIterator<Row>;\n declare pending: IteratorResult<Row> | Promise<IteratorResult<Row>> | undefined;\n\n constructor(bulkLoad: BulkLoad, rows: Iterable<Row> | AsyncIterable<Row>) {\n this.bulkLoad = bulkLoad;\n\n this.iterator = typeof (rows as Partial<AsyncIterable<Row>>)[Symbol.asyncIterator] === 'function' ?\n (rows as AsyncIterable<Row>)[Symbol.asyncIterator]() :\n (rows as Iterable<Row>)[Symbol.iterator]();\n\n // The first row is requested now, before the `INSERT BULK` statement\n // has gone out. For a stream source this is what attaches its\n // iterator's listeners: an error it emits while the statement is in\n // flight is kept and reported on the next read, instead of being an\n // unhandled `'error'` event. The read is awaited when the rows are\n // serialized; its rejection is not unhandled until then, and neither\n // is a synchronous source's throw, which reaches the bulk load's\n // callback the same way.\n let first: IteratorResult<Row> | Promise<IteratorResult<Row>>;\n try {\n first = this.iterator.next();\n } catch (err) {\n first = Promise.reject(err);\n }\n\n if (isPromiseLike(first)) {\n const read = Promise.resolve(first);\n read.then(undefined, ignoreError);\n this.pending = read;\n } else {\n this.pending = first;\n }\n }\n\n /**\n * Closes the row source of a bulk load whose rows will not be read:\n * the `INSERT BULK` statement was rejected, the bulk load was canceled,\n * or the connection is no longer logged in. Best effort: a read still\n * pending in the source cannot be interrupted, and a close that fails\n * has nothing left to report to.\n */\n close() {\n const iterator = this.iterator;\n if (typeof iterator.return !== 'function') {\n return;\n }\n\n try {\n const closing = iterator.return();\n if (isPromiseLike(closing)) {\n Promise.resolve(closing).then(undefined, ignoreError);\n }\n } catch {\n // Nothing left to report to.\n }\n }\n\n async *[Symbol.asyncIterator]() {\n const bulkLoad = this.bulkLoad;\n const options = bulkLoad.options;\n const columns = bulkLoad.columns;\n const iterator = this.iterator;\n\n // Per column, not per cell: a text type's value is written behind a\n // text pointer and timestamp, or as a null pointer.\n const isTextType = columns.map((c) => c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText');\n\n const buffer = new WritableTrackingBuffer();\n buffer.writeBuffer(bulkLoad.getColMetaData());\n\n let done = false;\n let closed = false;\n try {\n while (true) {\n let result = this.pending ?? iterator.next();\n this.pending = undefined;\n if (isPromiseLike(result)) {\n result = await result;\n }\n\n if (result.done) {\n done = true;\n break;\n }\n\n // A row given as a promise is settled first, as `Readable.from`\n // settled it before handing it on.\n let row = result.value;\n if (isPromiseLike(row)) {\n row = await row;\n }\n\n buffer.writeBuffer(rowTokenBuffer);\n\n const isArray = Array.isArray(row);\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i];\n const value = c.type.validate(isArray ? (row as unknown[])[i] : (row as { [colName: string]: unknown })[c.objName], c.collation);\n\n const parameter = {\n length: c.length,\n scale: c.scale,\n precision: c.precision,\n value: value\n };\n\n if (isTextType[i] && value == null) {\n buffer.writeBuffer(textPointerNullBuffer);\n } else {\n if (isTextType[i]) {\n buffer.writeBuffer(textPointerAndTimestampBuffer);\n }\n\n buffer.writeBuffer(c.type.generateParameterLength(parameter, options));\n for (const chunk of c.type.generateParameterData(parameter, options)) {\n buffer.writeBuffer(chunk);\n }\n }\n\n // Checked after every cell, not only after every row, so that a\n // wide row of large cells goes downstream as it is serialized.\n if (buffer.length >= WritableTrackingBuffer.CHUNK_SIZE) {\n for (const chunk of buffer.getBuffers()) {\n yield chunk;\n }\n buffer.consume(buffer.length);\n }\n }\n }\n } catch (err) {\n // A failed row closes the source as a `for await` would. A close\n // that fails must not replace the row error the bulk load is\n // failing with.\n closed = true;\n if (typeof iterator.return === 'function') {\n try {\n await iterator.return();\n } catch {\n // The row error is what surfaces.\n }\n }\n throw err;\n } finally {\n // The consumer stopped pulling (e.g. because the bulk load was\n // canceled): close the source as a `for await` would.\n if (!done && !closed && typeof iterator.return === 'function') {\n await iterator.return();\n }\n }\n\n buffer.writeBuffer(bulkLoad.createDoneToken());\n for (const chunk of buffer.getBuffers()) {\n yield chunk;\n }\n buffer.consume(buffer.length);\n }\n\n toString(indent = '') {\n return indent + ('BulkLoad');\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,5 @@
1
1
  import { EventEmitter } from 'events';
2
2
  import Connection, { type InternalConnectionOptions } from './connection';
3
- import { Transform } from 'stream';
4
3
  import { type DataType, type Parameter } from './data-type';
5
4
  import { Collation } from './collation';
6
5
  /**
@@ -73,38 +72,6 @@ interface ColumnOptions {
73
72
  */
74
73
  nullable?: boolean;
75
74
  }
76
- declare class RowTransform extends Transform {
77
- /**
78
- * @private
79
- */
80
- columnMetadataWritten: boolean;
81
- /**
82
- * @private
83
- */
84
- bulkLoad: BulkLoad;
85
- /**
86
- * @private
87
- */
88
- mainOptions: BulkLoad['options'];
89
- /**
90
- * @private
91
- */
92
- columns: BulkLoad['columns'];
93
- /**
94
- * @private
95
- */
96
- constructor(bulkLoad: BulkLoad);
97
- /**
98
- * @private
99
- */
100
- _transform(row: Array<unknown> | {
101
- [colName: string]: unknown;
102
- }, _encoding: string, callback: (error?: Error) => void): void;
103
- /**
104
- * @private
105
- */
106
- _flush(callback: () => void): void;
107
- }
108
75
  /**
109
76
  * A BulkLoad instance is used to perform a bulk insert.
110
77
  *
@@ -148,7 +115,6 @@ declare class BulkLoad extends EventEmitter {
148
115
  /**
149
116
  * @private
150
117
  */
151
- streamingMode: boolean;
152
118
  /**
153
119
  * @private
154
120
  */
@@ -175,14 +141,6 @@ declare class BulkLoad extends EventEmitter {
175
141
  columnsByName: {
176
142
  [name: string]: Column;
177
143
  };
178
- /**
179
- * @private
180
- */
181
- firstRowWritten: boolean;
182
- /**
183
- * @private
184
- */
185
- rowToPacketTransform: RowTransform;
186
144
  /**
187
145
  * @private
188
146
  */