UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

1,147 lines (1,132 loc) 33.4 kB
// Generated by CoffeeScript 1.7.1 var EPOCH_DATE, MAX, NULL, TYPE, UTC_EPOCH_DATE, YEAR_ONE, alias, guidParser, id, type, typeByName, _i, _len, _ref; guidParser = require('./guid-parser'); NULL = (1 << 16) - 1; EPOCH_DATE = new Date(1900, 0, 1); UTC_EPOCH_DATE = new Date(Date.UTC(1900, 0, 1)); YEAR_ONE = Date.UTC(2000, 0, -730118); MAX = (1 << 16) - 1; TYPE = { 0x1F: { type: 'NULL', name: 'Null' }, 0x30: { type: 'INT1', name: 'TinyInt', declaration: function(parameter) { return 'tinyint'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.IntN.id); return buffer.writeUInt8(1); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(1); return buffer.writeUInt8(parseInt(parameter.value)); } else { return buffer.writeUInt8(0); } } }, 0x32: { type: 'BIT', name: 'Bit', declaration: function(parameter) { return 'bit'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.BitN.id); return buffer.writeUInt8(1); }, writeParameterData: function(buffer, parameter) { if (typeof parameter.value === 'undefined' || parameter.value === null) { return buffer.writeUInt8(0); } else { buffer.writeUInt8(1); return buffer.writeUInt8(parameter.value ? 1 : 0); } } }, 0x34: { type: 'INT2', name: 'SmallInt', declaration: function(parameter) { return 'smallint'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.IntN.id); return buffer.writeUInt8(2); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(2); return buffer.writeInt16LE(parseInt(parameter.value)); } else { return buffer.writeUInt8(0); } } }, 0x38: { type: 'INT4', name: 'Int', declaration: function(parameter) { return 'int'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.IntN.id); return buffer.writeUInt8(4); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(4); return buffer.writeInt32LE(parseInt(parameter.value)); } else { return buffer.writeUInt8(0); } } }, 0x3A: { type: 'DATETIM4', name: 'SmallDateTime', declaration: function(parameter) { return 'smalldatetime'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.DateTimeN.id); return buffer.writeUInt8(4); }, writeParameterData: function(buffer, parameter, options) { var days, minutes; if (parameter.value != null) { if (options.useUTC) { days = Math.floor((parameter.value.getTime() - UTC_EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24)); minutes = (parameter.value.getUTCHours() * 60) + parameter.value.getUTCMinutes(); } else { days = Math.floor((parameter.value.getTime() - EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24)); minutes = (parameter.value.getHours() * 60) + parameter.value.getMinutes(); } buffer.writeUInt8(4); buffer.writeUInt16LE(days); return buffer.writeUInt16LE(minutes); } else { return buffer.writeUInt8(0); } } }, 0x3B: { type: 'FLT4', name: 'Real', declaration: function(parameter) { return 'real'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.FloatN.id); return buffer.writeUInt8(4); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(4); return buffer.writeFloatLE(parseFloat(parameter.value)); } else { return buffer.writeUInt8(0); } } }, 0x3C: { type: 'MONEY', name: 'Money', declaration: function(parameter) { return "money"; }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(typeByName.MoneyN.id); return buffer.writeUInt8(8); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(8); return buffer.writeMoney(parameter.value * 10000); } else { return buffer.writeUInt8(0); } } }, 0x3D: { type: 'DATETIME', name: 'DateTime', declaration: function(parameter) { return 'datetime'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.DateTimeN.id); return buffer.writeUInt8(8); }, writeParameterData: function(buffer, parameter, options) { var days, milliseconds, seconds, threeHundredthsOfSecond; if (parameter.value != null) { if (options.useUTC) { days = Math.floor((parameter.value.getTime() - UTC_EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24)); seconds = parameter.value.getUTCHours() * 60 * 60; seconds += parameter.value.getUTCMinutes() * 60; seconds += parameter.value.getUTCSeconds(); milliseconds = (seconds * 1000) + parameter.value.getUTCMilliseconds(); } else { days = Math.floor((parameter.value.getTime() - EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24)); seconds = parameter.value.getHours() * 60 * 60; seconds += parameter.value.getMinutes() * 60; seconds += parameter.value.getSeconds(); milliseconds = (seconds * 1000) + parameter.value.getMilliseconds(); } threeHundredthsOfSecond = milliseconds / (3 + (1 / 3)); threeHundredthsOfSecond = Math.floor(threeHundredthsOfSecond); buffer.writeUInt8(8); buffer.writeInt32LE(days); return buffer.writeUInt32LE(threeHundredthsOfSecond); } else { return buffer.writeUInt8(0); } } }, 0x3E: { type: 'FLT8', name: 'Float', declaration: function(parameter) { return 'float'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.FloatN.id); return buffer.writeUInt8(8); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(8); return buffer.writeDoubleLE(parseFloat(parameter.value)); } else { return buffer.writeUInt8(0); } } }, 0x37: { type: 'DECIMAL', name: 'Decimal', hasPrecision: true, hasScale: true, declaration: function(parameter) { return "decimal(" + (this.resolvePrecision(parameter)) + ", " + (this.resolveScale(parameter)) + ")"; }, resolvePrecision: function(parameter) { if (parameter.precision != null) { return parameter.precision; } else if (parameter.value === null) { return 1; } else { return 18; } }, resolveScale: function(parameter) { if (parameter.scale != null) { return parameter.scale; } else { return 0; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(typeByName.DecimalN.id); if (parameter.precision <= 9) { buffer.writeUInt8(5); } else if (parameter.precision <= 19) { buffer.writeUInt8(9); } else if (parameter.precision <= 28) { buffer.writeUInt8(13); } else { buffer.writeUInt8(17); } buffer.writeUInt8(parameter.precision); return buffer.writeUInt8(parameter.scale); }, writeParameterData: function(buffer, parameter) { var sign, value; if (parameter.value != null) { sign = parameter.value < 0 ? 0 : 1; value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale))); if (parameter.precision <= 9) { buffer.writeUInt8(5); buffer.writeUInt8(sign); return buffer.writeUInt32LE(value); } else if (parameter.precision <= 19) { buffer.writeUInt8(9); buffer.writeUInt8(sign); return buffer.writeUInt64LE(value); } else if (parameter.precision <= 28) { buffer.writeUInt8(13); buffer.writeUInt8(sign); buffer.writeUInt64LE(value); return buffer.writeUInt32LE(0x00000000); } else { buffer.writeUInt8(17); buffer.writeUInt8(sign); buffer.writeUInt64LE(value); buffer.writeUInt32LE(0x00000000); return buffer.writeUInt32LE(0x00000000); } } else { return buffer.writeUInt8(0); } } }, 0x3F: { type: 'NUMERIC', name: 'Numeric', hasPrecision: true, hasScale: true, declaration: function(parameter) { return "numeric(" + (this.resolvePrecision(parameter)) + ", " + (this.resolveScale(parameter)) + ")"; }, resolvePrecision: function(parameter) { if (parameter.precision != null) { return parameter.precision; } else if (parameter.value === null) { return 1; } else { return 18; } }, resolveScale: function(parameter) { if (parameter.scale != null) { return parameter.scale; } else { return 0; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(typeByName.NumericN.id); if (parameter.precision <= 9) { buffer.writeUInt8(5); } else if (parameter.precision <= 19) { buffer.writeUInt8(9); } else if (parameter.precision <= 28) { buffer.writeUInt8(13); } else { buffer.writeUInt8(17); } buffer.writeUInt8(parameter.precision); return buffer.writeUInt8(parameter.scale); }, writeParameterData: function(buffer, parameter) { var sign, value; if (parameter.value != null) { sign = parameter.value < 0 ? 0 : 1; value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale))); if (parameter.precision <= 9) { buffer.writeUInt8(5); buffer.writeUInt8(sign); return buffer.writeUInt32LE(value); } else if (parameter.precision <= 19) { buffer.writeUInt8(9); buffer.writeUInt8(sign); return buffer.writeUInt64LE(value); } else if (parameter.precision <= 28) { buffer.writeUInt8(13); buffer.writeUInt8(sign); buffer.writeUInt64LE(value); return buffer.writeUInt32LE(0x00000000); } else { buffer.writeUInt8(17); buffer.writeUInt8(sign); buffer.writeUInt64LE(value); buffer.writeUInt32LE(0x00000000); return buffer.writeUInt32LE(0x00000000); } } else { return buffer.writeUInt8(0); } } }, 0x7A: { type: 'MONEY4', name: 'SmallMoney', declaration: function(parameter) { return "smallmoney"; }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(typeByName.MoneyN.id); return buffer.writeUInt8(4); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(4); return buffer.writeInt32LE(parameter.value * 10000); } else { return buffer.writeUInt8(0); } } }, 0x7F: { type: 'INT8', name: 'BigInt', declaration: function(parameter) { return 'bigint'; }, writeTypeInfo: function(buffer) { buffer.writeUInt8(typeByName.IntN.id); return buffer.writeUInt8(8); }, writeParameterData: function(buffer, parameter) { var val; if (parameter.value != null) { val = typeof parameter.value !== 'number' ? parameter.value : parseInt(parameter.value); buffer.writeUInt8(8); return buffer.writeInt64LE(val); } else { return buffer.writeUInt8(0); } } }, 0x22: { type: 'IMAGE', name: 'Image', hasTableName: true, hasTextPointerAndTimestamp: true, dataLengthLength: 4, declaration: function(parameter) { return 'image'; }, resolveLength: function(parameter) { if (parameter.value != null) { return parameter.value.length; } else { return -1; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); return buffer.writeInt32LE(parameter.length); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeInt32LE(parameter.length); return buffer.writeBuffer(parameter.value); } else { return buffer.writeInt32LE(parameter.length); } } }, 0x23: { type: 'TEXT', name: 'Text', hasCollation: true, hasTableName: true, hasTextPointerAndTimestamp: true, dataLengthLength: 4, declaration: function(parameter) { return 'text'; }, resolveLength: function(parameter) { if (parameter.value != null) { return parameter.value.length; } else { return -1; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(typeByName.Text.id); return buffer.writeInt32LE(parameter.length); }, writeParameterData: function(buffer, parameter) { buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00])); if (parameter.value != null) { buffer.writeInt32LE(parameter.length); return buffer.writeString(parameter.value.toString(), 'ascii'); } else { return buffer.writeInt32LE(parameter.length); } } }, 0x24: { type: 'GUIDN', name: 'UniqueIdentifierN', aliases: ['UniqueIdentifier'], dataLengthLength: 1, declaration: function(parameter) { return 'uniqueidentifier'; }, resolveLength: function(parameter) { return 16; }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(typeByName.UniqueIdentifierN.id); return buffer.writeUInt8(0x10); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(0x10); return buffer.writeBuffer(new Buffer(guidParser.guidToArray(parameter.value))); } else { return buffer.writeUInt8(0); } } }, 0x26: { type: 'INTN', name: 'IntN', dataLengthLength: 1 }, 0x63: { type: 'NTEXT', name: 'NText', hasCollation: true, hasTableName: true, hasTextPointerAndTimestamp: true, dataLengthLength: 4 }, 0x68: { type: 'BITN', name: 'BitN', dataLengthLength: 1 }, 0x6A: { type: 'DECIMALN', name: 'DecimalN', dataLengthLength: 1, hasPrecision: true, hasScale: true }, 0x6C: { type: 'NUMERICN', name: 'NumericN', dataLengthLength: 1, hasPrecision: true, hasScale: true }, 0x6D: { type: 'FLTN', name: 'FloatN', dataLengthLength: 1 }, 0x6E: { type: 'MONEYN', name: 'MoneyN', dataLengthLength: 1 }, 0x6F: { type: 'DATETIMN', name: 'DateTimeN', dataLengthLength: 1 }, 0xA5: { type: 'BIGVARBIN', name: 'VarBinary', dataLengthLength: 2, maximumLength: 8000, declaration: function(parameter) { var length; if (parameter.length) { length = parameter.length; } else if (parameter.value != null) { length = parameter.value.length || 1; } else if (parameter.value === null && !parameter.output) { length = 1; } else { length = this.maximumLength; } if (length <= this.maximumLength) { return "varbinary(" + length + ")"; } else { return "varbinary(max)"; } }, resolveLength: function(parameter) { if (parameter.length != null) { return parameter.length; } else if (parameter.value != null) { return parameter.value.length; } else { return this.maximumLength; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); if (parameter.length <= this.maximumLength) { return buffer.writeUInt16LE(this.maximumLength); } else { return buffer.writeUInt16LE(MAX); } }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { if (parameter.length <= this.maximumLength) { return buffer.writeUsVarbyte(parameter.value); } else { return buffer.writePLPBody(parameter.value); } } else { if (parameter.length <= this.maximumLength) { return buffer.writeUInt16LE(NULL); } else { buffer.writeUInt32LE(0xFFFFFFFF); return buffer.writeUInt32LE(0xFFFFFFFF); } } } }, 0xA7: { type: 'BIGVARCHR', name: 'VarChar', hasCollation: true, dataLengthLength: 2, maximumLength: 8000, declaration: function(parameter) { var length; if (parameter.length) { length = parameter.length; } else if (parameter.value != null) { length = parameter.value.toString().length || 1; } else if (parameter.value === null && !parameter.output) { length = 1; } else { length = this.maximumLength; } if (length <= this.maximumLength) { return "varchar(" + length + ")"; } else { return "varchar(max)"; } }, resolveLength: function(parameter) { if (parameter.length != null) { return parameter.length; } else if (parameter.value != null) { if (Buffer.isBuffer(parameter.value)) { return parameter.value.length || 1; } else { return parameter.value.toString().length || 1; } } else { return this.maximumLength; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); if (parameter.length <= this.maximumLength) { buffer.writeUInt16LE(this.maximumLength); } else { buffer.writeUInt16LE(MAX); } return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00])); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { if (parameter.length <= this.maximumLength) { return buffer.writeUsVarbyte(parameter.value, 'ascii'); } else { return buffer.writePLPBody(parameter.value, 'ascii'); } } else { if (parameter.length <= this.maximumLength) { return buffer.writeUInt16LE(NULL); } else { buffer.writeUInt32LE(0xFFFFFFFF); return buffer.writeUInt32LE(0xFFFFFFFF); } } } }, 0xAD: { type: 'BIGBinary', name: 'Binary', dataLengthLength: 2, maximumLength: 8000, declaration: function(parameter) { return 'binary'; }, resolveLength: function(parameter) { if (parameter.value != null) { return parameter.value.length; } else { return this.maximumLength; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); return buffer.writeUInt16LE(parameter.length); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt16LE(parameter.length); return buffer.writeBuffer(parameter.value.slice(0, Math.min(parameter.length, this.maximumLength))); } else { return buffer.writeUInt16LE(NULL); } } }, 0xAF: { type: 'BIGCHAR', name: 'Char', hasCollation: true, dataLengthLength: 2, maximumLength: 8000, declaration: function(parameter) { var length; if (parameter.length) { length = parameter.length; } else if (parameter.value != null) { length = parameter.value.toString().length || 1; } else if (parameter.value === null && !parameter.output) { length = 1; } else { length = this.maximumLength; } if (length < this.maximumLength) { return "char(" + length + ")"; } else { return "char(" + this.maximumLength + ")"; } }, resolveLength: function(parameter) { if (parameter.length != null) { return parameter.length; } else if (parameter.value != null) { if (Buffer.isBuffer(parameter.value)) { return parameter.value.length || 1; } else { return parameter.value.toString().length || 1; } } else { return this.maximumLength; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); buffer.writeUInt16LE(parameter.length); return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00])); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { return buffer.writeUsVarbyte(parameter.value, 'ascii'); } else { return buffer.writeUInt16LE(NULL); } } }, 0xE7: { type: 'NVARCHAR', name: 'NVarChar', hasCollation: true, dataLengthLength: 2, maximumLength: 4000, declaration: function(parameter) { var length; if (parameter.length) { length = parameter.length; } else if (parameter.value != null) { length = parameter.value.toString().length || 1; } else if (parameter.value === null && !parameter.output) { length = 1; } else { length = this.maximumLength; } if (length <= this.maximumLength) { return "nvarchar(" + length + ")"; } else { return "nvarchar(max)"; } }, resolveLength: function(parameter) { if (parameter.length != null) { return parameter.length; } else if (parameter.value != null) { if (Buffer.isBuffer(parameter.value)) { return (parameter.value.length / 2) || 1; } else { return parameter.value.toString().length || 1; } } else { return this.maximumLength; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); if (parameter.length <= this.maximumLength) { buffer.writeUInt16LE(parameter.length * 2); } else { buffer.writeUInt16LE(MAX); } return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00])); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { if (parameter.length <= this.maximumLength) { return buffer.writeUsVarbyte(parameter.value, 'ucs2'); } else { return buffer.writePLPBody(parameter.value, 'ucs2'); } } else { if (parameter.length <= this.maximumLength) { return buffer.writeUInt16LE(NULL); } else { buffer.writeUInt32LE(0xFFFFFFFF); return buffer.writeUInt32LE(0xFFFFFFFF); } } } }, 0xEF: { type: 'NCHAR', name: 'NChar', hasCollation: true, dataLengthLength: 2, maximumLength: 4000, declaration: function(parameter) { var length; if (parameter.length) { length = parameter.length; } else if (parameter.value != null) { length = parameter.value.toString().length || 1; } else if (parameter.value === null && !parameter.output) { length = 1; } else { length = this.maximumLength; } if (length < this.maximumLength) { return "nchar(" + length + ")"; } else { return "nchar(" + this.maximumLength + ")"; } }, resolveLength: function(parameter) { if (parameter.length != null) { return parameter.length; } else if (parameter.value != null) { if (Buffer.isBuffer(parameter.value)) { return (parameter.value.length / 2) || 1; } else { return parameter.value.toString().length || 1; } } else { return this.maximumLength; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); buffer.writeUInt16LE(parameter.length * 2); return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00])); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { return buffer.writeUsVarbyte(parameter.value, 'ucs2'); } else { return buffer.writeUInt16LE(NULL); } } }, 0xF1: { type: 'XML', name: 'Xml', hasSchemaPresent: true }, 0x29: { type: 'TIMEN', name: 'TimeN', aliases: ['Time'], hasScale: true, dataLengthLength: 0, dataLengthFromScale: function(scale) { switch (scale) { case 0: case 1: case 2: return 3; case 3: case 4: return 4; case 5: case 6: case 7: return 5; } }, declaration: function(parameter) { return "time(" + (this.resolveScale(parameter)) + ")"; }, resolveScale: function(parameter) { if (parameter.scale != null) { return parameter.scale; } else if (parameter.value === null) { return 0; } else { return 7; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); return buffer.writeUInt8(parameter.scale); }, writeParameterData: function(buffer, parameter) { var time, _ref; if (parameter.value != null) { parameter.value.setUTCFullYear(1970); parameter.value.setUTCMonth(0); parameter.value.setUTCDate(1); time = (+parameter.value / 1000 + ((_ref = parameter.value.nanosecondDelta) != null ? _ref : 0)) * Math.pow(10, parameter.scale); switch (parameter.scale) { case 0: case 1: case 2: buffer.writeUInt8(3); return buffer.writeUInt24LE(time); case 3: case 4: buffer.writeUInt8(4); return buffer.writeUInt32LE(time); case 5: case 6: case 7: buffer.writeUInt8(5); return buffer.writeUInt40LE(time); } } else { return buffer.writeUInt8(0); } } }, 0x28: { type: 'DATEN', name: 'DateN', aliases: ['Date'], dataLengthLength: 0, declaration: function(parameter) { return "date"; }, writeTypeInfo: function(buffer, parameter) { return buffer.writeUInt8(this.id); }, writeParameterData: function(buffer, parameter) { if (parameter.value != null) { buffer.writeUInt8(3); return buffer.writeUInt24LE(Math.floor((+parameter.value - YEAR_ONE) / 86400000)); } else { return buffer.writeUInt8(0); } } }, 0x2A: { type: 'DATETIME2N', name: 'DateTime2N', aliases: ['DateTime2'], hasScale: true, dataLengthLength: 0, dataLengthFromScale: function(scale) { switch (scale) { case 0: case 1: case 2: return 3; case 3: case 4: return 4; case 5: case 6: case 7: return 5; } }, declaration: function(parameter) { return "datetime2(" + (this.resolveScale(parameter)) + ")"; }, resolveScale: function(parameter) { if (parameter.scale != null) { return parameter.scale; } else if (parameter.value === null) { return 0; } else { return 7; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); return buffer.writeUInt8(parameter.scale); }, writeParameterData: function(buffer, parameter) { var time, _ref; if (parameter.value != null) { time = new Date(+parameter.value); time.setUTCFullYear(1970); time.setUTCMonth(0); time.setUTCDate(1); time = (+time / 1000 + ((_ref = parameter.value.nanosecondDelta) != null ? _ref : 0)) * Math.pow(10, parameter.scale); switch (parameter.scale) { case 0: case 1: case 2: buffer.writeUInt8(6); buffer.writeUInt24LE(time); break; case 3: case 4: buffer.writeUInt8(7); buffer.writeUInt32LE(time); break; case 5: case 6: case 7: buffer.writeUInt8(8); buffer.writeUInt40LE(time); } return buffer.writeUInt24LE(Math.floor((+parameter.value - YEAR_ONE) / 86400000)); } else { return buffer.writeUInt8(0); } } }, 0x2B: { type: 'DATETIMEOFFSETN', name: 'DateTimeOffsetN', aliases: ['DateTimeOffset'], hasScale: true, dataLengthLength: 0, dataLengthFromScale: function(scale) { switch (scale) { case 0: case 1: case 2: return 3; case 3: case 4: return 4; case 5: case 6: case 7: return 5; } }, declaration: function(parameter) { return "datetimeoffset(" + (this.resolveScale(parameter)) + ")"; }, resolveScale: function(parameter) { if (parameter.scale != null) { return parameter.scale; } else if (parameter.value === null) { return 0; } else { return 7; } }, writeTypeInfo: function(buffer, parameter) { buffer.writeUInt8(this.id); return buffer.writeUInt8(parameter.scale); }, writeParameterData: function(buffer, parameter) { var offset, time, _ref; if (parameter.value != null) { time = new Date(+parameter.value); time.setUTCFullYear(1970); time.setUTCMonth(0); time.setUTCDate(1); time = (+time / 1000 + ((_ref = parameter.value.nanosecondDelta) != null ? _ref : 0)) * Math.pow(10, parameter.scale); offset = -parameter.value.getTimezoneOffset(); switch (parameter.scale) { case 0: case 1: case 2: buffer.writeUInt8(8); buffer.writeUInt24LE(time); break; case 3: case 4: buffer.writeUInt8(9); buffer.writeUInt32LE(time); break; case 5: case 6: case 7: buffer.writeUInt8(10); buffer.writeUInt40LE(time); } buffer.writeUInt24LE(Math.floor((+parameter.value - YEAR_ONE) / 86400000)); return buffer.writeInt16LE(offset); } else { return buffer.writeUInt8(0); } } }, 0xF0: { type: 'UDTTYPE', name: 'UDT', hasUDTInfo: true }, 0xF3: { type: 'TVPTYPE', name: 'TVP', declaration: function(parameter) { return "" + parameter.value.name + " readonly"; }, writeTypeInfo: function(buffer, parameter) { var _ref, _ref1, _ref2, _ref3; buffer.writeUInt8(this.id); buffer.writeBVarchar(""); buffer.writeBVarchar((_ref = (_ref1 = parameter.value) != null ? _ref1.schema : void 0) != null ? _ref : ""); return buffer.writeBVarchar((_ref2 = (_ref3 = parameter.value) != null ? _ref3.name : void 0) != null ? _ref2 : ""); }, writeParameterData: function(buffer, parameter, options) { var column, index, param, row, value, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; if (parameter.value == null) { buffer.writeUInt16LE(0xFFFF); buffer.writeUInt8(0x00); buffer.writeUInt8(0x00); return; } buffer.writeUInt16LE(parameter.value.columns.length); _ref = parameter.value.columns; for (_i = 0, _len = _ref.length; _i < _len; _i++) { column = _ref[_i]; buffer.writeUInt32LE(0x00000000); buffer.writeUInt16LE(0x0000); column.type.writeTypeInfo(buffer, column); buffer.writeBVarchar(""); } buffer.writeUInt8(0x00); _ref1 = parameter.value.rows; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { row = _ref1[_j]; buffer.writeUInt8(0x01); for (index = _k = 0, _len2 = row.length; _k < _len2; index = ++_k) { value = row[index]; param = { value: value, length: parameter.value.columns[index].length, scale: parameter.value.columns[index].scale, precision: parameter.value.columns[index].precision }; parameter.value.columns[index].type.writeParameterData(buffer, param, options); } } return buffer.writeUInt8(0x00); } } }; /* CHARTYPE: 0x2F # Char (legacy support) VARCHARTYPE: 0x27 # VarChar (legacy support) BINARYTYPE: 0x2D # Binary (legacy support) VARBINARYTYPE: 0x25 # VarBinary (legacy support) SSVARIANTTYPE: 0x62 # Sql_Variant (introduced in TDS 7.2) */ typeByName = {}; for (id in TYPE) { type = TYPE[id]; type.id = parseInt(id, 10); typeByName[type.name] = type; if ((type.aliases != null) && type.aliases instanceof Array) { _ref = type.aliases; for (_i = 0, _len = _ref.length; _i < _len; _i++) { alias = _ref[_i]; if (!typeByName[alias]) { typeByName[alias] = type; } } } } exports.TYPE = TYPE; exports.typeByName = typeByName;