tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
120 lines (115 loc) • 15.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));
var _allHeaders = require("./all-headers");
var _dataType = require("./data-type");
var _errors = require("./errors");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// const OPTION = {
// WITH_RECOMPILE: 0x01,
// NO_METADATA: 0x02,
// REUSE_METADATA: 0x04
// };
const STATUS = {
BY_REF_VALUE: 0x01,
DEFAULT_VALUE: 0x02
};
/*
s2.2.6.5
*/
class RpcRequestPayload {
constructor(procedure, parameters, txnDescriptor, options) {
this.procedure = procedure;
this.parameters = parameters;
this.options = options;
this.txnDescriptor = txnDescriptor;
}
/**
* The request is written into one buffer whose contents are yielded once
* it holds a chunk's worth (`WritableTrackingBuffer.CHUNK_SIZE`), checked
* after every parameter, and at the end. A large value written by
* reference stays by reference, so this costs no extra copy. A parameter
* whose value is read from a source while the request is written has the
* rest of that write returned by `writeValue`, and is driven here so that
* the buffer is handed on whenever the type says it is worth it.
*
* Chunks are yielded one by one rather than through `yield*`: an array
* iterator has no `throw` method, so an error a consumer throws into this
* generator during such a delegation would surface as a TypeError instead.
*/
async *[Symbol.asyncIterator]() {
const buffer = new _writableTrackingBuffer.default();
this.writeHeader(buffer);
const parametersLength = this.parameters.length;
for (let i = 0; i < parametersLength; i++) {
const parameter = this.parameters[i];
this.writeParameterHeader(buffer, parameter);
let rest;
try {
parameter.type.writeTypeInfo(buffer, parameter.data, this.options);
rest = parameter.type.writeValue(buffer, parameter.data, this.options);
} catch (error) {
throw new _errors.InputError(`Input parameter '${parameter.name}' could not be validated`, {
cause: error
});
}
// A value read from a source while the request is written: the type
// yields whenever the buffer is worth handing on.
if (rest !== undefined) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
for await (const _ of (0, _dataType.writeRest)(rest, error => new _errors.InputError(`Input parameter '${parameter.name}' could not be validated`, {
cause: error
}))) {
for (const chunk of buffer.getBuffers()) {
yield chunk;
}
buffer.consume(buffer.length);
}
}
if (buffer.length >= _writableTrackingBuffer.default.CHUNK_SIZE) {
for (const chunk of buffer.getBuffers()) {
yield chunk;
}
buffer.consume(buffer.length);
}
}
for (const chunk of buffer.getBuffers()) {
yield chunk;
}
}
toString(indent = '') {
return indent + ('RPC Request - ' + this.procedure);
}
writeHeader(buffer) {
if (this.options.tdsVersion >= '7_2') {
const outstandingRequestCount = 1;
(0, _allHeaders.writeToTrackingBuffer)(buffer, this.txnDescriptor, outstandingRequestCount);
}
if (typeof this.procedure === 'string') {
buffer.writeUsVarchar(this.procedure, 'ucs2');
} else {
buffer.writeUShort(0xFFFF);
buffer.writeUShort(this.procedure);
}
const optionFlags = 0;
buffer.writeUInt16LE(optionFlags);
}
writeParameterHeader(buffer, parameter) {
if (parameter.name) {
buffer.writeBVarchar('@' + parameter.name, 'ucs2');
} else {
buffer.writeBVarchar('', 'ucs2');
}
let statusFlags = 0;
if (parameter.output) {
statusFlags |= STATUS.BY_REF_VALUE;
}
buffer.writeUInt8(statusFlags);
}
}
var _default = exports.default = RpcRequestPayload;
module.exports = RpcRequestPayload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2FsbEhlYWRlcnMiLCJfZGF0YVR5cGUiLCJfZXJyb3JzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiU1RBVFVTIiwiQllfUkVGX1ZBTFVFIiwiREVGQVVMVF9WQUxVRSIsIlJwY1JlcXVlc3RQYXlsb2FkIiwiY29uc3RydWN0b3IiLCJwcm9jZWR1cmUiLCJwYXJhbWV0ZXJzIiwidHhuRGVzY3JpcHRvciIsIm9wdGlvbnMiLCJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwiYnVmZmVyIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIndyaXRlSGVhZGVyIiwicGFyYW1ldGVyc0xlbmd0aCIsImxlbmd0aCIsImkiLCJwYXJhbWV0ZXIiLCJ3cml0ZVBhcmFtZXRlckhlYWRlciIsInJlc3QiLCJ0eXBlIiwid3JpdGVUeXBlSW5mbyIsImRhdGEiLCJ3cml0ZVZhbHVlIiwiZXJyb3IiLCJJbnB1dEVycm9yIiwibmFtZSIsImNhdXNlIiwidW5kZWZpbmVkIiwiXyIsIndyaXRlUmVzdCIsImNodW5rIiwiZ2V0QnVmZmVycyIsImNvbnN1bWUiLCJDSFVOS19TSVpFIiwidG9TdHJpbmciLCJpbmRlbnQiLCJ0ZHNWZXJzaW9uIiwib3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQiLCJ3cml0ZVRvVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVVzVmFyY2hhciIsIndyaXRlVVNob3J0Iiwib3B0aW9uRmxhZ3MiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVCVmFyY2hhciIsInN0YXR1c0ZsYWdzIiwib3V0cHV0Iiwid3JpdGVVSW50OCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9ycGNyZXF1ZXN0LXBheWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCB7IHdyaXRlVG9UcmFja2luZ0J1ZmZlciB9IGZyb20gJy4vYWxsLWhlYWRlcnMnO1xuaW1wb3J0IHsgdHlwZSBSZXNvbHZlZFBhcmFtZXRlciwgd3JpdGVSZXN0IH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgdHlwZSBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbmltcG9ydCB7IElucHV0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIGNvbnN0IE9QVElPTiA9IHtcbi8vICAgV0lUSF9SRUNPTVBJTEU6IDB4MDEsXG4vLyAgIE5PX01FVEFEQVRBOiAweDAyLFxuLy8gICBSRVVTRV9NRVRBREFUQTogMHgwNFxuLy8gfTtcblxuY29uc3QgU1RBVFVTID0ge1xuICBCWV9SRUZfVkFMVUU6IDB4MDEsXG4gIERFRkFVTFRfVkFMVUU6IDB4MDJcbn07XG5cbi8qXG4gIHMyLjIuNi41XG4gKi9cbmNsYXNzIFJwY1JlcXVlc3RQYXlsb2FkIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHtcbiAgZGVjbGFyZSBwcm9jZWR1cmU6IHN0cmluZyB8IG51bWJlcjtcbiAgZGVjbGFyZSBwYXJhbWV0ZXJzOiBSZXNvbHZlZFBhcmFtZXRlcltdO1xuXG4gIGRlY2xhcmUgb3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucztcbiAgZGVjbGFyZSB0eG5EZXNjcmlwdG9yOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IocHJvY2VkdXJlOiBzdHJpbmcgfCBudW1iZXIsIHBhcmFtZXRlcnM6IFJlc29sdmVkUGFyYW1ldGVyW10sIHR4bkRlc2NyaXB0b3I6IEJ1ZmZlciwgb3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIHRoaXMucHJvY2VkdXJlID0gcHJvY2VkdXJlO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnR4bkRlc2NyaXB0b3IgPSB0eG5EZXNjcmlwdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGlzIHdyaXR0ZW4gaW50byBvbmUgYnVmZmVyIHdob3NlIGNvbnRlbnRzIGFyZSB5aWVsZGVkIG9uY2VcbiAgICogaXQgaG9sZHMgYSBjaHVuaydzIHdvcnRoIChgV3JpdGFibGVUcmFja2luZ0J1ZmZlci5DSFVOS19TSVpFYCksIGNoZWNrZWRcbiAgICogYWZ0ZXIgZXZlcnkgcGFyYW1ldGVyLCBhbmQgYXQgdGhlIGVuZC4gQSBsYXJnZSB2YWx1ZSB3cml0dGVuIGJ5XG4gICAqIHJlZmVyZW5jZSBzdGF5cyBieSByZWZlcmVuY2UsIHNvIHRoaXMgY29zdHMgbm8gZXh0cmEgY29weS4gQSBwYXJhbWV0ZXJcbiAgICogd2hvc2UgdmFsdWUgaXMgcmVhZCBmcm9tIGEgc291cmNlIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHdyaXR0ZW4gaGFzIHRoZVxuICAgKiByZXN0IG9mIHRoYXQgd3JpdGUgcmV0dXJuZWQgYnkgYHdyaXRlVmFsdWVgLCBhbmQgaXMgZHJpdmVuIGhlcmUgc28gdGhhdFxuICAgKiB0aGUgYnVmZmVyIGlzIGhhbmRlZCBvbiB3aGVuZXZlciB0aGUgdHlwZSBzYXlzIGl0IGlzIHdvcnRoIGl0LlxuICAgKlxuICAgKiBDaHVua3MgYXJlIHlpZWxkZWQgb25lIGJ5IG9uZSByYXRoZXIgdGhhbiB0aHJvdWdoIGB5aWVsZCpgOiBhbiBhcnJheVxuICAgKiBpdGVyYXRvciBoYXMgbm8gYHRocm93YCBtZXRob2QsIHNvIGFuIGVycm9yIGEgY29uc3VtZXIgdGhyb3dzIGludG8gdGhpc1xuICAgKiBnZW5lcmF0b3IgZHVyaW5nIHN1Y2ggYSBkZWxlZ2F0aW9uIHdvdWxkIHN1cmZhY2UgYXMgYSBUeXBlRXJyb3IgaW5zdGVhZC5cbiAgICovXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG4gICAgdGhpcy53cml0ZUhlYWRlcihidWZmZXIpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyc0xlbmd0aCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVyc1tpXTtcbiAgICAgIHRoaXMud3JpdGVQYXJhbWV0ZXJIZWFkZXIoYnVmZmVyLCBwYXJhbWV0ZXIpO1xuXG4gICAgICBsZXQgcmVzdDogdm9pZCB8IEFzeW5jSXRlcmFibGU8dm9pZD47XG4gICAgICB0cnkge1xuICAgICAgICBwYXJhbWV0ZXIudHlwZS53cml0ZVR5cGVJbmZvKGJ1ZmZlciwgcGFyYW1ldGVyLmRhdGEsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHJlc3QgPSBwYXJhbWV0ZXIudHlwZS53cml0ZVZhbHVlKGJ1ZmZlciwgcGFyYW1ldGVyLmRhdGEsIHRoaXMub3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgSW5wdXRFcnJvcihgSW5wdXQgcGFyYW1ldGVyICcke3BhcmFtZXRlci5uYW1lfScgY291bGQgbm90IGJlIHZhbGlkYXRlZGAsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHZhbHVlIHJlYWQgZnJvbSBhIHNvdXJjZSB3aGlsZSB0aGUgcmVxdWVzdCBpcyB3cml0dGVuOiB0aGUgdHlwZVxuICAgICAgLy8geWllbGRzIHdoZW5ldmVyIHRoZSBidWZmZXIgaXMgd29ydGggaGFuZGluZyBvbi5cbiAgICAgIGlmIChyZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IF8gb2Ygd3JpdGVSZXN0KHJlc3QsIChlcnJvcikgPT4gbmV3IElucHV0RXJyb3IoYElucHV0IHBhcmFtZXRlciAnJHtwYXJhbWV0ZXIubmFtZX0nIGNvdWxkIG5vdCBiZSB2YWxpZGF0ZWRgLCB7IGNhdXNlOiBlcnJvciB9KSkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ1ZmZlci5nZXRCdWZmZXJzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIGNodW5rO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIuY29uc3VtZShidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+PSBXcml0YWJsZVRyYWNraW5nQnVmZmVyLkNIVU5LX1NJWkUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBidWZmZXIuZ2V0QnVmZmVycygpKSB7XG4gICAgICAgICAgeWllbGQgY2h1bms7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLmNvbnN1bWUoYnVmZmVyLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBidWZmZXIuZ2V0QnVmZmVycygpKSB7XG4gICAgICB5aWVsZCBjaHVuaztcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyhpbmRlbnQgPSAnJykge1xuICAgIHJldHVybiBpbmRlbnQgKyAoJ1JQQyBSZXF1ZXN0IC0gJyArIHRoaXMucHJvY2VkdXJlKTtcbiAgfVxuXG4gIHdyaXRlSGVhZGVyKGJ1ZmZlcjogV3JpdGFibGVUcmFja2luZ0J1ZmZlcikge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA+PSAnN18yJykge1xuICAgICAgY29uc3Qgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSAxO1xuICAgICAgd3JpdGVUb1RyYWNraW5nQnVmZmVyKGJ1ZmZlciwgdGhpcy50eG5EZXNjcmlwdG9yLCBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnByb2NlZHVyZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVzVmFyY2hhcih0aGlzLnByb2NlZHVyZSwgJ3VjczInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlVVNob3J0KDB4RkZGRik7XG4gICAgICBidWZmZXIud3JpdGVVU2hvcnQodGhpcy5wcm9jZWR1cmUpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbkZsYWdzID0gMDtcbiAgICBidWZmZXIud3JpdGVVSW50MTZMRShvcHRpb25GbGFncyk7XG4gIH1cblxuICB3cml0ZVBhcmFtZXRlckhlYWRlcihidWZmZXI6IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIsIHBhcmFtZXRlcjogUmVzb2x2ZWRQYXJhbWV0ZXIpIHtcbiAgICBpZiAocGFyYW1ldGVyLm5hbWUpIHtcbiAgICAgIGJ1ZmZlci53cml0ZUJWYXJjaGFyKCdAJyArIHBhcmFtZXRlci5uYW1lLCAndWNzMicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVCVmFyY2hhcignJywgJ3VjczInKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhdHVzRmxhZ3MgPSAwO1xuICAgIGlmIChwYXJhbWV0ZXIub3V0cHV0KSB7XG4gICAgICBzdGF0dXNGbGFncyB8PSBTVEFUVVMuQllfUkVGX1ZBTFVFO1xuICAgIH1cbiAgICBidWZmZXIud3JpdGVVSW50OChzdGF0dXNGbGFncyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUnBjUmVxdWVzdFBheWxvYWQ7XG5tb2R1bGUuZXhwb3J0cyA9IFJwY1JlcXVlc3RQYXlsb2FkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBQXNDLFNBQUFE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QyxDQUFDLEVBQUU7TUFDdkMsTUFBTUQsS0FBSztJQUNiO0VBQ0Y7RUFFQUksUUFBUUEsQ0FBQ0MsTUFBTSxHQUFHLEVBQUUsRUFBRTtJQUNwQixPQUFPQSxNQUFNLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDL0IsU0FBUyxDQUFDO0VBQ3JEO0VBRUFRLFdBQVdBLENBQUNGLE1BQThCLEVBQUU7SUFDMUMsSUFBSSxJQUFJLENBQUNILE9BQU8sQ0FBQzZCLFVBQVUsSUFBSSxLQUFLLEVBQUU7TUFDcEMsTUFBTUMsdUJBQXVCLEdBQUcsQ0FBQztNQUNqQyxJQUFBQyxpQ0FBcUIsRUFBQzVCLE1BQU0sRUFBRSxJQUFJLENBQUNKLGFBQWEsRUFBRStCLHVCQUF1QixDQUFDO0lBQzVFO0lBRUEsSUFBSSxPQUFPLElBQUksQ0FBQ2pDLFNBQVMsS0FBSyxRQUFRLEVBQUU7TUFDdENNLE1BQU0sQ0FBQzZCLGNBQWMsQ0FBQyxJQUFJLENBQUNuQyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQy9DLENBQUMsTUFBTTtNQUNMTSxNQUFNLENBQUM4QixXQUFXLENBQUMsTUFBTSxDQUFDO01BQzFCOUIsTUFBTSxDQUFDOEIsV0FBVyxDQUFDLElBQUksQ0FBQ3BDLFNBQVMsQ0FBQztJQUNwQztJQUVBLE1BQU1xQyxXQUFXLEdBQUcsQ0FBQztJQUNyQi9CLE1BQU0sQ0FBQ2dDLGFBQWEsQ0FBQ0QsV0FBVyxDQUFDO0VBQ25DO0VBRUF4QixvQkFBb0JBLENBQUNQLE1BQThCLEVBQUVNLFNBQTRCLEVBQUU7SUFDakYsSUFBSUEsU0FBUyxDQUFDUyxJQUFJLEVBQUU7TUFDbEJmLE1BQU0sQ0FBQ2lDLGFBQWEsQ0FBQyxHQUFHLEdBQUczQixTQUFTLENBQUNTLElBQUksRUFBRSxNQUFNLENBQUM7SUFDcEQsQ0FBQyxNQUFNO01BQ0xmLE1BQU0sQ0FBQ2lDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDO0lBQ2xDO0lBRUEsSUFBSUMsV0FBVyxHQUFHLENBQUM7SUFDbkIsSUFBSTVCLFNBQVMsQ0FBQzZCLE1BQU0sRUFBRTtNQUNwQkQsV0FBVyxJQUFJN0MsTUFBTSxDQUFDQyxZQUFZO0lBQ3BDO0lBQ0FVLE1BQU0sQ0FBQ29DLFVBQVUsQ0FBQ0YsV0FBVyxDQUFDO0VBQ2hDO0FBQ0Y7QUFBQyxJQUFBRyxRQUFBLEdBQUFDLE9BQUEsQ0FBQWxELE9BQUEsR0FFY0ksaUJBQWlCO0FBQ2hDK0MsTUFBTSxDQUFDRCxPQUFPLEdBQUc5QyxpQkFBaUIiLCJpZ25vcmVMaXN0IjpbXX0=