UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

149 lines (145 loc) • 17.5 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]); const NO_COLLATION = Buffer.alloc(5); function encodeUcs2(chunk) { if (typeof chunk !== 'string') { throw new TypeError('Invalid string.'); } return Buffer.from(chunk, 'ucs2'); } const NVarChar = { id: 0xE7, type: 'NVARCHAR', name: 'NVarChar', maximumLength: 4000, declaration: function (parameter) { const value = parameter.value; // Temporary solution. Remove 'any' later. if ((0, _plpStream.isAsyncIterable)(value)) { return 'nvarchar(max)'; } let length; if (parameter.length) { length = parameter.length; } else if (value != null) { length = value.toString().length || 1; } else if (value === null && !parameter.output) { length = 1; } else { length = this.maximumLength; } if (length <= this.maximumLength) { return 'nvarchar(' + length + ')'; } else { return 'nvarchar(max)'; } }, resolveLength: function (parameter) { const value = parameter.value; // Temporary solution. Remove 'any' later. if (parameter.length != null) { return parameter.length; } else if (value != null) { if (Buffer.isBuffer(value)) { return value.length / 2 || 1; } else { return value.toString().length || 1; } } else { return this.maximumLength; } }, writeTypeInfo(buffer, parameter) { buffer.writeUInt8(this.id); if (parameter.length <= this.maximumLength) { buffer.writeUInt16LE(parameter.length * 2); } else { buffer.writeUInt16LE(MAX); } if (parameter.collation) { buffer.writeBuffer(parameter.collation.toBuffer().subarray(0, 5)); } else { buffer.writeBuffer(NO_COLLATION); } }, 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 `nvarchar(max)`. if ((0, _plpStream.isAsyncIterable)(parameter.value)) { return (0, _plpStream.writePlpStream)(buffer, parameter.value, encodeUcs2); } const value = parameter.value instanceof Buffer ? parameter.value : parameter.value.toString(); const length = typeof value === 'string' ? value.length * 2 : value.length; // Sent as `max` (PLP) unless the length is within the maximum, as // `writeTypeInfo` declares it, so also when it is `undefined` (a TVP // column without a length) or `NaN`, which fail `>` as well as `<=`. const isPlp = !(parameter.length <= this.maximumLength); if (!isPlp) { 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 (isPlp) { buffer.writeBuffer(PLP_TERMINATOR); } }, validate: function (value) { if (value == null) { return null; } if (typeof value !== 'string') { throw new TypeError('Invalid string.'); } return value; }, resolve(parameter, collation) { if ((0, _plpStream.isAsyncIterable)(parameter.value)) { // Read from its source while the request is written, and sent as // `nvarchar(max)` since its length is not known up front. const data = { value: parameter.value, length: MAX }; if (collation) { data.collation = collation; } return data; } const value = this.validate(parameter.value, collation); const data = { value }; data.length = parameter.length != null ? parameter.length : this.resolveLength({ ...parameter, value }); if (collation) { data.collation = collation; } return data; } }; var _default = exports.default = NVarChar; module.exports = NVarChar; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGxwU3RyZWFtIiwicmVxdWlyZSIsIk1BWCIsIlVOS05PV05fUExQX0xFTiIsIkJ1ZmZlciIsImZyb20iLCJQTFBfVEVSTUlOQVRPUiIsIk5VTExfTEVOR1RIIiwiTUFYX05VTExfTEVOR1RIIiwiTk9fQ09MTEFUSU9OIiwiYWxsb2MiLCJlbmNvZGVVY3MyIiwiY2h1bmsiLCJUeXBlRXJyb3IiLCJOVmFyQ2hhciIsImlkIiwidHlwZSIsIm5hbWUiLCJtYXhpbXVtTGVuZ3RoIiwiZGVjbGFyYXRpb24iLCJwYXJhbWV0ZXIiLCJ2YWx1ZSIsImlzQXN5bmNJdGVyYWJsZSIsImxlbmd0aCIsInRvU3RyaW5nIiwib3V0cHV0IiwicmVzb2x2ZUxlbmd0aCIsImlzQnVmZmVyIiwid3JpdGVUeXBlSW5mbyIsImJ1ZmZlciIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwiY29sbGF0aW9uIiwid3JpdGVCdWZmZXIiLCJ0b0J1ZmZlciIsInN1YmFycmF5Iiwid3JpdGVWYWx1ZSIsIndyaXRlUGxwU3RyZWFtIiwiaXNQbHAiLCJ3cml0ZVVJbnQzMkxFIiwid3JpdGVTdHJpbmciLCJ2YWxpZGF0ZSIsInJlc29sdmUiLCJkYXRhIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL252YXJjaGFyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRGF0YVR5cGUsIHR5cGUgUGFyYW1ldGVyRGF0YSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBpc0FzeW5jSXRlcmFibGUsIHdyaXRlUGxwU3RyZWFtIH0gZnJvbSAnLi9wbHAtc3RyZWFtJztcblxuY29uc3QgTUFYID0gKDEgPDwgMTYpIC0gMTtcbmNvbnN0IFVOS05PV05fUExQX0xFTiA9IEJ1ZmZlci5mcm9tKFsweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSk7XG5jb25zdCBQTFBfVEVSTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweDAwLCAweDAwXSk7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkZdKTtcbmNvbnN0IE1BWF9OVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGXSk7XG5jb25zdCBOT19DT0xMQVRJT04gPSBCdWZmZXIuYWxsb2MoNSk7XG5cbmZ1bmN0aW9uIGVuY29kZVVjczIoY2h1bms6IHVua25vd24pOiBCdWZmZXIge1xuICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RyaW5nLicpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuaywgJ3VjczInKTtcbn1cblxuY29uc3QgTlZhckNoYXI6IHsgbWF4aW11bUxlbmd0aDogbnVtYmVyIH0gJiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4RTcsXG4gIHR5cGU6ICdOVkFSQ0hBUicsXG4gIG5hbWU6ICdOVmFyQ2hhcicsXG4gIG1heGltdW1MZW5ndGg6IDQwMDAsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIGFueTsgLy8gVGVtcG9yYXJ5IHNvbHV0aW9uLiBSZW1vdmUgJ2FueScgbGF0ZXIuXG5cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuICdudmFyY2hhcihtYXgpJztcbiAgICB9XG5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggfHwgMTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsICYmICFwYXJhbWV0ZXIub3V0cHV0KSB7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIHJldHVybiAnbnZhcmNoYXIoJyArIGxlbmd0aCArICcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdudmFyY2hhcihtYXgpJztcbiAgICB9XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUubGVuZ3RoIC8gMikgfHwgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCB8fCAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cbiAgfSxcblxuICB3cml0ZVR5cGVJbmZvKGJ1ZmZlciwgcGFyYW1ldGVyKSB7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5pZCk7XG5cbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCEgPD0gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShwYXJhbWV0ZXIubGVuZ3RoISAqIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShNQVgpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXIuY29sbGF0aW9uKSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIocGFyYW1ldGVyLmNvbGxhdGlvbi50b0J1ZmZlcigpLnN1YmFycmF5KDAsIDUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKE5PX0NPTExBVElPTik7XG4gICAgfVxuICB9LFxuXG4gIHdyaXRlVmFsdWUoYnVmZmVyLCBwYXJhbWV0ZXIpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGggPyBOVUxMX0xFTkdUSCA6IE1BWF9OVUxMX0xFTkdUSCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVhZCBmcm9tIGl0cyBzb3VyY2Ugd2hpbGUgdGhlIHJlcXVlc3QgaXMgd3JpdHRlbjsgYHJlc29sdmVgIGRlY2xhcmVkXG4gICAgLy8gaXQgYXMgYG52YXJjaGFyKG1heClgLlxuICAgIGlmIChpc0FzeW5jSXRlcmFibGUocGFyYW1ldGVyLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHdyaXRlUGxwU3RyZWFtKGJ1ZmZlciwgcGFyYW1ldGVyLnZhbHVlLCBlbmNvZGVVY3MyKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlciA/IHBhcmFtZXRlci52YWx1ZSA6IHBhcmFtZXRlci52YWx1ZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGxlbmd0aCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5sZW5ndGggKiAyIDogdmFsdWUubGVuZ3RoO1xuXG4gICAgLy8gU2VudCBhcyBgbWF4YCAoUExQKSB1bmxlc3MgdGhlIGxlbmd0aCBpcyB3aXRoaW4gdGhlIG1heGltdW0sIGFzXG4gICAgLy8gYHdyaXRlVHlwZUluZm9gIGRlY2xhcmVzIGl0LCBzbyBhbHNvIHdoZW4gaXQgaXMgYHVuZGVmaW5lZGAgKGEgVFZQXG4gICAgLy8gY29sdW1uIHdpdGhvdXQgYSBsZW5ndGgpIG9yIGBOYU5gLCB3aGljaCBmYWlsIGA+YCBhcyB3ZWxsIGFzIGA8PWAuXG4gICAgY29uc3QgaXNQbHAgPSAhKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCk7XG5cbiAgICBpZiAoIWlzUGxwKSB7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShsZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIoVU5LTk9XTl9QTFBfTEVOKTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKFBMUF9URVJNSU5BVE9SKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUobGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmZmVyLndyaXRlU3RyaW5nKHZhbHVlLCAndWNzMicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChpc1BscCkge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKFBMUF9URVJNSU5BVE9SKTtcbiAgICB9XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVsbCB8IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0cmluZy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgcmVzb2x2ZShwYXJhbWV0ZXIsIGNvbGxhdGlvbikge1xuICAgIGlmIChpc0FzeW5jSXRlcmFibGUocGFyYW1ldGVyLnZhbHVlKSkge1xuICAgICAgLy8gUmVhZCBmcm9tIGl0cyBzb3VyY2Ugd2hpbGUgdGhlIHJlcXVlc3QgaXMgd3JpdHRlbiwgYW5kIHNlbnQgYXNcbiAgICAgIC8vIGBudmFyY2hhcihtYXgpYCBzaW5jZSBpdHMgbGVuZ3RoIGlzIG5vdCBrbm93biB1cCBmcm9udC5cbiAgICAgIGNvbnN0IGRhdGE6IFBhcmFtZXRlckRhdGEgPSB7IHZhbHVlOiBwYXJhbWV0ZXIudmFsdWUsIGxlbmd0aDogTUFYIH07XG4gICAgICBpZiAoY29sbGF0aW9uKSB7XG4gICAgICAgIGRhdGEuY29sbGF0aW9uID0gY29sbGF0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbGlkYXRlKHBhcmFtZXRlci52YWx1ZSwgY29sbGF0aW9uKTtcbiAgICBjb25zdCBkYXRhOiBQYXJhbWV0ZXJEYXRhID0geyB2YWx1ZSB9O1xuICAgIGRhdGEubGVuZ3RoID0gcGFyYW1ldGVyLmxlbmd0aCAhPSBudWxsID8gcGFyYW1ldGVyLmxlbmd0aCA6IHRoaXMucmVzb2x2ZUxlbmd0aCEoeyAuLi5wYXJhbWV0ZXIsIHZhbHVlIH0pO1xuICAgIGlmIChjb2xsYXRpb24pIHtcbiAgICAgIGRhdGEuY29sbGF0aW9uID0gY29sbGF0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTlZhckNoYXI7XG5tb2R1bGUuZXhwb3J0cyA9IE5WYXJDaGFyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFFQSxNQUFNQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDekIsTUFBTUMs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