tedious 20.2.2 → 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.
- package/lib/bulk-load-payload.d.ts +35 -3
- package/lib/bulk-load-payload.js +172 -7
- package/lib/bulk-load-payload.js.map +1 -1
- package/lib/bulk-load.d.ts +0 -42
- package/lib/bulk-load.js +1 -111
- package/lib/bulk-load.js.map +1 -1
- package/lib/connection.d.ts +34 -6
- package/lib/connection.js +44 -31
- package/lib/connection.js.map +1 -1
- package/package.json +1 -1
|
@@ -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:
|
|
5
|
-
|
|
6
|
-
|
|
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
|
}
|
package/lib/bulk-load-payload.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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":[]}
|
package/lib/bulk-load.d.ts
CHANGED
|
@@ -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
|
*/
|