tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
144 lines (141 loc) • 17 kB
JavaScript
"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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