tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
132 lines (129 loc) • 15.7 kB
JavaScript
;
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;
// 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 (!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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGxwU3RyZWFtIiwicmVxdWlyZSIsIk1BWCIsIlVOS05PV05fUExQX0xFTiIsIkJ1ZmZlciIsImZyb20iLCJQTFBfVEVSTUlOQVRPUiIsIk5VTExfTEVOR1RIIiwiTUFYX05VTExfTEVOR1RIIiwicmVxdWlyZUJ1ZmZlciIsImNodW5rIiwiaXNCdWZmZXIiLCJUeXBlRXJyb3IiLCJWYXJCaW5hcnkiLCJpZCIsInR5cGUiLCJuYW1lIiwibWF4aW11bUxlbmd0aCIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwidmFsdWUiLCJpc0FzeW5jSXRlcmFibGUiLCJsZW5ndGgiLCJvdXRwdXQiLCJyZXNvbHZlTGVuZ3RoIiwid3JpdGVUeXBlSW5mbyIsImJ1ZmZlciIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVWYWx1ZSIsIndyaXRlQnVmZmVyIiwid3JpdGVQbHBTdHJlYW0iLCJ0b1N0cmluZyIsImlzUGxwIiwid3JpdGVVSW50MzJMRSIsIndyaXRlU3RyaW5nIiwidmFsaWRhdGUiLCJyZXNvbHZlIiwidW5kZWZpbmVkIiwiZGF0YSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy92YXJiaW5hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBEYXRhVHlwZSwgdHlwZSBQYXJhbWV0ZXJEYXRhIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCB7IGlzQXN5bmNJdGVyYWJsZSwgd3JpdGVQbHBTdHJlYW0gfSBmcm9tICcuL3BscC1zdHJlYW0nO1xuXG5jb25zdCBNQVggPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgVU5LTk9XTl9QTFBfTEVOID0gQnVmZmVyLmZyb20oWzB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKTtcbmNvbnN0IFBMUF9URVJNSU5BVE9SID0gQnVmZmVyLmZyb20oWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTtcblxuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRl0pO1xuY29uc3QgTUFYX05VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZdKTtcblxuZnVuY3Rpb24gcmVxdWlyZUJ1ZmZlcihjaHVuazogdW5rbm93bik6IEJ1ZmZlciB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYnVmZmVyLicpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuY29uc3QgVmFyQmluYXJ5OiB7IG1heGltdW1MZW5ndGg6IG51bWJlciB9ICYgRGF0YVR5cGUgPSB7XG4gIGlkOiAweEE1LFxuICB0eXBlOiAnQklHVkFSQklOJyxcbiAgbmFtZTogJ1ZhckJpbmFyeScsXG4gIG1heGltdW1MZW5ndGg6IDgwMDAsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIGFueTsgLy8gVGVtcG9yYXJ5IHNvbHV0aW9uLiBSZW1vdmUgJ2FueScgbGF0ZXIuXG4gICAgaWYgKGlzQXN5bmNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAndmFyYmluYXJ5KG1heCknO1xuICAgIH1cblxuICAgIGxldCBsZW5ndGg7XG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGgpIHtcbiAgICAgIGxlbmd0aCA9IHBhcmFtZXRlci5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGggfHwgMTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsICYmICFwYXJhbWV0ZXIub3V0cHV0KSB7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIHJldHVybiAndmFyYmluYXJ5KCcgKyBsZW5ndGggKyAnKSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAndmFyYmluYXJ5KG1heCknO1xuICAgIH1cbiAgfSxcblxuICByZXNvbHZlTGVuZ3RoOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBhbnk7IC8vIFRlbXBvcmFyeSBzb2x1dGlvbi4gUmVtb3ZlICdhbnknIGxhdGVyLlxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMubWF4aW11bUxlbmd0aDtcbiAgICB9XG4gIH0sXG5cbiAgd3JpdGVUeXBlSW5mbyhidWZmZXIsIHBhcmFtZXRlcikge1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMuaWQpO1xuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUocGFyYW1ldGVyLmxlbmd0aCEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShNQVgpO1xuICAgIH1cbiAgfSxcblxuICB3cml0ZVZhbHVlKGJ1ZmZlciwgcGFyYW1ldGVyKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIocGFyYW1ldGVyLmxlbmd0aCEgPD0gdGhpcy5tYXhpbXVtTGVuZ3RoID8gTlVMTF9MRU5HVEggOiBNQVhfTlVMTF9MRU5HVEgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlYWQgZnJvbSBpdHMgc291cmNlIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHdyaXR0ZW47IGByZXNvbHZlYCBkZWNsYXJlZFxuICAgIC8vIGl0IGFzIGB2YXJiaW5hcnkobWF4KWAuXG4gICAgaWYgKGlzQXN5bmNJdGVyYWJsZShwYXJhbWV0ZXIudmFsdWUpKSB7XG4gICAgICByZXR1cm4gd3JpdGVQbHBTdHJlYW0oYnVmZmVyLCBwYXJhbWV0ZXIudmFsdWUsIHJlcXVpcmVCdWZmZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmlzQnVmZmVyKHBhcmFtZXRlci52YWx1ZSkgPyBwYXJhbWV0ZXIudmFsdWUgOiBwYXJhbWV0ZXIudmFsdWUudG9TdHJpbmcoKTtcbiAgICBjb25zdCBsZW5ndGggPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUubGVuZ3RoICogMiA6IHZhbHVlLmxlbmd0aDtcblxuICAgIC8vIFNlbnQgYXMgYG1heGAgKFBMUCkgdW5sZXNzIHRoZSBsZW5ndGggaXMgd2l0aGluIHRoZSBtYXhpbXVtLCBhc1xuICAgIC8vIGB3cml0ZVR5cGVJbmZvYCBkZWNsYXJlcyBpdCwgc28gYWxzbyB3aGVuIGl0IGlzIGB1bmRlZmluZWRgIChhIFRWUFxuICAgIC8vIGNvbHVtbiB3aXRob3V0IGEgbGVuZ3RoKSBvciBgTmFOYCwgd2hpY2ggZmFpbCBgPmAgYXMgd2VsbCBhcyBgPD1gLlxuICAgIGNvbnN0IGlzUGxwID0gIShwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpO1xuXG4gICAgaWYgKCFpc1BscCkge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUobGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKFVOS05PV05fUExQX0xFTik7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihQTFBfVEVSTUlOQVRPUik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQzMkxFKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVN0cmluZyh2YWx1ZSwgJ3VjczInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQbHApIHtcbiAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihQTFBfVEVSTUlOQVRPUik7XG4gICAgfVxuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IEJ1ZmZlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJ1ZmZlci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuXG4gIHJlc29sdmUocGFyYW1ldGVyKSB7XG4gICAgaWYgKGlzQXN5bmNJdGVyYWJsZShwYXJhbWV0ZXIudmFsdWUpKSB7XG4gICAgICAvLyBUaGUgdmFsdWUgaXMgcmVhZCBmcm9tIGl0cyBzb3VyY2Ugd2hpbGUgdGhlIHJlcXVlc3QgaXMgd3JpdHRlbi4gSXRzXG4gICAgICAvLyBsZW5ndGggaXMgbm90IGtub3duIHVwIGZyb250LCBzbyBpdCBpcyBzZW50IGFzIGB2YXJiaW5hcnkobWF4KWA7XG4gICAgICAvLyBhbiBleHBsaWNpdGx5IHNwZWNpZmllZCBgbGVuZ3RoYCBpcyBkZWxpYmVyYXRlbHkgb3ZlcnJpZGRlbi5cbiAgICAgIHJldHVybiB7IHZhbHVlOiBwYXJhbWV0ZXIudmFsdWUsIGxlbmd0aDogTUFYIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbGlkYXRlKHBhcmFtZXRlci52YWx1ZSwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBkYXRhOiBQYXJhbWV0ZXJEYXRhID0geyB2YWx1ZSB9O1xuICAgIGRhdGEubGVuZ3RoID0gcGFyYW1ldGVyLmxlbmd0aCAhPSBudWxsID8gcGFyYW1ldGVyLmxlbmd0aCA6IHRoaXMucmVzb2x2ZUxlbmd0aCEoeyAuLi5wYXJhbWV0ZXIsIHZhbHVlIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWYXJCaW5hcnk7XG5tb2R1bGUuZXhwb3J0cyA9IFZhckJpbmFyeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBRUEsTUFBTUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ3pCLE1BQU1DLGVBQWUsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckYsTUFBTUMsY0FBYyxHQUFHRixNQUFNLENBQUNDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRTVELE1BQU1FLFdBQVcsR0FBR0gsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsTUFBTUcsZUFBZSxHQUFHSixNQUFNLENBQUNDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVyRixTQUFTSSxhQUFhQSxDQUFDQyxLQUFjLEVBQVU7RUFDN0MsSUFBSSxDQUFDTixNQUFNLENBQUNPLFFBQVEsQ0FBQ0QsS0FBSyxD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