UNPKG

tds

Version:

TDS client for connecting to Microsoft SQL Server

229 lines (208 loc) 6.14 kB
var TdsUtils, Token, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }; TdsUtils = require('./tds-utils').TdsUtils; Token = require('./token').Token; /** Token for ROW (0xD1) @spec 2.2.7.17 */ exports.RowToken = (function(_super) { __extends(RowToken, _super); RowToken.type = 0xD1; RowToken.name = 'ROW'; function RowToken() { this.type = 0xD1; this.name = 'ROW'; this.handlerFunction = 'row'; } RowToken.prototype.fromBuffer = function(stream, context) { var column, index, val, _len, _ref, _results; this.metadata = context.colmetadata; this.values = new Array(this.metadata.columns.length); _ref = this.metadata.columns; _results = []; for (index = 0, _len = _ref.length; index < _len; index++) { column = _ref[index]; val = {}; switch (column.lengthType) { case 'int32LE': val.length = stream.readInt32LE(); break; case 'uint16LE': val.length = stream.readUInt16LE(); break; case 'uint8': val.length = stream.readByte(); break; default: val.length = column.length; } if (val.length === 0xFFFF) val.length = -1; if (val.length === 0 && column.type.emptyPossible) { val.buffer = new Buffer(0); } else if (val.length > 0) { val.buffer = stream.readBuffer(val.length); } _results.push(this.values[index] = val); } return _results; }; RowToken.prototype.isNull = function(column) { var col; col = this.metadata.getColumn(column); if (!(col != null)) throw new Error('Column ' + column + ' not found'); if (col.type.emptyPossible) { return this.values[col.index].length === -1; } else { return this.values[col.index] === 0; } }; RowToken.prototype.getValueLength = function(column) { var col; col = this.metadata.getColumn(column); if (!(col != null)) throw new Error('Column ' + column + ' not found'); return this.values[col.index].length; }; RowToken.prototype.getValue = function(column) { var col, val; col = this.metadata.getColumn(column); if (!(col != null)) throw new Error('Column ' + column + ' not found'); val = this.values[col.index]; switch (col.type.sqlType) { case 'Null': return null; case 'Bit': case 'TinyInt': if (val.length === 0) { return null; } else { return val.buffer.readInt8(0); } break; case 'SmallInt': if (val.length === 0) { return null; } else { return val.buffer.readInt16LE(0); } break; case 'Int': if (val.length === 0) { return null; } else { return val.buffer.readInt32LE(0); } break; case 'BigInt': if (val.length === 0) { return null; } else { return TdsUtils.bigIntBufferToString(val.buffer); } break; case 'Char': case 'VarChar': if (val.length === -1) { return null; } else { return val.buffer.toString('ascii', 0, val.length); } break; case 'NChar': case 'NVarChar': if (val.length === -1) { return null; } else { return val.buffer.toString('ucs2', 0, val.length * 2); } break; case 'Binary': case 'VarBinary': if (col.length === -1) { return null; } else { return val.buffer; } break; case 'Real': if (val.length === 0) { return null; } else { return val.buffer.readFloatLE(0); } break; case 'Float': if (val.length === 0) { return null; } else { return val.buffer.readDoubleLE(0); } break; case 'UniqueIdentifier': if (val.length === 0) { return null; } else { return val.buffer; } break; case 'SmallDateTime': if (val.length === 0) { return null; } else { return this._readSmallDateTime(val.buffer); } break; case 'DateTime': if (val.length === 0) { return null; } else { return this._readDateTime(val.buffer); } break; case 'Date': if (val.length === 0) { return null; } else { return this._readDate(val.buffer); } break; default: throw new Error('Unrecognized type ' + col.type.name); } }; RowToken.prototype.getBuffer = function(column) { var col; col = this.metadata.getColumn(column); if (!(col != null)) throw new Error('Column ' + column + ' not found'); return this.values[col.index].buffer; }; RowToken.prototype.toObject = function() { var column, ret, _i, _len, _ref; ret = {}; _ref = this.metadata.columns; for (_i = 0, _len = _ref.length; _i < _len; _i++) { column = _ref[_i]; ret[column.name] = getValue(column.index); } return ret; }; RowToken.prototype._readSmallDateTime = function(buffer) { var date; date = new Date(1900, 0, 1); date.setDate(date.getDate() + buffer.readUInt16LE(0)); date.setMinutes(date.getMinutes() + buffer.readUInt16LE(2)); return date; }; RowToken.prototype._readDateTime = function(buffer) { var date; date = new Date(1900, 0, 1); date.setDate(date.getDate() + buffer.readInt32LE(0)); date.setMilliseconds(date.getMilliseconds() + (buffer.readInt32LE(4) * (10 / 3.0))); return date; }; RowToken.prototype._readDate = function(buffer) { throw new Error('Not implemented'); }; return RowToken; })(Token);