UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

79 lines (73 loc) • 8.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decimalLength = decimalLength; exports.writeDecimal = writeDecimal; exports.writeDecimalTypeInfo = writeDecimalTypeInfo; const MASK_64 = (1n << 64n) - 1n; /** * The number of bytes the magnitude of a `decimal` or `numeric` value takes * at `precision`. */ function decimalLength(precision) { if (precision <= 9) { return 4; } else if (precision <= 19) { return 8; } else if (precision <= 28) { return 12; } else { return 16; } } /** * Writes the TYPE_INFO of a `decimal` or `numeric` column: the nullable type * id, the length of a value, and the precision and scale. */ function writeDecimalTypeInfo(buffer, id, precision, scale) { buffer.writeUInt8(id); buffer.writeUInt8(decimalLength(precision) + 1); buffer.writeUInt8(precision); buffer.writeUInt8(scale); } /** * Writes a validated `decimal` or `numeric` value: the length, the sign, * and the scaled magnitude as a little-endian unsigned integer spanning the * full width for the precision. `name` names the type in the error for a * value that does not fit. */ function writeDecimal(buffer, value, precision, scale, name) { if (value == null) { buffer.writeUInt8(0x00); return; } const dataLength = decimalLength(precision); // A BigInt holds magnitudes beyond 2^64 for high-precision columns. // See https://github.com/tediousjs/tedious/issues/1733 const magnitude = BigInt(Math.round(Math.abs(value * Math.pow(10, scale)))); // Throwing surfaces a catchable error to the caller instead of silently // truncating the magnitude. if (magnitude >= 1n << BigInt(8 * dataLength)) { throw new RangeError(`Value ${value} is out of range for ${name}(${precision}, ${scale}).`); } buffer.writeUInt8(dataLength + 1); buffer.writeUInt8(value < 0 ? 0 : 1); switch (dataLength) { case 4: buffer.writeUInt32LE(Number(magnitude)); break; case 8: buffer.writeBigUInt64LE(magnitude); break; case 12: buffer.writeBigUInt64LE(magnitude & MASK_64); buffer.writeUInt32LE(Number(magnitude >> 64n)); break; case 16: buffer.writeBigUInt64LE(magnitude & MASK_64); buffer.writeBigUInt64LE(magnitude >> 64n); break; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVNLXzY0IiwiZGVjaW1hbExlbmd0aCIsInByZWNpc2lvbiIsIndyaXRlRGVjaW1hbFR5cGVJbmZvIiwiYnVmZmVyIiwiaWQiLCJzY2FsZSIsIndyaXRlVUludDgiLCJ3cml0ZURlY2ltYWwiLCJ2YWx1ZSIsIm5hbWUiLCJkYXRhTGVuZ3RoIiwibWFnbml0dWRlIiwiQmlnSW50IiwiTWF0aCIsInJvdW5kIiwiYWJzIiwicG93IiwiUmFuZ2VFcnJvciIsIndyaXRlVUludDMyTEUiLCJOdW1iZXIiLCJ3cml0ZUJpZ1VJbnQ2NExFIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvZGVjaW1hbC1jb21tb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcblxuY29uc3QgTUFTS182NCA9ICgxbiA8PCA2NG4pIC0gMW47XG5cbi8qKlxuICogVGhlIG51bWJlciBvZiBieXRlcyB0aGUgbWFnbml0dWRlIG9mIGEgYGRlY2ltYWxgIG9yIGBudW1lcmljYCB2YWx1ZSB0YWtlc1xuICogYXQgYHByZWNpc2lvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNpbWFsTGVuZ3RoKHByZWNpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkKTogNCB8IDggfCAxMiB8IDE2IHtcbiAgaWYgKHByZWNpc2lvbiEgPD0gOSkge1xuICAgIHJldHVybiA0O1xuICB9IGVsc2UgaWYgKHByZWNpc2lvbiEgPD0gMTkpIHtcbiAgICByZXR1cm4gODtcbiAgfSBlbHNlIGlmIChwcmVjaXNpb24hIDw9IDI4KSB7XG4gICAgcmV0dXJuIDEyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxNjtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgVFlQRV9JTkZPIG9mIGEgYGRlY2ltYWxgIG9yIGBudW1lcmljYCBjb2x1bW46IHRoZSBudWxsYWJsZSB0eXBlXG4gKiBpZCwgdGhlIGxlbmd0aCBvZiBhIHZhbHVlLCBhbmQgdGhlIHByZWNpc2lvbiBhbmQgc2NhbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlY2ltYWxUeXBlSW5mbyhidWZmZXI6IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIsIGlkOiBudW1iZXIsIHByZWNpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkLCBzY2FsZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGJ1ZmZlci53cml0ZVVJbnQ4KGlkKTtcbiAgYnVmZmVyLndyaXRlVUludDgoZGVjaW1hbExlbmd0aChwcmVjaXNpb24pICsgMSk7XG4gIGJ1ZmZlci53cml0ZVVJbnQ4KHByZWNpc2lvbiEpO1xuICBidWZmZXIud3JpdGVVSW50OChzY2FsZSEpO1xufVxuXG4vKipcbiAqIFdyaXRlcyBhIHZhbGlkYXRlZCBgZGVjaW1hbGAgb3IgYG51bWVyaWNgIHZhbHVlOiB0aGUgbGVuZ3RoLCB0aGUgc2lnbixcbiAqIGFuZCB0aGUgc2NhbGVkIG1hZ25pdHVkZSBhcyBhIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBzcGFubmluZyB0aGVcbiAqIGZ1bGwgd2lkdGggZm9yIHRoZSBwcmVjaXNpb24uIGBuYW1lYCBuYW1lcyB0aGUgdHlwZSBpbiB0aGUgZXJyb3IgZm9yIGFcbiAqIHZhbHVlIHRoYXQgZG9lcyBub3QgZml0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZWNpbWFsKGJ1ZmZlcjogV3JpdGFibGVUcmFja2luZ0J1ZmZlciwgdmFsdWU6IG51bWJlciB8IG51bGwsIHByZWNpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkLCBzY2FsZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICBidWZmZXIud3JpdGVVSW50OCgweDAwKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkYXRhTGVuZ3RoID0gZGVjaW1hbExlbmd0aChwcmVjaXNpb24pO1xuXG4gIC8vIEEgQmlnSW50IGhvbGRzIG1hZ25pdHVkZXMgYmV5b25kIDJeNjQgZm9yIGhpZ2gtcHJlY2lzaW9uIGNvbHVtbnMuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVkaW91c2pzL3RlZGlvdXMvaXNzdWVzLzE3MzNcbiAgY29uc3QgbWFnbml0dWRlID0gQmlnSW50KE1hdGgucm91bmQoTWF0aC5hYnModmFsdWUgKiBNYXRoLnBvdygxMCwgc2NhbGUhKSkpKTtcblxuICAvLyBUaHJvd2luZyBzdXJmYWNlcyBhIGNhdGNoYWJsZSBlcnJvciB0byB0aGUgY2FsbGVyIGluc3RlYWQgb2Ygc2lsZW50bHlcbiAgLy8gdHJ1bmNhdGluZyB0aGUgbWFnbml0dWRlLlxuICBpZiAobWFnbml0dWRlID49ICgxbiA8PCBCaWdJbnQoOCAqIGRhdGFMZW5ndGgpKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSAke3ZhbHVlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yICR7bmFtZX0oJHtwcmVjaXNpb259LCAke3NjYWxlfSkuYCk7XG4gIH1cblxuICBidWZmZXIud3JpdGVVSW50OChkYXRhTGVuZ3RoICsgMSk7XG4gIGJ1ZmZlci53cml0ZVVJbnQ4KHZhbHVlIDwgMCA/IDAgOiAxKTtcblxuICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICBjYXNlIDQ6XG4gICAgICBidWZmZXIud3JpdGVVSW50MzJMRShOdW1iZXIobWFnbml0dWRlKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICBidWZmZXIud3JpdGVCaWdVSW50NjRMRShtYWduaXR1ZGUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjpcbiAgICAgIGJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hZ25pdHVkZSAmIE1BU0tfNjQpO1xuICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUoTnVtYmVyKG1hZ25pdHVkZSA+PiA2NG4pKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTY6XG4gICAgICBidWZmZXIud3JpdGVCaWdVSW50NjRMRShtYWduaXR1ZGUgJiBNQVNLXzY0KTtcbiAgICAgIGJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hZ25pdHVkZSA+PiA2NG4pO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFFQSxNQUFNQSxPQUFPLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUU7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBYUEsQ0FBQ0MsU0FBNkIsRUFBbUI7RUFDNUUsSUFBSUEsU0FBUyxJQUFLLENBQUMsRUFBRTtJQUNuQixPQUFPLENBQUM7RUFDVixDQUFDLE1BQU0sSUFBSUEsU0FBUyxJQUFLLEVBQUUsRUFBRTtJQUMzQixPQUFPLENBQUM7RUFDVixDQUFDLE1BQU0sSUFBSUEsU0FBUyxJQUFLLEVBQUUsRUFBRTtJQUMzQixPQUFPLEVBQUU7RUFDWCxDQUFDLE1BQU07SUFDTCxPQUFPLEVBQUU7RUFDWDtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msb0JBQW9CQSxDQUFDQyxNQUE4QixFQUFFQyxFQUFVLEVBQUVILFNBQTZCLEVBQUVJLEtBQXlCLEVBQVE7RUFDL0lGLE1BQU0sQ0FBQ0csVUFBVSxDQUFDRixFQUFFLENBQUM7RUFDckJELE1BQU0sQ0FBQ0csVUFBVSxDQUFDTixhQUFhLENBQUNDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMvQ0UsTUFBTSxDQUFDRyxVQUFVLENBQUNMLFNBQVUsQ0FBQztFQUM3QkUsTUFBTSxDQUFDRyxVQUFVLENBQUNELEtBQU0sQ0FBQztBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxZQUFZQSxDQUFDSixNQUE4QixFQUFFSyxLQUFvQixFQUFFUCxTQUE2QixFQUFFSSxLQUF5QixFQUFFSSxJQUFZLEVBQVE7RUFDL0osSUFBSUQsS0FBSyxJQUFJLElBQUksRUFBRTtJQUNqQkwsTUFBTSxDQUFDRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ3ZCO0VBQ0Y7RUFFQSxNQUFNSSxVQUFVLEdBQUdWLGFBQWEsQ0FBQ0MsU0FBUyxDQUFDOztFQUUzQztFQUNBO0VBQ0EsTUFBTVUsU0FBUyxHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLEdBQUcsQ0FBQ1AsS0FBSyxHQUFHSyxJQUFJLENBQUNHLEdBQUcsQ0FBQyxFQUFFLEVBQUVYLEtBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFNUU7RUFDQTtFQUNBLElBQUlNLFNBQVMsSUFBSyxFQUFFLElBQUlDLE1BQU0sQ0FBQyxDQUFDLEdBQUdGLFVBQVUsQ0FBRSxFQUFFO0lBQy9DLE1BQU0sSUFBSU8sVUFBVSxDQUFDLFNBQVNULEtBQUssd0JBQXdCQyxJQUFJLElBQUlSLFNBQVMsS0FBS0ksS0FBSyxJQUFJLENBQUM7RUFDN0Y7RUFFQUYsTUFBTSxDQUFDRyxVQUFVLENBQUNJLFVBQVUsR0FBRyxDQUFDLENBQUM7RUFDakNQLE1BQU0sQ0FBQ0csVUFBVSxDQUFDRSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFFcEMsUUFBUUUsVUFBVTtJQUNoQixLQUFLLENBQUM7TUFDSlAsTUFBTSxDQUFDZSxhQUFhLENBQUNDLE1BQU0sQ0FBQ1IsU0FBUyxDQUFDLENBQUM7TUFDdkM7SUFDRixLQUFLLENBQUM7TUFDSlIsTUFBTSxDQUFDaUIsZ0JBQWdCLENBQUNULFNBQVMsQ0FBQztNQUNsQztJQUNGLEtBQUssRUFBRTtNQUNMUixNQUFNLENBQUNpQixnQkFBZ0IsQ0FBQ1QsU0FBUyxHQUFHWixPQUFPLENBQUM7TUFDNUNJLE1BQU0sQ0FBQ2UsYUFBYSxDQUFDQyxNQUFNLENBQUNSLFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQztNQUM5QztJQUNGLEtBQUssRUFBRTtNQUNMUixNQUFNLENBQUNpQixnQkFBZ0IsQ0FBQ1QsU0FBUyxHQUFHWixPQUFPLENBQUM7TUFDNUNJLE1BQU0sQ0FBQ2lCLGdCQUFnQixDQUFDVCxTQUFTLElBQUksR0FBRyxDQUFDO01BQ3pDO0VBQ0o7QUFDRiIsImlnbm9yZUxpc3QiOltdfQ==