UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

111 lines (109 loc) • 13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ColMetadataTokenReader = void 0; var _metadataParser = require("../metadata-parser"); var _token = require("./token"); var _helpers = require("./helpers"); function readTableName(buf, offset, metadata, options) { if (!metadata.type.hasTableName) { return new _helpers.Result(undefined, offset); } if (options.tdsVersion < '7_2') { return (0, _helpers.readUsVarChar)(buf, offset); } let numberOfTableNameParts; ({ offset, value: numberOfTableNameParts } = (0, _helpers.readUInt8)(buf, offset)); const tableName = []; for (let i = 0; i < numberOfTableNameParts; i++) { let tableNamePart; ({ offset, value: tableNamePart } = (0, _helpers.readUsVarChar)(buf, offset)); tableName.push(tableNamePart); } return new _helpers.Result(tableName, offset); } function readColumnName(buf, offset, index, metadata, options) { let colName; ({ offset, value: colName } = (0, _helpers.readBVarChar)(buf, offset)); if (options.columnNameReplacer) { return new _helpers.Result(options.columnNameReplacer(colName, index, metadata), offset); } else if (options.camelCaseColumns) { return new _helpers.Result(colName.replace(/^[A-Z]/, function (s) { return s.toLowerCase(); }), offset); } else { return new _helpers.Result(colName, offset); } } function readColumn(buf, offset, options, index) { let metadata; ({ offset, value: metadata } = (0, _metadataParser.readMetadata)(buf, offset, options)); let tableName; ({ offset, value: tableName } = readTableName(buf, offset, metadata, options)); let colName; ({ offset, value: colName } = readColumnName(buf, offset, index, metadata, options)); return new _helpers.Result({ userType: metadata.userType, flags: metadata.flags, type: metadata.type, collation: metadata.collation, precision: metadata.precision, scale: metadata.scale, udtInfo: metadata.udtInfo, dataLength: metadata.dataLength, schema: metadata.schema, colName: colName, tableName: tableName }, offset); } /** * Reads a `COLMETADATA` token column by column, so that tokens describing many * columns are not parsed again from the start whenever they span chunks. */ class ColMetadataTokenReader { constructor() { this.columnCount = undefined; this.columns = []; } read(parser) { if (this.columnCount === undefined) { const { value, offset } = (0, _helpers.readUInt16LE)(parser.buffer, parser.position); parser.position = offset; this.columnCount = value; } while (this.columns.length < this.columnCount) { const { value, offset } = readColumn(parser.buffer, parser.position, parser.options, this.columns.length); parser.position = offset; this.columns.push(value); } parser.colMetadata = this.columns; return new _token.ColMetadataToken(this.columns); } } exports.ColMetadataTokenReader = ColMetadataTokenReader; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWV0YWRhdGFQYXJzZXIiLCJyZXF1aXJlIiwiX3Rva2VuIiwiX2hlbHBlcnMiLCJyZWFkVGFibGVOYW1lIiwiYnVmIiwib2Zmc2V0IiwibWV0YWRhdGEiLCJvcHRpb25zIiwidHlwZSIsImhhc1RhYmxlTmFtZSIsIlJlc3VsdCIsInVuZGVmaW5lZCIsInRkc1ZlcnNpb24iLCJyZWFkVXNWYXJDaGFyIiwibnVtYmVyT2ZUYWJsZU5hbWVQYXJ0cyIsInZhbHVlIiwicmVhZFVJbnQ4IiwidGFibGVOYW1lIiwiaSIsInRhYmxlTmFtZVBhcnQiLCJwdXNoIiwicmVhZENvbHVtbk5hbWUiLCJpbmRleCIsImNvbE5hbWUiLCJyZWFkQlZhckNoYXIiLCJjb2x1bW5OYW1lUmVwbGFjZXIiLCJjYW1lbENhc2VDb2x1bW5zIiwicmVwbGFjZSIsInMiLCJ0b0xvd2VyQ2FzZSIsInJlYWRDb2x1bW4iLCJyZWFkTWV0YWRhdGEiLCJ1c2VyVHlwZSIsImZsYWdzIiwiY29sbGF0aW9uIiwicHJlY2lzaW9uIiwic2NhbGUiLCJ1ZHRJbmZvIiwiZGF0YUxlbmd0aCIsInNjaGVtYSIsIkNvbE1ldGFkYXRhVG9rZW5SZWFkZXIiLCJjb25zdHJ1Y3RvciIsImNvbHVtbkNvdW50IiwiY29sdW1ucyIsInJlYWQiLCJwYXJzZXIiLCJyZWFkVUludDE2TEUiLCJidWZmZXIiLCJwb3NpdGlvbiIsImxlbmd0aCIsImNvbE1ldGFkYXRhIiwiQ29sTWV0YWRhdGFUb2tlbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRNZXRhZGF0YSwgdHlwZSBNZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhLXBhcnNlcic7XG5cbmltcG9ydCBQYXJzZXIsIHsgdHlwZSBQYXJzZXJPcHRpb25zLCB0eXBlIFRva2VuUmVhZGVyIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IENvbE1ldGFkYXRhVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcbmltcG9ydCB7IFJlc3VsdCwgcmVhZEJWYXJDaGFyLCByZWFkVUludDE2TEUsIHJlYWRVSW50OCwgcmVhZFVzVmFyQ2hhciB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uTWV0YWRhdGEgZXh0ZW5kcyBNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uJ3MgbmFtZeOAglxuICAgKi9cbiAgY29sTmFtZTogc3RyaW5nO1xuXG4gIHRhYmxlTmFtZT86IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFkVGFibGVOYW1lKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogUmVzdWx0PHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghbWV0YWRhdGEudHlwZS5oYXNUYWJsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh1bmRlZmluZWQsIG9mZnNldCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICByZXR1cm4gcmVhZFVzVmFyQ2hhcihidWYsIG9mZnNldCk7XG4gIH1cblxuICBsZXQgbnVtYmVyT2ZUYWJsZU5hbWVQYXJ0cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogbnVtYmVyT2ZUYWJsZU5hbWVQYXJ0cyB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgY29uc3QgdGFibGVOYW1lOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mVGFibGVOYW1lUGFydHM7IGkrKykge1xuICAgIGxldCB0YWJsZU5hbWVQYXJ0O1xuICAgICh7IG9mZnNldCwgdmFsdWU6IHRhYmxlTmFtZVBhcnQgfSA9IHJlYWRVc1ZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICAgIHRhYmxlTmFtZS5wdXNoKHRhYmxlTmFtZVBhcnQpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodGFibGVOYW1lLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkQ29sdW1uTmFtZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGluZGV4OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSwgb3B0aW9uczogUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgbGV0IGNvbE5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IGNvbE5hbWUgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIGlmIChvcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcikge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KG9wdGlvbnMuY29sdW1uTmFtZVJlcGxhY2VyKGNvbE5hbWUsIGluZGV4LCBtZXRhZGF0YSksIG9mZnNldCk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQoY29sTmFtZS5yZXBsYWNlKC9eW0EtWl0vLCBmdW5jdGlvbihzKSB7XG4gICAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpO1xuICAgIH0pLCBvZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KGNvbE5hbWUsIG9mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZENvbHVtbihidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGluZGV4OiBudW1iZXIpIHtcbiAgbGV0IG1ldGFkYXRhO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBtZXRhZGF0YSB9ID0gcmVhZE1ldGFkYXRhKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zKSk7XG5cbiAgbGV0IHRhYmxlTmFtZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdGFibGVOYW1lIH0gPSByZWFkVGFibGVOYW1lKGJ1Ziwgb2Zmc2V0LCBtZXRhZGF0YSwgb3B0aW9ucykpO1xuXG4gIGxldCBjb2xOYW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBjb2xOYW1lIH0gPSByZWFkQ29sdW1uTmFtZShidWYsIG9mZnNldCwgaW5kZXgsIG1ldGFkYXRhLCBvcHRpb25zKSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgIHVzZXJUeXBlOiBtZXRhZGF0YS51c2VyVHlwZSxcbiAgICBmbGFnczogbWV0YWRhdGEuZmxhZ3MsXG4gICAgdHlwZTogbWV0YWRhdGEudHlwZSxcbiAgICBjb2xsYXRpb246IG1ldGFkYXRhLmNvbGxhdGlvbixcbiAgICBwcmVjaXNpb246IG1ldGFkYXRhLnByZWNpc2lvbixcbiAgICBzY2FsZTogbWV0YWRhdGEuc2NhbGUsXG4gICAgdWR0SW5mbzogbWV0YWRhdGEudWR0SW5mbyxcbiAgICBkYXRhTGVuZ3RoOiBtZXRhZGF0YS5kYXRhTGVuZ3RoLFxuICAgIHNjaGVtYTogbWV0YWRhdGEuc2NoZW1hLFxuICAgIGNvbE5hbWU6IGNvbE5hbWUsXG4gICAgdGFibGVOYW1lOiB0YWJsZU5hbWVcbiAgfSwgb2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIGBDT0xNRVRBREFUQWAgdG9rZW4gY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCB0b2tlbnMgZGVzY3JpYmluZyBtYW55XG4gKiBjb2x1bW5zIGFyZSBub3QgcGFyc2VkIGFnYWluIGZyb20gdGhlIHN0YXJ0IHdoZW5ldmVyIHRoZXkgc3BhbiBjaHVua3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xNZXRhZGF0YVRva2VuUmVhZGVyIGltcGxlbWVudHMgVG9rZW5SZWFkZXIge1xuICBkZWNsYXJlIGNvbHVtbkNvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGRlY2xhcmUgY29sdW1uczogQ29sdW1uTWV0YWRhdGFbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICB9XG5cbiAgcmVhZChwYXJzZXI6IFBhcnNlcik6IENvbE1ldGFkYXRhVG9rZW4ge1xuICAgIGlmICh0aGlzLmNvbHVtbkNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZFVJbnQxNkxFKHBhcnNlci5idWZmZXIsIHBhcnNlci5wb3NpdGlvbik7XG4gICAgICBwYXJzZXIucG9zaXRpb24gPSBvZmZzZXQ7XG4gICAgICB0aGlzLmNvbHVtbkNvdW50ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMuY29sdW1ucy5sZW5ndGggPCB0aGlzLmNvbHVtbkNvdW50KSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRDb2x1bW4ocGFyc2VyLmJ1ZmZlciwgcGFyc2VyLnBvc2l0aW9uLCBwYXJzZXIub3B0aW9ucywgdGhpcy5jb2x1bW5zLmxlbmd0aCk7XG4gICAgICBwYXJzZXIucG9zaXRpb24gPSBvZmZzZXQ7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcGFyc2VyLmNvbE1ldGFkYXRhID0gdGhpcy5jb2x1bW5zO1xuICAgIHJldHVybiBuZXcgQ29sTWV0YWRhdGFUb2tlbih0aGlzLmNvbHVtbnMpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsT0FBQTtBQUdBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQVdBLFNBQVNHLGFBQWFBLENBQUNDLEdBQVcsRUFBRUMsTUFBYyxFQUFFQyxRQUFrQixFQUFFQyxPQUFzQixFQUF5QztFQUNySSxJQUFJLENBQUNELFFBQVEsQ0FBQ0UsSUFBSSxDQUFDQyxZQUFZLEVBQUU7SUFDL0IsT0FBTyxJQUFJQyxlQUFNLENBQUNDLFNBQVMsRUFBRU4sTUFBTSxDQUFDO0VBQ3RDO0VBRUEsSUFBSUUsT0FBTyxDQUFDSyxVQUFVLEdBQUcs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