UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

127 lines (125 loc) • 15.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _plpStream = require("./plp-stream"); const MAX = (1 << 16) - 1; const UNKNOWN_PLP_LEN = Buffer.from([0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]); const PLP_TERMINATOR = Buffer.from([0x00, 0x00, 0x00, 0x00]); const NULL_LENGTH = Buffer.from([0xFF, 0xFF]); const MAX_NULL_LENGTH = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]); function requireBuffer(chunk) { if (!Buffer.isBuffer(chunk)) { throw new TypeError('Invalid buffer.'); } return chunk; } const VarBinary = { id: 0xA5, type: 'BIGVARBIN', name: 'VarBinary', maximumLength: 8000, declaration: function (parameter) { const value = parameter.value; // Temporary solution. Remove 'any' later. if ((0, _plpStream.isAsyncIterable)(value)) { return 'varbinary(max)'; } let length; if (parameter.length) { length = parameter.length; } else if (value != null) { length = value.length || 1; } else if (value === null && !parameter.output) { length = 1; } else { length = this.maximumLength; } if (length <= this.maximumLength) { return 'varbinary(' + length + ')'; } else { return 'varbinary(max)'; } }, resolveLength: function (parameter) { const value = parameter.value; // Temporary solution. Remove 'any' later. if (parameter.length != null) { return parameter.length; } else if (value != null) { return value.length; } else { return this.maximumLength; } }, writeTypeInfo(buffer, parameter) { buffer.writeUInt8(this.id); if (parameter.length <= this.maximumLength) { buffer.writeUInt16LE(parameter.length); } else { buffer.writeUInt16LE(MAX); } }, writeValue(buffer, parameter) { if (parameter.value == null) { buffer.writeBuffer(parameter.length <= this.maximumLength ? NULL_LENGTH : MAX_NULL_LENGTH); return; } // Read from its source while the request is written; `resolve` declared // it as `varbinary(max)`. if ((0, _plpStream.isAsyncIterable)(parameter.value)) { return (0, _plpStream.writePlpStream)(buffer, parameter.value, requireBuffer); } const value = Buffer.isBuffer(parameter.value) ? parameter.value : parameter.value.toString(); const length = typeof value === 'string' ? value.length * 2 : value.length; if (parameter.length <= this.maximumLength) { buffer.writeUInt16LE(length); } else { buffer.writeBuffer(UNKNOWN_PLP_LEN); if (length === 0) { buffer.writeBuffer(PLP_TERMINATOR); return; } buffer.writeUInt32LE(length); } if (typeof value === 'string') { buffer.writeString(value, 'ucs2'); } else { buffer.writeBuffer(value); } if (parameter.length > this.maximumLength) { buffer.writeBuffer(PLP_TERMINATOR); } }, validate: function (value) { if (value == null) { return null; } if (!Buffer.isBuffer(value)) { throw new TypeError('Invalid buffer.'); } return value; }, resolve(parameter) { if ((0, _plpStream.isAsyncIterable)(parameter.value)) { // The value is read from its source while the request is written. Its // length is not known up front, so it is sent as `varbinary(max)`; // an explicitly specified `length` is deliberately overridden. return { value: parameter.value, length: MAX }; } const value = this.validate(parameter.value, undefined); const data = { value }; data.length = parameter.length != null ? parameter.length : this.resolveLength({ ...parameter, value }); return data; } }; var _default = exports.default = VarBinary; module.exports = VarBinary; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGxwU3RyZWFtIiwicmVxdWlyZSIsIk1BWCIsIlVOS05PV05fUExQX0xFTiIsIkJ1ZmZlciIsImZyb20iLCJQTFBfVEVSTUlOQVRPUiIsIk5VTExfTEVOR1RIIiwiTUFYX05VTExfTEVOR1RIIiwicmVxdWlyZUJ1ZmZlciIsImNodW5rIiwiaXNCdWZmZXIiLCJUeXBlRXJyb3IiLCJWYXJCaW5hcnkiLCJpZCIsInR5cGUiLCJuYW1lIiwibWF4aW11bUxlbmd0aCIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwidmFsdWUiLCJpc0FzeW5jSXRlcmFibGUiLCJsZW5ndGgiLCJvdXRwdXQiLCJyZXNvbHZlTGVuZ3RoIiwid3JpdGVUeXBlSW5mbyIsImJ1ZmZlciIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVWYWx1ZSIsIndyaXRlQnVmZmVyIiwid3JpdGVQbHBTdHJlYW0iLCJ0b1N0cmluZyIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVN0cmluZyIsInZhbGlkYXRlIiwicmVzb2x2ZSIsInVuZGVmaW5lZCIsImRhdGEiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0IiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvdmFyYmluYXJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRGF0YVR5cGUsIHR5cGUgUGFyYW1ldGVyRGF0YSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBpc0FzeW5jSXRlcmFibGUsIHdyaXRlUGxwU3RyZWFtIH0gZnJvbSAnLi9wbHAtc3RyZWFtJztcblxuY29uc3QgTUFYID0gKDEgPDwgMTYpIC0gMTtcbmNvbnN0IFVOS05PV05fUExQX0xFTiA9IEJ1ZmZlci5mcm9tKFsweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSk7XG5jb25zdCBQTFBfVEVSTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweDAwLCAweDAwXSk7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkZdKTtcbmNvbnN0IE1BWF9OVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGXSk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVCdWZmZXIoY2h1bms6IHVua25vd24pOiBCdWZmZXIge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJ1ZmZlci4nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbmNvbnN0IFZhckJpbmFyeTogeyBtYXhpbXVtTGVuZ3RoOiBudW1iZXIgfSAmIERhdGFUeXBlID0ge1xuICBpZDogMHhBNSxcbiAgdHlwZTogJ0JJR1ZBUkJJTicsXG4gIG5hbWU6ICdWYXJCaW5hcnknLFxuICBtYXhpbXVtTGVuZ3RoOiA4MDAwLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBhbnk7IC8vIFRlbXBvcmFyeSBzb2x1dGlvbi4gUmVtb3ZlICdhbnknIGxhdGVyLlxuICAgIGlmIChpc0FzeW5jSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3ZhcmJpbmFyeShtYXgpJztcbiAgICB9XG5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhcGFyYW1ldGVyLm91dHB1dCkge1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChsZW5ndGggPD0gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJ3ZhcmJpbmFyeSgnICsgbGVuZ3RoICsgJyknO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3ZhcmJpbmFyeShtYXgpJztcbiAgICB9XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuICB9LFxuXG4gIHdyaXRlVHlwZUluZm8oYnVmZmVyLCBwYXJhbWV0ZXIpIHtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlkKTtcblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKHBhcmFtZXRlci5sZW5ndGghKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUoTUFYKTtcbiAgICB9XG4gIH0sXG5cbiAgd3JpdGVWYWx1ZShidWZmZXIsIHBhcmFtZXRlcikge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCA/IE5VTExfTEVOR1RIIDogTUFYX05VTExfTEVOR1RIKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWFkIGZyb20gaXRzIHNvdXJjZSB3aGlsZSB0aGUgcmVxdWVzdCBpcyB3cml0dGVuOyBgcmVzb2x2ZWAgZGVjbGFyZWRcbiAgICAvLyBpdCBhcyBgdmFyYmluYXJ5KG1heClgLlxuICAgIGlmIChpc0FzeW5jSXRlcmFibGUocGFyYW1ldGVyLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHdyaXRlUGxwU3RyZWFtKGJ1ZmZlciwgcGFyYW1ldGVyLnZhbHVlLCByZXF1aXJlQnVmZmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IEJ1ZmZlci5pc0J1ZmZlcihwYXJhbWV0ZXIudmFsdWUpID8gcGFyYW1ldGVyLnZhbHVlIDogcGFyYW1ldGVyLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgbGVuZ3RoID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLmxlbmd0aCAqIDIgOiB2YWx1ZS5sZW5ndGg7XG5cbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCEgPD0gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShsZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIoVU5LTk9XTl9QTFBfTEVOKTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKFBMUF9URVJNSU5BVE9SKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUobGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmZmVyLndyaXRlU3RyaW5nKHZhbHVlLCAndWNzMicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA+IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKFBMUF9URVJNSU5BVE9SKTtcbiAgICB9XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogQnVmZmVyIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYnVmZmVyLicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgcmVzb2x2ZShwYXJhbWV0ZXIpIHtcbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKHBhcmFtZXRlci52YWx1ZSkpIHtcbiAgICAgIC8vIFRoZSB2YWx1ZSBpcyByZWFkIGZyb20gaXRzIHNvdXJjZSB3aGlsZSB0aGUgcmVxdWVzdCBpcyB3cml0dGVuLiBJdHNcbiAgICAgIC8vIGxlbmd0aCBpcyBub3Qga25vd24gdXAgZnJvbnQsIHNvIGl0IGlzIHNlbnQgYXMgYHZhcmJpbmFyeShtYXgpYDtcbiAgICAgIC8vIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGBsZW5ndGhgIGlzIGRlbGliZXJhdGVseSBvdmVycmlkZGVuLlxuICAgICAgcmV0dXJuIHsgdmFsdWU6IHBhcmFtZXRlci52YWx1ZSwgbGVuZ3RoOiBNQVggfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsaWRhdGUocGFyYW1ldGVyLnZhbHVlLCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRhdGE6IFBhcmFtZXRlckRhdGEgPSB7IHZhbHVlIH07XG4gICAgZGF0YS5sZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoICE9IG51bGwgPyBwYXJhbWV0ZXIubGVuZ3RoIDogdGhpcy5yZXNvbHZlTGVuZ3RoISh7IC4uLnBhcmFtZXRlciwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn07XG5c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