UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

144 lines (141 loc) • 17 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; 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 (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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGxwU3RyZWFtIiwicmVxdWlyZSIsIk1BWCIsIlVOS05PV05fUExQX0xFTiIsIkJ1ZmZlciIsImZyb20iLCJQTFBfVEVSTUlOQVRPUiIsIk5VTExfTEVOR1RIIiwiTUFYX05VTExfTEVOR1RIIiwiTk9fQ09MTEFUSU9OIiwiYWxsb2MiLCJlbmNvZGVVY3MyIiwiY2h1bmsiLCJUeXBlRXJyb3IiLCJOVmFyQ2hhciIsImlkIiwidHlwZSIsIm5hbWUiLCJtYXhpbXVtTGVuZ3RoIiwiZGVjbGFyYXRpb24iLCJwYXJhbWV0ZXIiLCJ2YWx1ZSIsImlzQXN5bmNJdGVyYWJsZSIsImxlbmd0aCIsInRvU3RyaW5nIiwib3V0cHV0IiwicmVzb2x2ZUxlbmd0aCIsImlzQnVmZmVyIiwid3JpdGVUeXBlSW5mbyIsImJ1ZmZlciIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwiY29sbGF0aW9uIiwid3JpdGVCdWZmZXIiLCJ0b0J1ZmZlciIsInN1YmFycmF5Iiwid3JpdGVWYWx1ZSIsIndyaXRlUGxwU3RyZWFtIiwid3JpdGVVSW50MzJMRSIsIndyaXRlU3RyaW5nIiwidmFsaWRhdGUiLCJyZXNvbHZlIiwiZGF0YSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9udmFyY2hhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIERhdGFUeXBlLCB0eXBlIFBhcmFtZXRlckRhdGEgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgaXNBc3luY0l0ZXJhYmxlLCB3cml0ZVBscFN0cmVhbSB9IGZyb20gJy4vcGxwLXN0cmVhbSc7XG5cbmNvbnN0IE1BWCA9ICgxIDw8IDE2KSAtIDE7XG5jb25zdCBVTktOT1dOX1BMUF9MRU4gPSBCdWZmZXIuZnJvbShbMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pO1xuY29uc3QgUExQX1RFUk1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pO1xuXG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweEZGLCAweEZGXSk7XG5jb25zdCBNQVhfTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRl0pO1xuY29uc3QgTk9fQ09MTEFUSU9OID0gQnVmZmVyLmFsbG9jKDUpO1xuXG5mdW5jdGlvbiBlbmNvZGVVY3MyKGNodW5rOiB1bmtub3duKTogQnVmZmVyIHtcbiAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0cmluZy4nKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmssICd1Y3MyJyk7XG59XG5cbmNvbnN0IE5WYXJDaGFyOiB7IG1heGltdW1MZW5ndGg6IG51bWJlciB9ICYgRGF0YVR5cGUgPSB7XG4gIGlkOiAweEU3LFxuICB0eXBlOiAnTlZBUkNIQVInLFxuICBuYW1lOiAnTlZhckNoYXInLFxuICBtYXhpbXVtTGVuZ3RoOiA0MDAwLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBhbnk7IC8vIFRlbXBvcmFyeSBzb2x1dGlvbi4gUmVtb3ZlICdhbnknIGxhdGVyLlxuXG4gICAgaWYgKGlzQXN5bmNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAnbnZhcmNoYXIobWF4KSc7XG4gICAgfVxuXG4gICAgbGV0IGxlbmd0aDtcbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCkge1xuICAgICAgbGVuZ3RoID0gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxlbmd0aCA9IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhcGFyYW1ldGVyLm91dHB1dCkge1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChsZW5ndGggPD0gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJ252YXJjaGFyKCcgKyBsZW5ndGggKyAnKSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnbnZhcmNoYXIobWF4KSc7XG4gICAgfVxuICB9LFxuXG4gIHJlc29sdmVMZW5ndGg6IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIGFueTsgLy8gVGVtcG9yYXJ5IHNvbHV0aW9uLiBSZW1vdmUgJ2FueScgbGF0ZXIuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGggIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlci5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gKHZhbHVlLmxlbmd0aCAvIDIpIHx8IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggfHwgMTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMubWF4aW11bUxlbmd0aDtcbiAgICB9XG4gIH0sXG5cbiAgd3JpdGVUeXBlSW5mbyhidWZmZXIsIHBhcmFtZXRlcikge1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMuaWQpO1xuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUocGFyYW1ldGVyLmxlbmd0aCEgKiAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUoTUFYKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1ldGVyLmNvbGxhdGlvbikge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKHBhcmFtZXRlci5jb2xsYXRpb24udG9CdWZmZXIoKS5zdWJhcnJheSgwLCA1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihOT19DT0xMQVRJT04pO1xuICAgIH1cbiAgfSxcblxuICB3cml0ZVZhbHVlKGJ1ZmZlciwgcGFyYW1ldGVyKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIocGFyYW1ldGVyLmxlbmd0aCEgPD0gdGhpcy5tYXhpbXVtTGVuZ3RoID8gTlVMTF9MRU5HVEggOiBNQVhfTlVMTF9MRU5HVEgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlYWQgZnJvbSBpdHMgc291cmNlIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHdyaXR0ZW47IGByZXNvbHZlYCBkZWNsYXJlZFxuICAgIC8vIGl0IGFzIGBudmFyY2hhcihtYXgpYC5cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKHBhcmFtZXRlci52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB3cml0ZVBscFN0cmVhbShidWZmZXIsIHBhcmFtZXRlci52YWx1ZSwgZW5jb2RlVWNzMik7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIgPyBwYXJhbWV0ZXIudmFsdWUgOiBwYXJhbWV0ZXIudmFsdWUudG9TdHJpbmcoKTtcbiAgICBjb25zdCBsZW5ndGggPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUubGVuZ3RoICogMiA6IHZhbHVlLmxlbmd0aDtcblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKGxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihVTktOT1dOX1BMUF9MRU4pO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIoUExQX1RFUk1JTkFUT1IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBidWZmZXIud3JpdGVVSW50MzJMRShsZW5ndGgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWZmZXIud3JpdGVTdHJpbmcodmFsdWUsICd1Y3MyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghID4gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIoUExQX1RFUk1JTkFUT1IpO1xuICAgIH1cbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBudWxsIHwgc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RyaW5nLicpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICByZXNvbHZlKHBhcmFtZXRlciwgY29sbGF0aW9uKSB7XG4gICAgaWYgKGlzQXN5bmNJdGVyYWJsZShwYXJhbWV0ZXIudmFsdWUpKSB7XG4gICAgICAvLyBSZWFkIGZyb20gaXRzIHNvdXJjZSB3aGlsZSB0aGUgcmVxdWVzdCBpcyB3cml0dGVuLCBhbmQgc2VudCBhc1xuICAgICAgLy8gYG52YXJjaGFyKG1heClgIHNpbmNlIGl0cyBsZW5ndGggaXMgbm90IGtub3duIHVwIGZyb250LlxuICAgICAgY29uc3QgZGF0YTogUGFyYW1ldGVyRGF0YSA9IHsgdmFsdWU6IHBhcmFtZXRlci52YWx1ZSwgbGVuZ3RoOiBNQVggfTtcbiAgICAgIGlmIChjb2xsYXRpb24pIHtcbiAgICAgICAgZGF0YS5jb2xsYXRpb24gPSBjb2xsYXRpb247XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsaWRhdGUocGFyYW1ldGVyLnZhbHVlLCBjb2xsYXRpb24pO1xuICAgIGNvbnN0IGRhdGE6IFBhcmFtZXRlckRhdGEgPSB7IHZhbHVlIH07XG4gICAgZGF0YS5sZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoICE9IG51bGwgPyBwYXJhbWV0ZXIubGVuZ3RoIDogdGhpcy5yZXNvbHZlTGVuZ3RoISh7IC4uLnBhcmFtZXRlciwgdmFsdWUgfSk7XG4gICAgaWYgKGNvbGxhdGlvbikge1xuICAgICAgZGF0YS5jb2xsYXRpb24gPSBjb2xsYXRpb247XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOVmFyQ2hhcjtcbm1vZHVsZS5leHBvcnRzID0gTlZhckNoYXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUVBLE1BQU1DLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUN6QixNQUFNQyxlQUFlLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JGLE1BQU1DLGNBQWMsR0FBR0YsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUU1RCxNQUFNRSxX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