UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

146 lines (142 loc) • 17.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _iconvLite = _interopRequireDefault(require("iconv-lite")); var _plpStream = require("./plp-stream"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const MAX = (1 << 16) - 1; 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.from([0x00, 0x00, 0x00, 0x00, 0x00]); // Each chunk is encoded on its own, as `Writable.prototype.write` would // encode it: a source must not split a UTF-16 surrogate pair across two // chunks (see `Request.addParameter`). function encoderFor(codepage) { return chunk => { if (typeof chunk !== 'string') { throw new TypeError('Invalid string.'); } return _iconvLite.default.encode(chunk, codepage); }; } const VarChar = { id: 0xA7, type: 'BIGVARCHR', name: 'VarChar', maximumLength: 8000, declaration: function (parameter) { const value = parameter.value; if ((0, _plpStream.isAsyncIterable)(value)) { return 'varchar(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 'varchar(' + length + ')'; } else { return 'varchar(max)'; } }, resolveLength: function (parameter) { const value = parameter.value; if (parameter.length != null) { return parameter.length; } else if (value != null) { return value.length || 1; } else { return this.maximumLength; } }, validate: function (value, collation) { if (value == null) { return null; } if (typeof value !== 'string') { throw new TypeError('Invalid string.'); } if (!collation) { throw new Error('No collation was set by the server for the current connection.'); } if (!collation.codepage) { throw new Error('The collation set by the server has no associated encoding.'); } return _iconvLite.default.encode(value, collation.codepage); }, resolve(parameter, collation) { if ((0, _plpStream.isAsyncIterable)(parameter.value)) { // Read from its source while the request is written, and sent as // `varchar(max)` since its length is not known up front. The chunks // are encoded as they arrive, so the collation is checked here, as // `validate` does for an in-memory value, rather than once the // request is already being written. if (!collation) { throw new Error('No collation was set by the server for the current connection.'); } if (!collation.codepage) { throw new Error('The collation set by the server has no associated encoding.'); } return { value: parameter.value, length: MAX, collation }; } 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; }, writeTypeInfo(buffer, parameter) { buffer.writeUInt8(this.id); if (parameter.length <= this.maximumLength) { buffer.writeUInt16LE(parameter.length); } 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 `varchar(max)` and checked the collation. if ((0, _plpStream.isAsyncIterable)(parameter.value)) { return (0, _plpStream.writePlpStream)(buffer, parameter.value, encoderFor(parameter.collation.codepage)); } // `validate` encoded the value. const value = parameter.value; if (parameter.length <= this.maximumLength) { buffer.writeUInt16LE(value.length); buffer.writeBuffer(value); } else { (0, _plpStream.writePlpValue)(buffer, value); } } }; var _default = exports.default = VarChar; module.exports = VarChar; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaWNvbnZMaXRlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGxwU3RyZWFtIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTUFYIiwiTlVMTF9MRU5HVEgiLCJCdWZmZXIiLCJmcm9tIiwiTUFYX05VTExfTEVOR1RIIiwiTk9fQ09MTEFUSU9OIiwiZW5jb2RlckZvciIsImNvZGVwYWdlIiwiY2h1bmsiLCJUeXBlRXJyb3IiLCJpY29udiIsImVuY29kZSIsIlZhckNoYXIiLCJpZCIsInR5cGUiLCJuYW1lIiwibWF4aW11bUxlbmd0aCIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwidmFsdWUiLCJpc0FzeW5jSXRlcmFibGUiLCJsZW5ndGgiLCJvdXRwdXQiLCJyZXNvbHZlTGVuZ3RoIiwidmFsaWRhdGUiLCJjb2xsYXRpb24iLCJFcnJvciIsInJlc29sdmUiLCJkYXRhIiwid3JpdGVUeXBlSW5mbyIsImJ1ZmZlciIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVCdWZmZXIiLCJ0b0J1ZmZlciIsInN1YmFycmF5Iiwid3JpdGVWYWx1ZSIsIndyaXRlUGxwU3RyZWFtIiwid3JpdGVQbHBWYWx1ZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3ZhcmNoYXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGljb252IGZyb20gJ2ljb252LWxpdGUnO1xuXG5pbXBvcnQgeyB0eXBlIERhdGFUeXBlLCB0eXBlIFBhcmFtZXRlckRhdGEgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgaXNBc3luY0l0ZXJhYmxlLCB3cml0ZVBscFN0cmVhbSwgd3JpdGVQbHBWYWx1ZSB9IGZyb20gJy4vcGxwLXN0cmVhbSc7XG5cbmNvbnN0IE1BWCA9ICgxIDw8IDE2KSAtIDE7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkZdKTtcbmNvbnN0IE1BWF9OVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGXSk7XG5jb25zdCBOT19DT0xMQVRJT04gPSBCdWZmZXIuZnJvbShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pO1xuXG4vLyBFYWNoIGNodW5rIGlzIGVuY29kZWQgb24gaXRzIG93biwgYXMgYFdyaXRhYmxlLnByb3RvdHlwZS53cml0ZWAgd291bGRcbi8vIGVuY29kZSBpdDogYSBzb3VyY2UgbXVzdCBub3Qgc3BsaXQgYSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIgYWNyb3NzIHR3b1xuLy8gY2h1bmtzIChzZWUgYFJlcXVlc3QuYWRkUGFyYW1ldGVyYCkuXG5mdW5jdGlvbiBlbmNvZGVyRm9yKGNvZGVwYWdlOiBzdHJpbmcpOiAoY2h1bms6IHVua25vd24pID0+IEJ1ZmZlciB7XG4gIHJldHVybiAoY2h1bmspID0+IHtcbiAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiBpY29udi5lbmNvZGUoY2h1bmssIGNvZGVwYWdlKTtcbiAgfTtcbn1cblxuY29uc3QgVmFyQ2hhcjogeyBtYXhpbXVtTGVuZ3RoOiBudW1iZXIgfSAmIERhdGFUeXBlID0ge1xuICBpZDogMHhBNyxcbiAgdHlwZTogJ0JJR1ZBUkNIUicsXG4gIG5hbWU6ICdWYXJDaGFyJyxcbiAgbWF4aW11bUxlbmd0aDogODAwMCxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgQnVmZmVyIHwgbnVsbDtcblxuICAgIGlmIChpc0FzeW5jSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3ZhcmNoYXIobWF4KSc7XG4gICAgfVxuXG4gICAgbGV0IGxlbmd0aDtcbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCkge1xuICAgICAgbGVuZ3RoID0gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCB8fCAxO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwgJiYgIXBhcmFtZXRlci5vdXRwdXQpIHtcbiAgICAgIGxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRoaXMubWF4aW11bUxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAobGVuZ3RoIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgcmV0dXJuICd2YXJjaGFyKCcgKyBsZW5ndGggKyAnKSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAndmFyY2hhcihtYXgpJztcbiAgICB9XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgQnVmZmVyIHwgbnVsbDtcblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCB8fCAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUsIGNvbGxhdGlvbik6IEJ1ZmZlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJpbmcuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2xsYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sbGF0aW9uIHdhcyBzZXQgYnkgdGhlIHNlcnZlciBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbGxhdGlvbi5jb2RlcGFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29sbGF0aW9uIHNldCBieSB0aGUgc2VydmVyIGhhcyBubyBhc3NvY2lhdGVkIGVuY29kaW5nLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpY29udi5lbmNvZGUodmFsdWUsIGNvbGxhdGlvbi5jb2RlcGFnZSk7XG4gIH0sXG5cbiAgcmVzb2x2ZShwYXJhbWV0ZXIsIGNvbGxhdGlvbikge1xuICAgIGlmIChpc0FzeW5jSXRlcmFibGUocGFyYW1ldGVyLnZhbHVlKSkge1xuICAgICAgLy8gUmVhZCBmcm9tIGl0cyBzb3VyY2Ugd2hpbGUgdGhlIHJlcXVlc3QgaXMgd3JpdHRlbiwgYW5kIHNlbnQgYXNcbiAgICAgIC8vIGB2YXJjaGFyKG1heClgIHNpbmNlIGl0cyBsZW5ndGggaXMgbm90IGtub3duIHVwIGZyb250LiBUaGUgY2h1bmtzXG4gICAgICAvLyBhcmUgZW5jb2RlZCBhcyB0aGV5IGFycml2ZSwgc28gdGhlIGNvbGxhdGlvbiBpcyBjaGVja2VkIGhlcmUsIGFzXG4gICAgICAvLyBgdmFsaWRhdGVgIGRvZXMgZm9yIGFuIGluLW1lbW9yeSB2YWx1ZSwgcmF0aGVyIHRoYW4gb25jZSB0aGVcbiAgICAgIC8vIHJlcXVlc3QgaXMgYWxyZWFkeSBiZWluZyB3cml0dGVuLlxuICAgICAgaWYgKCFjb2xsYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb2xsYXRpb24gd2FzIHNldCBieSB0aGUgc2VydmVyIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbGxhdGlvbi5jb2RlcGFnZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjb2xsYXRpb24gc2V0IGJ5IHRoZSBzZXJ2ZXIgaGFzIG5vIGFzc29jaWF0ZWQgZW5jb2RpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHZhbHVlOiBwYXJhbWV0ZXIudmFsdWUsIGxlbmd0aDogTUFYLCBjb2xsYXRpb24gfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsaWRhdGUocGFyYW1ldGVyLnZhbHVlLCBjb2xsYXRpb24pO1xuICAgIGNvbnN0IGRhdGE6IFBhcmFtZXRlckRhdGEgPSB7IHZhbHVlIH07XG4gICAgZGF0YS5sZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoICE9IG51bGwgPyBwYXJhbWV0ZXIubGVuZ3RoIDogdGhpcy5yZXNvbHZlTGVuZ3RoISh7IC4uLnBhcmFtZXRlciwgdmFsdWUgfSk7XG4gICAgaWYgKGNvbGxhdGlvbikge1xuICAgICAgZGF0YS5jb2xsYXRpb24gPSBjb2xsYXRpb247XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9LFxuXG4gIHdyaXRlVHlwZUluZm8oYnVmZmVyLCBwYXJhbWV0ZXIpIHtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlkKTtcblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKHBhcmFtZXRlci5sZW5ndGghKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUoTUFYKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1ldGVyLmNvbGxhdGlvbikge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKHBhcmFtZXRlci5jb2xsYXRpb24udG9CdWZmZXIoKS5zdWJhcnJheSgwLCA1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihOT19DT0xMQVRJT04pO1xuICAgIH1cbiAgfSxcblxuICB3cml0ZVZhbHVlKGJ1ZmZlciwgcGFyYW1ldGVyKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBidWZmZXIud3JpdGVCdWZmZXIocGFyYW1ldGVyLmxlbmd0aCEgPD0gdGhpcy5tYXhpbXVtTGVuZ3RoID8gTlVMTF9MRU5HVEggOiBNQVhfTlVMTF9MRU5HVEgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlYWQgZnJvbSBpdHMgc291cmNlIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHdyaXR0ZW47IGByZXNvbHZlYCBkZWNsYXJlZFxuICAgIC8vIGl0IGFzIGB2YXJjaGFyKG1heClgIGFuZCBjaGVja2VkIHRoZSBjb2xsYXRpb24uXG4gICAgaWYgKGlzQXN5bmNJdGVyYWJsZShwYXJhbWV0ZXIudmFsdWUpKSB7XG4gICAgICByZXR1cm4gd3JpdGVQbHBTdHJlYW0oYnVmZmVyLCBwYXJhbWV0ZXIudmFsdWUsIGVuY29kZXJGb3IocGFyYW1ldGVyLmNvbGxhdGlvbiEuY29kZXBhZ2UhKSk7XG4gICAgfVxuXG4gICAgLy8gYHZhbGlkYXRlYCBlbmNvZGVkIHRoZSB2YWx1ZS5cbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBCdWZmZXI7XG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUodmFsdWUubGVuZ3RoKTtcbiAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlUGxwVmFsdWUoYnVmZmVyLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWYXJDaGFyO1xubW9kdWxlLmV4cG9ydHMgPSBWYXJDaGFyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFHQSxJQUFBQyxVQUFBLEdBQUFE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