tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
149 lines (145 loc) • 17.5 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;
// 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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