Socket
Socket
Sign inDemoInstall

tedious

Package Overview
Dependencies
Maintainers
2
Versions
227
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

tedious - npm Package Compare versions

Comparing version 0.1.5 to 0.2.1

lib/errors.js

3

lib/all-headers.js

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var TXNDESCRIPTOR_HEADER_DATA_LEN, TXNDESCRIPTOR_HEADER_LEN, TYPE, WritableTrackingBuffer;

@@ -18,3 +18,2 @@

var data;
buffer.writeUInt32LE(0);

@@ -21,0 +20,0 @@ buffer.writeUInt32LE(TXNDESCRIPTOR_HEADER_LEN);

@@ -1,6 +0,5 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
if (!Buffer.concat) {
Buffer.concat = function(buffers) {
var buffer, length, position, result, _i, _j, _len, _len1;
length = 0;

@@ -28,3 +27,2 @@ for (_i = 0, _len = buffers.length; _i < _len; _i++) {

var b, index, _i, _len;
if (this.length !== other.length) {

@@ -31,0 +29,0 @@ return false;

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
exports.codepageByLcid = {

@@ -3,0 +3,0 @@ 1025: 'WINDOWS-1256',

@@ -1,3 +0,3 @@

// Generated by CoffeeScript 1.6.2
var Connection, DEFAULT_CANCEL_TIMEOUT, DEFAULT_CLIENT_REQUEST_TIMEOUT, DEFAULT_CONNECT_TIMEOUT, DEFAULT_PACKET_SIZE, DEFAULT_PORT, DEFAULT_TDS_VERSION, DEFAULT_TEXTSIZE, Debug, EventEmitter, ISOLATION_LEVEL, KEEP_ALIVE_INITIAL_DELAY, Login7Payload, MessageIO, PreloginPayload, Request, RpcRequestPayload, Socket, SqlBatchPayload, TYPE, TokenStreamParser, Transaction, crypto, instanceLookup, tls,
// Generated by CoffeeScript 1.7.1
var Connection, ConnectionError, DEFAULT_CANCEL_TIMEOUT, DEFAULT_CLIENT_REQUEST_TIMEOUT, DEFAULT_CONNECT_TIMEOUT, DEFAULT_PACKET_SIZE, DEFAULT_PORT, DEFAULT_TDS_VERSION, DEFAULT_TEXTSIZE, Debug, EventEmitter, ISOLATION_LEVEL, KEEP_ALIVE_INITIAL_DELAY, Login7Payload, MessageIO, PreloginPayload, Request, RequestError, RpcRequestPayload, Socket, SqlBatchPayload, TYPE, TokenStreamParser, Transaction, crypto, instanceLookup, tls, _ref,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },

@@ -42,2 +42,4 @@ __hasProp = {}.hasOwnProperty,

_ref = require('./errors'), ConnectionError = _ref.ConnectionError, RequestError = _ref.RequestError;
KEEP_ALIVE_INITIAL_DELAY = 30 * 1000;

@@ -57,3 +59,3 @@

DEFAULT_TDS_VERSION = '7_2';
DEFAULT_TDS_VERSION = '7_4';

@@ -196,3 +198,2 @@ Connection = (function(_super) {

var sqlRequest;
this.transitionTo(this.STATE.LOGGED_IN);

@@ -205,2 +206,22 @@ sqlRequest = this.request;

},
SENT_ATTENTION: {
name: 'SentAttention',
events: {
socketError: function(error) {
return this.transitionTo(this.STATE.FINAL);
},
data: function(data) {
return this.sendDataToTokenStreamParser(data);
},
message: function() {
var sqlRequest;
if (this.request.canceled) {
this.transitionTo(this.STATE.LOGGED_IN);
sqlRequest = this.request;
this.request = void 0;
return sqlRequest.callback(RequestError("Canceled.", 'ECANCEL'));
}
}
}
},
FINAL: {

@@ -249,3 +270,5 @@ name: 'Final',

this.emit('end');
return this.closed = true;
this.closed = true;
this.loggedIn = false;
return this.loginError = null;
}

@@ -255,4 +278,3 @@ };

Connection.prototype.defaultConfig = function() {
var _base, _base1, _base2, _base3, _base4, _base5, _base6, _base7, _base8, _base9;
var _base, _base1, _base10, _base11, _base2, _base3, _base4, _base5, _base6, _base7, _base8, _base9;
(_base = this.config).options || (_base.options = {});

@@ -265,9 +287,19 @@ (_base1 = this.config.options).textsize || (_base1.textsize = DEFAULT_TEXTSIZE);

(_base6 = this.config.options).tdsVersion || (_base6.tdsVersion = DEFAULT_TDS_VERSION);
(_base7 = this.config.options).isolationLevel || (_base7.isolationLevel = ISOLATION_LEVEL.READ_UNCOMMITTED);
(_base7 = this.config.options).isolationLevel || (_base7.isolationLevel = ISOLATION_LEVEL.READ_COMMITTED);
(_base8 = this.config.options).encrypt || (_base8.encrypt = false);
(_base9 = this.config.options).cryptoCredentialsDetails || (_base9.cryptoCredentialsDetails = {});
if ((_base10 = this.config.options).useUTC == null) {
_base10.useUTC = true;
}
if ((_base11 = this.config.options).useColumnNames == null) {
_base11.useColumnNames = false;
}
if (!this.config.options.port && !this.config.options.instanceName) {
return this.config.options.port = DEFAULT_PORT;
} else if (this.config.options.port && this.config.options.instanceName) {
throw new Error("Port and instanceName are mutually exclusive, but " + config.options.port + " and " + config.options.instanceName + " provided");
throw new Error("Port and instanceName are mutually exclusive, but " + this.config.options.port + " and " + this.config.options.instanceName + " provided");
} else if (this.config.options.port) {
if (this.config.options.port < 0 || this.config.options.port >  65536) {
throw new RangeError("Port should be > 0 and < 65536");
}
}

@@ -277,133 +309,209 @@ };

Connection.prototype.createDebug = function() {
var _this = this;
this.debug = new Debug(this.config.options.debug);
return this.debug.on('debug', function(message) {
return _this.emit('debug', message);
});
return this.debug.on('debug', (function(_this) {
return function(message) {
return _this.emit('debug', message);
};
})(this));
};
Connection.prototype.createTokenStreamParser = function() {
var _this = this;
this.tokenStreamParser = new TokenStreamParser(this.debug, void 0, this.config.options.tdsVersion);
this.tokenStreamParser.on('infoMessage', function(token) {
return _this.emit('infoMessage', token);
});
this.tokenStreamParser.on('errorMessage', function(token) {
_this.emit('errorMessage', token);
if (_this.request) {
return _this.request.error = token.message;
}
});
this.tokenStreamParser.on('databaseChange', function(token) {
return _this.emit('databaseChange', token.newValue);
});
this.tokenStreamParser.on('languageChange', function(token) {
return _this.emit('languageChange', token.newValue);
});
this.tokenStreamParser.on('charsetChange', function(token) {
return _this.emit('charsetChange', token.newValue);
});
this.tokenStreamParser.on('loginack', function(token) {
return _this.loggedIn = true;
});
this.tokenStreamParser.on('packetSizeChange', function(token) {
return _this.messageIo.packetSize(token.newValue);
});
this.tokenStreamParser.on('beginTransaction', function(token) {
return _this.transactionDescriptors.push(token.newValue);
});
this.tokenStreamParser.on('commitTransaction', function(token) {
return _this.transactionDescriptors.pop();
});
this.tokenStreamParser.on('rollbackTransaction', function(token) {
return _this.transactionDescriptors.pop();
});
this.tokenStreamParser.on('columnMetadata', function(token) {
if (_this.request) {
return _this.request.emit('columnMetadata', token.columns);
} else {
throw new Error("Received 'columnMetadata' when no sqlRequest is in progress");
}
});
this.tokenStreamParser.on('order', function(token) {
if (_this.request) {
return _this.request.emit('order', token.orderColumns);
} else {
throw new Error("Received 'order' when no sqlRequest is in progress");
}
});
this.tokenStreamParser.on('row', function(token) {
if (_this.request) {
if (_this.config.options.rowCollectionOnRequestCompletion || _this.config.options.rowCollectionOnDone) {
_this.request.rows.push(token.columns);
this.tokenStreamParser = new TokenStreamParser(this.debug, void 0, this.config.options);
this.tokenStreamParser.on('infoMessage', (function(_this) {
return function(token) {
return _this.emit('infoMessage', token);
};
})(this));
this.tokenStreamParser.on('errorMessage', (function(_this) {
return function(token) {
_this.emit('errorMessage', token);
if (_this.loggedIn) {
if (_this.request) {
return _this.request.error = RequestError(token.message, 'EREQUEST');
}
} else {
return _this.loginError = ConnectionError(token.message, 'ELOGIN');
}
return _this.request.emit('row', token.columns);
} else {
throw new Error("Received 'row' when no sqlRequest is in progress");
}
});
this.tokenStreamParser.on('returnStatus', function(token) {
if (_this.request) {
return _this.procReturnStatusValue = token.value;
}
});
this.tokenStreamParser.on('returnValue', function(token) {
if (_this.request) {
return _this.request.emit('returnValue', token.paramName, token.value, token.metadata);
}
});
this.tokenStreamParser.on('doneProc', function(token) {
if (_this.request) {
_this.request.emit('doneProc', token.rowCount, token.more, _this.procReturnStatusValue, _this.request.rows);
_this.procReturnStatusValue = void 0;
if (token.rowCount !== void 0) {
_this.request.rowCount += token.rowCount;
};
})(this));
this.tokenStreamParser.on('databaseChange', (function(_this) {
return function(token) {
return _this.emit('databaseChange', token.newValue);
};
})(this));
this.tokenStreamParser.on('languageChange', (function(_this) {
return function(token) {
return _this.emit('languageChange', token.newValue);
};
})(this));
this.tokenStreamParser.on('charsetChange', (function(_this) {
return function(token) {
return _this.emit('charsetChange', token.newValue);
};
})(this));
this.tokenStreamParser.on('loginack', (function(_this) {
return function(token) {
if (!token.tdsVersion) {
_this.loginError = ConnectionError("Server responded with unknown TDS version.");
_this.loggedIn = false;
return;
}
if (_this.config.options.rowCollectionOnDone) {
return _this.request.rows = [];
if (!token["interface"]) {
_this.loginError = ConnectionError("Server responded with unsupported interface.");
_this.loggedIn = false;
return;
}
}
});
this.tokenStreamParser.on('doneInProc', function(token) {
if (_this.request) {
_this.request.emit('doneInProc', token.rowCount, token.more, _this.request.rows);
if (token.rowCount !== void 0) {
_this.request.rowCount += token.rowCount;
_this.config.options.tdsVersion = token.tdsVersion;
return _this.loggedIn = true;
};
})(this));
this.tokenStreamParser.on('packetSizeChange', (function(_this) {
return function(token) {
return _this.messageIo.packetSize(token.newValue);
};
})(this));
this.tokenStreamParser.on('beginTransaction', (function(_this) {
return function(token) {
return _this.transactionDescriptors.push(token.newValue);
};
})(this));
this.tokenStreamParser.on('commitTransaction', (function(_this) {
return function(token) {
return _this.transactionDescriptors.pop();
};
})(this));
this.tokenStreamParser.on('rollbackTransaction', (function(_this) {
return function(token) {
return _this.transactionDescriptors.pop();
};
})(this));
this.tokenStreamParser.on('columnMetadata', (function(_this) {
return function(token) {
var col, columns, _i, _len, _ref1;
if (_this.request) {
if (_this.config.options.useColumnNames) {
columns = {};
_ref1 = token.columns;
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
col = _ref1[_i];
if (columns[col.colName] == null) {
columns[col.colName] = col;
}
}
} else {
columns = token.columns;
}
return _this.request.emit('columnMetadata', columns);
} else {
_this.emit('error', new Error("Received 'columnMetadata' when no sqlRequest is in progress"));
return _this.close();
}
if (_this.config.options.rowCollectionOnDone) {
return _this.request.rows = [];
};
})(this));
this.tokenStreamParser.on('order', (function(_this) {
return function(token) {
if (_this.request) {
return _this.request.emit('order', token.orderColumns);
} else {
_this.emit('error', new Error("Received 'order' when no sqlRequest is in progress"));
return _this.close();
}
}
});
this.tokenStreamParser.on('done', function(token) {
if (_this.request) {
_this.request.emit('done', token.rowCount, token.more, _this.request.rows);
if (token.rowCount !== void 0) {
_this.request.rowCount += token.rowCount;
};
})(this));
this.tokenStreamParser.on('row', (function(_this) {
return function(token) {
if (_this.request) {
if (_this.config.options.rowCollectionOnRequestCompletion || _this.config.options.rowCollectionOnDone) {
_this.request.rows.push(token.columns);
}
return _this.request.emit('row', token.columns);
} else {
_this.emit('error', new Error("Received 'row' when no sqlRequest is in progress"));
return _this.close();
}
if (_this.config.options.rowCollectionOnDone) {
return _this.request.rows = [];
};
})(this));
this.tokenStreamParser.on('returnStatus', (function(_this) {
return function(token) {
if (_this.request) {
return _this.procReturnStatusValue = token.value;
}
}
});
return this.tokenStreamParser.on('resetConnection', function(token) {
return _this.emit('resetConnection');
});
};
})(this));
this.tokenStreamParser.on('returnValue', (function(_this) {
return function(token) {
if (_this.request) {
return _this.request.emit('returnValue', token.paramName, token.value, token.metadata);
}
};
})(this));
this.tokenStreamParser.on('doneProc', (function(_this) {
return function(token) {
if (_this.request) {
_this.request.emit('doneProc', token.rowCount, token.more, _this.procReturnStatusValue, _this.request.rows);
_this.procReturnStatusValue = void 0;
if (token.rowCount !== void 0) {
_this.request.rowCount += token.rowCount;
}
if (_this.config.options.rowCollectionOnDone) {
return _this.request.rows = [];
}
}
};
})(this));
this.tokenStreamParser.on('doneInProc', (function(_this) {
return function(token) {
if (_this.request) {
_this.request.emit('doneInProc', token.rowCount, token.more, _this.request.rows);
if (token.rowCount !== void 0) {
_this.request.rowCount += token.rowCount;
}
if (_this.config.options.rowCollectionOnDone) {
return _this.request.rows = [];
}
}
};
})(this));
this.tokenStreamParser.on('done', (function(_this) {
return function(token) {
if (_this.request) {
_this.request.emit('done', token.rowCount, token.more, _this.request.rows);
if (token.rowCount !== void 0) {
_this.request.rowCount += token.rowCount;
}
if (_this.config.options.rowCollectionOnDone) {
_this.request.rows = [];
}
if (token.attention) {
return _this.request.canceled = true;
}
}
};
})(this));
this.tokenStreamParser.on('resetConnection', (function(_this) {
return function(token) {
return _this.emit('resetConnection');
};
})(this));
return this.tokenStreamParser.on('tokenStreamError', (function(_this) {
return function(error) {
_this.emit('error', error);
return _this.close();
};
})(this));
};
Connection.prototype.connect = function() {
var _this = this;
if (this.config.options.port) {
return this.connectOnPort(this.config.options.port);
} else {
return instanceLookup(this.config.server, this.config.options.instanceName, function(err, port) {
if (err) {
throw new Error(err);
} else {
return _this.connectOnPort(port);
}
});
return instanceLookup(this.config.server, this.config.options.instanceName, (function(_this) {
return function(err, port) {
if (err) {
return _this.emit('connect', ConnectionError(message, 'EINSTLOOKUP'));
} else {
return _this.connectOnPort(port);
}
};
})(this));
}

@@ -413,4 +521,2 @@ };

Connection.prototype.connectOnPort = function(port) {
var _this = this;
this.socket = new Socket({});

@@ -424,8 +530,12 @@ this.socket.setKeepAlive(true, KEEP_ALIVE_INITIAL_DELAY);

this.messageIo = new MessageIO(this.socket, this.config.options.packetSize, this.debug);
this.messageIo.on('data', function(data) {
return _this.dispatchEvent('data', data);
});
return this.messageIo.on('message', function() {
return _this.dispatchEvent('message');
});
this.messageIo.on('data', (function(_this) {
return function(data) {
return _this.dispatchEvent('data', data);
};
})(this));
return this.messageIo.on('message', (function(_this) {
return function() {
return _this.dispatchEvent('message');
};
})(this));
};

@@ -443,6 +553,5 @@

var message;
message = "timeout : failed to connect to " + this.config.server + ":" + this.config.options.port + " in " + this.config.options.connectTimeout + "ms";
message = "Failed to connect to " + this.config.server + ":" + this.config.options.port + " in " + this.config.options.connectTimeout + "ms";
this.debug.log(message);
this.emit('connect', message);
this.emit('connect', ConnectionError(message, 'ETIMEOUT'));
this.connectTimer = void 0;

@@ -459,8 +568,7 @@ return this.dispatchEvent('connectTimeout');

Connection.prototype.transitionTo = function(newState) {
var _ref, _ref1;
if ((_ref = this.state) != null ? _ref.exit : void 0) {
var _ref1, _ref2;
if ((_ref1 = this.state) != null ? _ref1.exit : void 0) {
this.state.exit.apply(this);
}
this.debug.log("State change: " + ((_ref1 = this.state) != null ? _ref1.name : void 0) + " -> " + newState.name);
this.debug.log("State change: " + ((_ref2 = this.state) != null ? _ref2.name : void 0) + " -> " + newState.name);
this.state = newState;

@@ -473,9 +581,9 @@ if (this.state.enter) {

Connection.prototype.dispatchEvent = function() {
var args, eventFunction, eventName, _ref;
var args, eventFunction, eventName, _ref1;
eventName = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
if ((_ref = this.state) != null ? _ref.events[eventName] : void 0) {
if ((_ref1 = this.state) != null ? _ref1.events[eventName] : void 0) {
return eventFunction = this.state.events[eventName].apply(this, args);
} else {
throw new Error("No event '" + eventName + "' in state '" + this.state.name + "'");
this.emit('error', new Error("No event '" + eventName + "' in state '" + this.state.name + "'"));
return this.close();
}

@@ -486,9 +594,8 @@ };

var message;
message = "connection to " + this.config.server + ":" + this.config.options.port + " - failed " + error;
message = "Failed to connect to " + this.config.server + ":" + this.config.options.port + " - " + error.message;
this.debug.log(message);
if (this.state === this.STATE.CONNECTING) {
this.emit('connect', message);
this.emit('connect', ConnectionError(message, 'ESOCKET'));
} else {
this.emit('errorMessage', message);
this.emit('error', ConnectionError(message));
}

@@ -510,3 +617,2 @@ return this.dispatchEvent('socketError', error);

var payload;
payload = new PreloginPayload({

@@ -531,3 +637,2 @@ encrypt: this.config.options.encrypt

var preloginPayload;
preloginPayload = new PreloginPayload(this.messageBuffer);

@@ -546,3 +651,2 @@ this.debug.payload(function() {

var loginData, payload;
loginData = {

@@ -564,20 +668,21 @@ userName: this.config.userName,

Connection.prototype.initiateTlsSslHandshake = function() {
var credentials, _base,
_this = this;
var credentials, _base;
(_base = this.config.options.cryptoCredentialsDetails).ciphers || (_base.ciphers = 'RC4-MD5');
credentials = crypto.createCredentials(this.config.options.cryptoCredentialsDetails);
this.securePair = tls.createSecurePair(credentials);
this.securePair.on('secure', function() {
var cipher;
cipher = _this.securePair.cleartext.getCipher();
_this.debug.log("TLS negotiated (" + cipher.name + ", " + cipher.version + ")");
_this.emit('secure', _this.securePair.cleartext);
_this.messageIo.encryptAllFutureTraffic();
return _this.dispatchEvent('tlsNegotiated');
});
this.securePair.encrypted.on('data', function(data) {
return _this.messageIo.sendMessage(TYPE.PRELOGIN, data);
});
this.securePair.on('secure', (function(_this) {
return function() {
var cipher;
cipher = _this.securePair.cleartext.getCipher();
_this.debug.log("TLS negotiated (" + cipher.name + ", " + cipher.version + ")");
_this.emit('secure', _this.securePair.cleartext);
_this.messageIo.encryptAllFutureTraffic();
return _this.dispatchEvent('tlsNegotiated');
};
})(this));
this.securePair.encrypted.on('data', (function(_this) {
return function(data) {
return _this.messageIo.sendMessage(TYPE.PRELOGIN, data);
};
})(this));
return this.messageIo.tlsNegotiationStarting(this.securePair);

@@ -592,4 +697,3 @@ };

var payload;
payload = new SqlBatchPayload(this.getInitialSql(), this.currentTransactionDescriptor());
payload = new SqlBatchPayload(this.getInitialSql(), this.currentTransactionDescriptor(), this.config.options);
return this.messageIo.sendMessage(TYPE.SQL_BATCH, payload.data);

@@ -611,3 +715,7 @@ };

} else {
this.emit('connect', 'Login failed; one or more errorMessage events should have been emitted');
if (this.loginError) {
this.emit('connect', this.loginError);
} else {
this.emit('connect', ConnectionError('Login failed.', 'ELOGIN'));
}
return this.dispatchEvent('loginFailed');

@@ -618,3 +726,3 @@ }

Connection.prototype.execSqlBatch = function(request) {
return this.makeRequest(request, TYPE.SQL_BATCH, new SqlBatchPayload(request.sqlTextOrProcedure, this.currentTransactionDescriptor()));
return this.makeRequest(request, TYPE.SQL_BATCH, new SqlBatchPayload(request.sqlTextOrProcedure, this.currentTransactionDescriptor(), this.config.options));
};

@@ -624,3 +732,3 @@

request.transformIntoExecuteSqlRpc();
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor()));
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
};

@@ -630,3 +738,3 @@

request.transformIntoPrepareRpc();
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor()));
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
};

@@ -636,3 +744,3 @@

request.transformIntoUnprepareRpc();
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor()));
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
};

@@ -642,20 +750,23 @@

request.transformIntoExecuteRpc(parameters);
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor()));
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
};
Connection.prototype.callProcedure = function(request) {
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor()));
return this.makeRequest(request, TYPE.RPC_REQUEST, new RpcRequestPayload(request, this.currentTransactionDescriptor(), this.config.options));
};
Connection.prototype.beginTransaction = function(callback, name, isolationLevel) {
var request, transaction,
_this = this;
var request, transaction;
name || (name = '');
isolationLevel || (isolationLevel = this.config.options.isolationLevel);
if (this.config.options.tdsVersion < "7_2") {
return callback(RequestError("Transactions are not supported on TDS 7.1."));
}
transaction = new Transaction(name, isolationLevel);
this.transactions.push(transaction);
request = new Request(void 0, function(err) {
return callback(err, _this.currentTransactionDescriptor());
});
request = new Request(void 0, (function(_this) {
return function(err) {
return callback(err, _this.currentTransactionDescriptor());
};
})(this));
return this.makeRequest(request, TYPE.TRANSACTION_MANAGER, transaction.beginPayload(this.currentTransactionDescriptor()));

@@ -666,5 +777,4 @@ };

var request, transaction;
if (this.transactions.length === 0) {
throw new Error('No transaction in progress');
return callback(RequestError('No transaction in progress', 'ENOTRNINPROG'));
}

@@ -678,5 +788,4 @@ transaction = this.transactions.pop();

var request, transaction;
if (this.transactions.length === 0) {
throw new Error('No transaction in progress');
return callback(RequestError('No transaction in progress', 'ENOTRNINPROG'));
}

@@ -690,7 +799,6 @@ transaction = this.transactions.pop();

var message;
if (this.state !== this.STATE.LOGGED_IN) {
message = "Invalid state; requests can only be made in the " + this.STATE.LOGGED_IN.name + " state, not the " + this.state.name + " state";
message = "Requests can only be made in the " + this.STATE.LOGGED_IN.name + " state, not the " + this.state.name + " state";
this.debug.log(message);
return request.callback(message);
return request.callback(RequestError(message, 'EINVALIDSTATE'));
} else {

@@ -709,5 +817,17 @@ this.request = request;

Connection.prototype.cancel = function() {
var message;
if (this.state !== this.STATE.SENT_CLIENT_REQUEST) {
message = "Requests can only be canceled in the " + this.STATE.SENT_CLIENT_REQUEST.name + " state, not the " + this.state.name + " state";
this.debug.log(message);
return false;
} else {
this.messageIo.sendMessage(TYPE.ATTENTION);
this.transitionTo(this.STATE.SENT_ATTENTION);
return true;
}
};
Connection.prototype.reset = function(callback) {
var request;
request = new Request(this.getInitialSql(), function(err, rowCount, rows) {

@@ -714,0 +834,0 @@ return callback(err);

@@ -1,3 +0,3 @@

// Generated by CoffeeScript 1.6.2
var EPOCH_DATE, MAX, NULL, TYPE, guidParser, id, type, typeByName;
// Generated by CoffeeScript 1.7.1
var EPOCH_DATE, MAX, NULL, TYPE, UTC_EPOCH_DATE, YEAR_ONE, guidParser, id, type, typeByName;

@@ -10,2 +10,6 @@ guidParser = require('./guid-parser');

UTC_EPOCH_DATE = new Date(Date.UTC(1900, 0, 1));
YEAR_ONE = Date.UTC(2000, 0, -730118);
MAX = (1 << 16) - 1;

@@ -24,8 +28,10 @@

},
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.IntN.id);
return buffer.writeUInt8(1);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.IntN.id);
buffer.writeUInt8(1);
if (parameter.value != null) {
buffer.writeUInt8(1);
return buffer.writeInt8(parseInt(parameter.value));
return buffer.writeUInt8(parseInt(parameter.value));
} else {

@@ -42,5 +48,7 @@ return buffer.writeUInt8(0);

},
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.BitN.id);
return buffer.writeUInt8(1);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.BitN.id);
buffer.writeUInt8(1);
if (typeof parameter.value === 'undefined' || parameter.value === null) {

@@ -60,5 +68,7 @@ return buffer.writeUInt8(0);

},
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.IntN.id);
return buffer.writeUInt8(2);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.IntN.id);
buffer.writeUInt8(2);
if (parameter.value != null) {

@@ -78,5 +88,7 @@ buffer.writeUInt8(2);

},
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.IntN.id);
return buffer.writeUInt8(4);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.IntN.id);
buffer.writeUInt8(4);
if (parameter.value != null) {

@@ -96,11 +108,16 @@ buffer.writeUInt8(4);

},
writeParameterData: function(buffer, parameter) {
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.DateTimeN.id);
return buffer.writeUInt8(4);
},
writeParameterData: function(buffer, parameter, options) {
var days, minutes;
buffer.writeUInt8(typeByName.DateTimeN.id);
buffer.writeUInt8(4);
if (parameter.value != null) {
days = (parameter.value.getTime() - EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24);
days = Math.floor(days);
minutes = (parameter.value.getHours() * 60) + parameter.value.getMinutes();
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);

@@ -120,5 +137,7 @@ buffer.writeUInt16LE(days);

},
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.FloatN.id);
return buffer.writeUInt8(4);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.FloatN.id);
buffer.writeUInt8(4);
if (parameter.value != null) {

@@ -134,3 +153,18 @@ buffer.writeUInt8(4);

type: 'MONEY',
name: '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);
}
}
},

@@ -143,18 +177,26 @@ 0x3D: {

},
writeParameterData: function(buffer, parameter) {
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.DateTimeN.id);
return buffer.writeUInt8(8);
},
writeParameterData: function(buffer, parameter, options) {
var days, milliseconds, seconds, threeHundredthsOfSecond;
buffer.writeUInt8(typeByName.DateTimeN.id);
buffer.writeUInt8(8);
if (parameter.value != null) {
days = (parameter.value.getTime() - EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24);
days = Math.floor(days);
seconds = parameter.value.getHours() * 60 * 60;
seconds += parameter.value.getMinutes() * 60;
seconds += parameter.value.getSeconds();
milliseconds = (seconds * 1000) + parameter.value.getMilliseconds();
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.writeUInt32LE(days);
buffer.writeInt32LE(days);
return buffer.writeUInt32LE(threeHundredthsOfSecond);

@@ -172,5 +214,7 @@ } else {

},
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.FloatN.id);
return buffer.writeUInt8(8);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.FloatN.id);
buffer.writeUInt8(8);
if (parameter.value != null) {

@@ -184,5 +228,156 @@ buffer.writeUInt8(8);

},
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 = 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 = 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'
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);
}
}
},

@@ -195,6 +390,8 @@ 0x7F: {

},
writeTypeInfo: function(buffer) {
buffer.writeUInt8(typeByName.IntN.id);
return buffer.writeUInt8(8);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.IntN.id);
buffer.writeUInt8(8);
if (parameter.value) {
if (parameter.value != null) {
buffer.writeUInt8(8);

@@ -217,3 +414,25 @@ if (parseInt(parameter.value) > 0x100000000) {

hasTextPointerAndTimestamp: true,
dataLengthLength: 4
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);
}
}
},

@@ -230,20 +449,20 @@ 0x23: {

},
writeParameterData: function(buffer, parameter) {
var length;
if (parameter.length) {
length = parameter.length;
} else if (parameter.value != null) {
length = parameter.value.toString().length;
resolveLength: function(parameter) {
if (parameter.value != null) {
return parameter.value.length;
} else {
length = -1;
return -1;
}
},
writeTypeInfo: function(buffer, parameter) {
buffer.writeUInt8(typeByName.Text.id);
buffer.writeInt32LE(length);
return buffer.writeInt32LE(parameter.length);
},
writeParameterData: function(buffer, parameter) {
buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
if (parameter.value != null) {
buffer.writeInt32LE(length);
buffer.writeInt32LE(parameter.length);
return buffer.writeString(parameter.value.toString(), 'ascii');
} else {
return buffer.writeInt32LE(length);
return buffer.writeInt32LE(parameter.length);
}

@@ -259,5 +478,10 @@ }

},
resolveLength: function(parameter) {
return 16;
},
writeTypeInfo: function(buffer, parameter) {
buffer.writeUInt8(typeByName.UniqueIdentifierN.id);
return buffer.writeUInt8(0x10);
},
writeParameterData: function(buffer, parameter) {
buffer.writeUInt8(typeByName.UniqueIdentifierN.id);
buffer.writeUInt8(0x10);
if (parameter.value != null) {

@@ -321,3 +545,54 @@ buffer.writeUInt8(0x10);

name: 'VarBinary',
dataLengthLength: 2
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);
}
}
}
},

@@ -332,7 +607,8 @@ 0xA7: {

var length;
if (parameter.length) {
length = parameter.length;
} else if (parameter.value != null) {
length = parameter.value.toString().length;
length = parameter.value.toString().length || 1;
} else if (parameter.value === null && !parameter.output) {
length = 1;
} else {

@@ -342,3 +618,3 @@ length = this.maximumLength;

if (length <= this.maximumLength) {
return "varchar(" + this.maximumLength + ")";
return "varchar(" + length + ")";
} else {

@@ -348,14 +624,18 @@ return "varchar(max)";

},
writeParameterData: function(buffer, parameter) {
var length;
if (parameter.length) {
length = parameter.length;
resolveLength: function(parameter) {
if (parameter.length != null) {
return parameter.length;
} else if (parameter.value != null) {
length = parameter.value.toString().length;
if (Buffer.isBuffer(parameter.value)) {
return parameter.value.length || 1;
} else {
return parameter.value.toString().length || 1;
}
} else {
length = this.maximumLength;
return this.maximumLength;
}
},
writeTypeInfo: function(buffer, parameter) {
buffer.writeUInt8(this.id);
if (length <= this.maximumLength) {
if (parameter.length <= this.maximumLength) {
buffer.writeUInt16LE(this.maximumLength);

@@ -365,15 +645,18 @@ } else {

}
buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
},
writeParameterData: function(buffer, parameter) {
if (parameter.value != null) {
if (length <= this.maximumLength) {
buffer.writeUInt16LE(length);
return buffer.writeString(parameter.value.toString(), 'ascii');
if (parameter.length <= this.maximumLength) {
return buffer.writeUsVarbyte(parameter.value, 'ascii');
} else {
buffer.writeUInt64LE(length);
buffer.writeUInt32LE(length);
buffer.writeString(parameter.value.toString(), 'ascii');
return buffer.writeUInt32LE(0);
return buffer.writePLPBody(parameter.value, 'ascii');
}
} else {
return buffer.writeUInt16LE(NULL);
if (parameter.length <= this.maximumLength) {
return buffer.writeUInt16LE(NULL);
} else {
buffer.writeUInt32LE(0xFFFFFFFF);
return buffer.writeUInt32LE(0xFFFFFFFF);
}
}

@@ -385,3 +668,26 @@ }

name: 'Binary',
dataLengthLength: 2
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);
}
}
},

@@ -402,7 +708,8 @@ 0xAF: {

var length;
if (parameter.length) {
length = 2 * parameter.length;
length = parameter.length;
} else if (parameter.value != null) {
length = 2 * parameter.value.toString().length;
length = parameter.value.toString().length || 1;
} else if (parameter.value === null && !parameter.output) {
length = 1;
} else {

@@ -412,3 +719,3 @@ length = this.maximumLength;

if (length <= this.maximumLength) {
return "nvarchar(" + this.maximumLength + ")";
return "nvarchar(" + length + ")";
} else {

@@ -418,31 +725,38 @@ return "nvarchar(max)";

},
writeParameterData: function(buffer, parameter) {
var length;
if (parameter.length) {
length = 2 * parameter.length;
resolveLength: function(parameter) {
if (parameter.length != null) {
return parameter.length;
} else if (parameter.value != null) {
length = 2 * parameter.value.toString().length;
if (Buffer.isBuffer(parameter.value)) {
return (parameter.value.length / 2) || 1;
} else {
return parameter.value.toString().length || 1;
}
} else {
length = this.maximumLength;
return this.maximumLength;
}
},
writeTypeInfo: function(buffer, parameter) {
buffer.writeUInt8(this.id);
if (length <= this.maximumLength) {
buffer.writeUInt16LE(this.maximumLength);
if (parameter.length <= this.maximumLength) {
buffer.writeUInt16LE(parameter.length * 2);
} else {
buffer.writeUInt16LE(MAX);
}
buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
return buffer.writeBuffer(new Buffer([0x00, 0x00, 0x00, 0x00, 0x00]));
},
writeParameterData: function(buffer, parameter) {
if (parameter.value != null) {
if (length <= this.maximumLength) {
buffer.writeUInt16LE(length);
return buffer.writeString(parameter.value.toString(), 'ucs2');
if (parameter.length <= this.maximumLength) {
return buffer.writeUsVarbyte(parameter.value, 'ucs2');
} else {
buffer.writeUInt64LE(length);
buffer.writeUInt32LE(length);
buffer.writeString(parameter.value.toString(), 'ucs2');
return buffer.writeUInt32LE(0);
return buffer.writePLPBody(parameter.value, 'ucs2');
}
} else {
return buffer.writeUInt16LE(NULL);
if (parameter.length <= this.maximumLength) {
return buffer.writeUInt16LE(NULL);
} else {
buffer.writeUInt32LE(0xFFFFFFFF);
return buffer.writeUInt32LE(0xFFFFFFFF);
}
}

@@ -461,12 +775,282 @@ }

hasSchemaPresent: true
},
0x29: {
type: 'TIMEN',
name: 'TimeN',
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',
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',
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',
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);
}
}
};
/*
DECIMALTYPE: 0x37 # Decimal (legacy support)
NUMERICTYPE: 0x3F # Numeric (legacy support)
DATENTYPE: 0x28 # (introduced in TDS 7.3)
TIMENTYPE: 0x29 # (introduced in TDS 7.3)
DATETIME2NTYPE: 0x2A # (introduced in TDS 7.3)
DATETIMEOFFSETNTYPE: 0x2B # (introduced in TDS 7.3)
CHARTYPE: 0x2F # Char (legacy support)

@@ -477,8 +1061,5 @@ VARCHARTYPE: 0x27 # VarChar (legacy support)

UDTTYPE: 0xF0 # CLR-UDT (introduced in TDS 7.2)
SSVARIANTTYPE: 0x62 # Sql_Variant (introduced in TDS 7.2)
*/
*/
typeByName = {};

@@ -485,0 +1066,0 @@

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var Debug, EventEmitter, util,

@@ -13,2 +13,3 @@ __hasProp = {}.hasOwnProperty,

/*

@@ -18,5 +19,4 @@ @options Which debug details should be sent.

payload - details of decoded payload
*/
*/
function Debug(options) {

@@ -23,0 +23,0 @@ this.options = options;

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var arrayToGuid, formatHex, guidToArray;

@@ -6,3 +6,2 @@

var b1, b10, b11, b12, b13, b14, b15, b16, b2, b3, b4, b5, b6, b7, b8, b9, final;
b1 = parseInt(guid.substring(6, 8), 16);

@@ -32,3 +31,2 @@ b2 = parseInt(guid.substring(4, 6), 16);

var hex;
hex = number.toString(16);

@@ -43,3 +41,2 @@ if (hex.length === 1) {

var guid;
guid = formatHex(array[3]) + formatHex(array[2]) + formatHex(array[1]) + formatHex(array[0]) + '-' + formatHex(array[5]) + formatHex(array[4]) + '-' + formatHex(array[7]) + formatHex(array[6]) + '-' + formatHex(array[8]) + formatHex(array[9]) + '-' + formatHex(array[10]) + formatHex(array[11]) + formatHex(array[12]) + formatHex(array[13]) + formatHex(array[14]) + formatHex(array[15]);

@@ -46,0 +43,0 @@ return guid.toUpperCase();

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var MYSTERY_HEADER_LENGTH, RETRIES, SQL_SERVER_BROWSER_PORT, TIMEOUT, dgram, parseBrowserResponse;

@@ -16,3 +16,2 @@

var error, makeAttempt, message, retriesLeft, socket, timedOut, timer;
timeout = timeout || TIMEOUT;

@@ -24,3 +23,2 @@ retriesLeft = retries || RETRIES;

var port;
if (timer) {

@@ -45,3 +43,3 @@ clearTimeout(timer);

socket.close();
return callback("Failed to lookup instance on " + server + " : " + err);
return callback("Failed to lookup instance on " + server + " - " + err.message);
};

@@ -55,3 +53,2 @@ timedOut = function() {

var request;
if (retriesLeft > 0) {

@@ -74,3 +71,2 @@ retriesLeft--;

var getPort, instance, instances, name, p, parts, port, value, _i, _j, _len, _ref;
instances = response.split(';;');

@@ -77,0 +73,0 @@ for (_i = 0, _len = instances.length; _i < _len; _i++) {

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
exports.name = 'Tedious';

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var FLAGS_1, FLAGS_2, FLAGS_3, Login7Payload, TYPE_FLAGS, WritableTrackingBuffer, libraryName, os, sprintf, versions;

@@ -65,11 +65,10 @@

/*
s2.2.6.3
*/
*/
Login7Payload = (function() {
function Login7Payload(loginData) {
var data, fixed, length, lengthLength, variable;
this.loginData = loginData;

@@ -89,3 +88,2 @@ lengthLength = 4;

var buffer;
this.tdsVersion = versions[this.loginData.tdsVersion];

@@ -119,3 +117,2 @@ this.packetSize = this.loginData.packetSize;

var variableData;
this.variableLengthsLength = (9 * 4) + 6 + (3 * 4) + 4;

@@ -175,3 +172,2 @@ if (this.loginData.tdsVersion === '7_1') {

var b, byte, highNibble, lowNibble, password, _i, _ref;
password = this.loginData.password || '';

@@ -178,0 +174,0 @@ password = new Buffer(password, 'ucs2');

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var EventEmitter, MessageIO, Packet, TYPE, isPacketComplete, packetHeaderLength, packetLength,

@@ -38,3 +38,2 @@ __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },

var endOfMessage, length, packet, packetsData;
if (this.packetBuffer.length > 0) {

@@ -90,4 +89,8 @@ this.packetBuffer = Buffer.concat([this.packetBuffer, data]);

var numberOfPackets, packet, packetNumber, packetPayload, payloadEnd, payloadStart, _i, _ref, _results;
numberOfPackets = (Math.floor((data.length - 1) / this.packetDataSize)) + 1;
if (data) {
numberOfPackets = (Math.floor((data.length - 1) / this.packetDataSize)) + 1;
} else {
numberOfPackets = 1;
data = new Buffer(0);
}
_results = [];

@@ -94,0 +97,0 @@ for (packetNumber = _i = 0, _ref = numberOfPackets - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; packetNumber = 0 <= _ref ? ++_i : --_i) {

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var TYPE, codepageByLcid, parse, sprintf;

@@ -10,6 +10,5 @@

parse = function(buffer, tdsVersion) {
var collation, collationData, dataLength, flags, metadata, precision, scale, schema, schemaPresent, type, typeNumber, userType;
if (tdsVersion < "7_2") {
parse = function(buffer, options) {
var collation, collationData, dataLength, flags, metadata, precision, scale, schema, schemaPresent, type, typeNumber, udtInfo, userType;
if (options.tdsVersion < "7_2") {
userType = buffer.readUInt16LE();

@@ -27,2 +26,5 @@ } else {

switch (type.dataLengthLength) {
case 0:
dataLength = void 0;
break;
case 1:

@@ -50,2 +52,5 @@ dataLength = buffer.readUInt8();

scale = buffer.readUInt8();
if (type.dataLengthFromScale) {
dataLength = type.dataLengthFromScale(scale);
}
} else {

@@ -79,2 +84,12 @@ scale = void 0;

}
udtInfo = void 0;
if (type.hasUDTInfo) {
udtInfo = {
maxByteSize: buffer.readUInt16LE(),
dbname: buffer.readBVarchar(),
owningSchema: buffer.readBVarchar(),
typeName: buffer.readBVarchar(),
assemblyName: buffer.readUsVarchar()
};
}
return metadata = {

@@ -88,3 +103,4 @@ userType: userType,

dataLength: dataLength,
schema: schema
schema: schema,
udtInfo: udtInfo
};

@@ -91,0 +107,0 @@ };

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var DEFAULT_PACKETID, DEFAULT_SPID, DEFAULT_WINDOW, HEADER_LENGTH, NL, OFFSET, Packet, STATUS, TYPE, isPacketComplete, name, packetLength, sprintf, typeByValue, value;

@@ -14,2 +14,3 @@

TABULAR_RESULT: 0x04,
ATTENTION: 0x06,
TRANSACTION_MANAGER: 0x0E,

@@ -55,3 +56,2 @@ LOGIN7: 0x10,

var type;
if (typeOrBuffer instanceof Buffer) {

@@ -81,3 +81,2 @@ this.buffer = typeOrBuffer;

var status;
status = this.buffer.readUInt8(OFFSET.Status);

@@ -94,3 +93,2 @@ if (reset) {

var status;
status = this.buffer.readUInt8(OFFSET.Status);

@@ -135,7 +133,5 @@ if (arguments.length > 0) {

var status, statuses;
status = this.buffer.readUInt8(OFFSET.Status);
statuses = (function() {
var _results;
_results = [];

@@ -157,3 +153,2 @@ for (name in STATUS) {

var text;
indent || (indent = '');

@@ -166,3 +161,2 @@ text = sprintf('type:0x%02X(%s), status:0x%02X(%s), length:0x%04X, spid:0x%04X, packetId:0x%02X, window:0x%02X', this.buffer.readUInt8(OFFSET.Type), typeByValue[this.buffer.readUInt8(OFFSET.Type)], this.buffer.readUInt8(OFFSET.Status), this.statusAsString(), this.buffer.readUInt16BE(OFFSET.Length), this.buffer.readUInt16BE(OFFSET.SPID), this.buffer.readUInt8(OFFSET.PacketID), this.buffer.readUInt8(OFFSET.Window));

var BYTES_PER_GROUP, BYTES_PER_LINE, CHARS_PER_GROUP, chars, data, dataDump, offset, _i, _ref;
BYTES_PER_GROUP = 0x04;

@@ -188,3 +182,5 @@ CHARS_PER_GROUP = 0x08;

}
dataDump += sprintf('%02X', data[offset]);
if (data[offset] != null) {
dataDump += sprintf('%02X', data[offset]);
}
if (((offset + 1) % BYTES_PER_GROUP === 0) && !((offset + 1) % BYTES_PER_LINE === 0)) {

@@ -191,0 +187,0 @@ dataDump += ' ';

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var ENCRYPT, MARS, PreloginPayload, SUBBUILD, TOKEN, VERSION, WritableTrackingBuffer, encryptByValue, marsByValue, name, optionBufferSize, sprintf, value;

@@ -49,7 +49,7 @@

/*
s2.2.6.4
*/
*/
PreloginPayload = (function() {

@@ -68,3 +68,2 @@ function PreloginPayload(bufferOrOptions) {

var length, option, optionDataOffset, optionOffset, options, _i, _j, _len, _len1;
options = [this.createVersionOption(), this.createEncryptionOption(), this.createInstanceOption(), this.createThreadIdOption(), this.createMarsOption()];

@@ -94,3 +93,2 @@ length = 0;

var buffer;
buffer = new WritableTrackingBuffer(optionBufferSize);

@@ -107,3 +105,2 @@ buffer.writeUInt32BE(VERSION);

var buffer;
buffer = new WritableTrackingBuffer(optionBufferSize);

@@ -123,3 +120,2 @@ if (this.options.encrypt) {

var buffer;
buffer = new WritableTrackingBuffer(optionBufferSize);

@@ -135,3 +131,2 @@ buffer.writeUInt8(0x00);

var buffer;
buffer = new WritableTrackingBuffer(optionBufferSize);

@@ -147,3 +142,2 @@ buffer.writeUInt32BE(0x00);

var buffer;
buffer = new WritableTrackingBuffer(optionBufferSize);

@@ -159,3 +153,2 @@ buffer.writeUInt8(MARS.OFF);

var dataLength, dataOffset, offset, _results;
offset = 0;

@@ -162,0 +155,0 @@ _results = [];

@@ -1,3 +0,3 @@

// Generated by CoffeeScript 1.6.2
var EventEmitter, Request, TYPES,
// Generated by CoffeeScript 1.7.1
var EventEmitter, Request, RequestError, TYPES,
__hasProp = {}.hasOwnProperty,

@@ -10,5 +10,11 @@ __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; };

RequestError = require('./errors').RequestError;
Request = (function(_super) {
__extends(Request, _super);
Request.prototype.error = null;
Request.prototype.canceled = false;
function Request(sqlTextOrProcedure, callback) {

@@ -33,10 +39,5 @@ this.sqlTextOrProcedure = sqlTextOrProcedure;

var parameter;
if (arguments.length < 4) {
if (typeof value === 'object' && !(value instanceof Date)) {
options = value;
value = void 0;
}
if (options == null) {
options = {};
}
options || (options = {});
parameter = {

@@ -47,3 +48,5 @@ type: type,

output: options.output || (options.output = false),
length: options.length
length: options.length,
precision: options.precision,
scale: options.scale
};

@@ -55,9 +58,5 @@ this.parameters.push(parameter);

Request.prototype.addOutputParameter = function(name, type, value, options) {
if (arguments.length < 4) {
if (typeof value === 'object' && !(value instanceof Date)) {
options = value;
value = void 0;
}
if (options == null) {
options = {};
}
options || (options = {});
options.output = true;

@@ -69,3 +68,2 @@ return this.addParameter(name, type, value, options);

var parameter, paramsParameter, _i, _len;
paramsParameter = '';

@@ -88,3 +86,2 @@ for (_i = 0, _len = parameters.length; _i < _len; _i++) {

var parameter, _i, _len, _ref;
this.originalParameters = this.parameters;

@@ -110,9 +107,11 @@ this.parameters = [];

this.preparing = true;
return this.on('returnValue', function(name, value, metadata) {
if (name === 'handle') {
return this.handle = value;
} else {
throw new Error("Unexpected output parameter " + name + " from sp_prepare");
}
});
return this.on('returnValue', (function(_this) {
return function(name, value, metadata) {
if (name === 'handle') {
return _this.handle = value;
} else {
return _this.error = RequestError("Tedious > Unexpected output parameter " + name + " from sp_prepare");
}
};
})(this));
};

@@ -128,3 +127,2 @@

var parameter, _i, _len, _ref;
this.parameters = [];

@@ -131,0 +129,0 @@ this.addParameter('handle', TYPES.Int, this.handle);

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var OPTION, RpcRequestPayload, STATUS, WritableTrackingBuffer, typeByName, writeAllHeaders;

@@ -21,16 +21,17 @@

/*
s2.2.6.5
*/
*/
RpcRequestPayload = (function() {
function RpcRequestPayload(request, txnDescriptor) {
var buffer, optionFlags, outstandingRequestCount, parameter, statusFlags, _i, _len, _ref;
function RpcRequestPayload(request, txnDescriptor, options) {
var buffer, optionFlags, outstandingRequestCount, param, parameter, statusFlags, _base, _base1, _base2, _i, _len, _ref, _ref1, _ref2, _ref3;
this.request = request;
buffer = new WritableTrackingBuffer(500);
this.procedure = this.request.sqlTextOrProcedure;
outstandingRequestCount = 1;
writeAllHeaders(buffer, txnDescriptor, outstandingRequestCount);
if (options.tdsVersion >= '7_2') {
outstandingRequestCount = 1;
writeAllHeaders(buffer, txnDescriptor, outstandingRequestCount);
}
if (typeof this.procedure === 'string') {

@@ -53,3 +54,16 @@ buffer.writeUsVarchar(this.procedure);

buffer.writeUInt8(statusFlags);
parameter.type.writeParameterData(buffer, parameter);
param = {
value: parameter.value
};
if ((parameter.type.id & 0x30) === 0x20) {
param.length = (_ref1 = parameter.length) != null ? _ref1 : typeof (_base = parameter.type).resolveLength === "function" ? _base.resolveLength(parameter) : void 0;
}
if (parameter.type.hasPrecision) {
param.precision = (_ref2 = parameter.precision) != null ? _ref2 : typeof (_base1 = parameter.type).resolvePrecision === "function" ? _base1.resolvePrecision(parameter) : void 0;
}
if (parameter.type.hasScale) {
param.scale = (_ref3 = parameter.scale) != null ? _ref3 : typeof (_base2 = parameter.type).resolveScale === "function" ? _base2.resolveScale(parameter) : void 0;
}
parameter.type.writeTypeInfo(buffer, param, options);
parameter.type.writeParameterData(buffer, param, options);
}

@@ -56,0 +70,0 @@ this.data = buffer.data;

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
modules.exports = {

@@ -3,0 +3,0 @@ Sp_Cursor: 1,

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var SqlBatchPayload, WritableTrackingBuffer, writeAllHeaders;

@@ -8,15 +8,16 @@

/*
s2.2.6.6
*/
*/
SqlBatchPayload = (function() {
function SqlBatchPayload(sqlText, txnDescriptor) {
function SqlBatchPayload(sqlText, txnDescriptor, options) {
var buffer, outstandingRequestCount;
this.sqlText = sqlText;
outstandingRequestCount = 1;
buffer = new WritableTrackingBuffer(100 + (2 * this.sqlText.length), 'ucs2');
writeAllHeaders(buffer, txnDescriptor, outstandingRequestCount);
if (options.tdsVersion >= '7_2') {
outstandingRequestCount = 1;
writeAllHeaders(buffer, txnDescriptor, outstandingRequestCount);
}
buffer.writeString(this.sqlText, 'ucs2');

@@ -23,0 +24,0 @@ this.data = buffer.data;

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var name, value, _ref;

@@ -8,3 +8,4 @@

'7_3_A': 0x730A0003,
'7_3_B': 0x730B0003
'7_3_B': 0x730B0003,
'7_4': 0x74000004
};

@@ -11,0 +12,0 @@

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
exports.statemachineLogLevel = 0;

@@ -3,0 +3,0 @@

@@ -1,26 +0,26 @@

// Generated by CoffeeScript 1.6.2
var DIGITS_REGEX, metadataParse, parser;
// Generated by CoffeeScript 1.7.1
var metadataParse, parser;
metadataParse = require('../metadata-parser');
DIGITS_REGEX = /^\d+$/;
parser = function(buffer, colMetadata, tdsVersion) {
parser = function(buffer, colMetadata, options) {
var c, colName, column, columnCount, columns, metadata, numberOfTableNameParts, part, tableName, _i;
columnCount = buffer.readUInt16LE();
columns = [];
for (c = _i = 1; 1 <= columnCount ? _i <= columnCount : _i >= columnCount; c = 1 <= columnCount ? ++_i : --_i) {
metadata = metadataParse(buffer, tdsVersion);
metadata = metadataParse(buffer, options);
if (metadata.type.hasTableName) {
numberOfTableNameParts = buffer.readUInt8();
tableName = (function() {
var _j, _results;
_results = [];
for (part = _j = 1; 1 <= numberOfTableNameParts ? _j <= numberOfTableNameParts : _j >= numberOfTableNameParts; part = 1 <= numberOfTableNameParts ? ++_j : --_j) {
_results.push(buffer.readUsVarchar('ucs2'));
}
return _results;
})();
if (options.tdsVersion >= '7_2') {
numberOfTableNameParts = buffer.readUInt8();
tableName = (function() {
var _j, _results;
_results = [];
for (part = _j = 1; 1 <= numberOfTableNameParts ? _j <= numberOfTableNameParts : _j >= numberOfTableNameParts; part = 1 <= numberOfTableNameParts ? ++_j : --_j) {
_results.push(buffer.readUsVarchar('ucs2'));
}
return _results;
})();
} else {
tableName = buffer.readUsVarchar('ucs2');
}
} else {

@@ -38,2 +38,3 @@ tableName = void 0;

scale: metadata.scale,
udtInfo: metadata.udtInfo,
dataLength: metadata.dataLength,

@@ -43,5 +44,2 @@ tableName: tableName

columns.push(column);
if (!(DIGITS_REGEX.test(column.colName))) {
columns[column.colName] = column;
}
}

@@ -48,0 +46,0 @@ return {

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var STATUS, doneInProcParser, doneParser, doneProcParser, parser, versions;

@@ -15,5 +15,4 @@

parser = function(buffer, tdsVersion) {
parser = function(buffer, options) {
var attention, curCmd, inTxn, more, rowCount, rowCountValid, serverError, sqlError, status, token;
status = buffer.readUInt16LE();

@@ -27,3 +26,3 @@ more = !!(status & STATUS.MORE);

curCmd = buffer.readUInt16LE();
if (tdsVersion < "7_2") {
if (options.tdsVersion < "7_2") {
rowCount = buffer.readUInt32LE();

@@ -48,6 +47,5 @@ } else {

doneParser = function(buffer, colMetadata, tdsVersion) {
doneParser = function(buffer, colMetadata, options) {
var token;
token = parser(buffer, tdsVersion);
token = parser(buffer, options);
token.name = 'DONE';

@@ -58,6 +56,5 @@ token.event = 'done';

doneInProcParser = function(buffer, colMetadata, tdsVersion) {
doneInProcParser = function(buffer, colMetadata, options) {
var token;
token = parser(buffer, tdsVersion);
token = parser(buffer, options);
token.name = 'DONEINPROC';

@@ -68,6 +65,5 @@ token.event = 'doneInProc';

doneProcParser = function(buffer, colMetadata, tdsVersion) {
doneProcParser = function(buffer, colMetadata, options) {
var token;
token = parser(buffer, tdsVersion);
token = parser(buffer, options);
token.name = 'DONEPROC';

@@ -74,0 +70,0 @@ token.event = 'doneProc';

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var EventEmitter, types;

@@ -54,3 +54,2 @@

var length, newValue, oldValue, type, typeNumber, valueLength;
length = buffer.readUInt16LE();

@@ -80,3 +79,5 @@ typeNumber = buffer.readUInt8();

default:
throw new Error("Unsupported ENVCHANGE type " + typeNumber + " " + type.name + " at offset " + (buffer.position - 1));
console.error("Tedious > Unsupported ENVCHANGE type " + typeNumber + " " + type.name + " at offset " + (buffer.position - 1));
buffer.readBuffer(length - 1);
return;
}

@@ -88,3 +89,5 @@ if (type.name === 'PACKET_SIZE') {

} else {
throw new Error("Unsupported ENVCHANGE type " + typeNumber + " at offset " + (buffer.position - 1));
console.error("Tedious > Unsupported ENVCHANGE type " + typeNumber + " at offset " + (buffer.position - 1));
buffer.readBuffer(length - 1);
return;
}

@@ -91,0 +94,0 @@ return {

@@ -1,7 +0,6 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var errorParser, infoParser, parser;
parser = function(buffer, tdsVersion) {
parser = function(buffer, options) {
var class_, length, lineNumber, message, number, procName, serverName, state, token;
length = buffer.readUInt16LE();

@@ -14,3 +13,3 @@ number = buffer.readUInt32LE();

procName = buffer.readBVarchar();
if (tdsVersion < '7_2') {
if (options.tdsVersion < '7_2') {
lineNumber = buffer.readUInt16LE();

@@ -31,6 +30,5 @@ } else {

infoParser = function(buffer, colMetadata, tdsVersion) {
infoParser = function(buffer, colMetadata, options) {
var token;
token = parser(buffer, tdsVersion);
token = parser(buffer, options);
token.name = 'INFO';

@@ -41,6 +39,5 @@ token.event = 'infoMessage';

errorParser = function(buffer, colMetadata, tdsVersion) {
errorParser = function(buffer, colMetadata, options) {
var token;
token = parser(buffer, tdsVersion);
token = parser(buffer, options);
token.name = 'ERROR';

@@ -47,0 +44,0 @@ token.event = 'errorMessage';

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var interfaceTypes, parser, versions;

@@ -13,14 +13,7 @@

var interfaceNumber, interfaceType, length, progName, progVersion, tdsVersion, tdsVersionNumber;
length = buffer.readUInt16LE();
interfaceNumber = buffer.readUInt8();
interfaceType = interfaceTypes[interfaceNumber];
if (!interfaceType) {
throw new Error("Unknown LOGINACK Interface " + interfaceNumber + " at offset " + buffer.position);
}
tdsVersionNumber = buffer.readUInt32BE();
tdsVersion = versions[tdsVersionNumber];
if (!tdsVersion) {
throw new Error("Unknown LOGINACK TDSVersion " + tdsVersionNumber + " at offset " + buffer.position);
}
progName = buffer.readBVarchar();

@@ -27,0 +20,0 @@ progVersion = {

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var parser;

@@ -6,3 +6,2 @@

var c, columnCount, orderColumns, _i;
columnCount = buffer.readUInt16LE() / 2;

@@ -9,0 +8,0 @@ orderColumns = [];

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var parser;

@@ -6,4 +6,3 @@

var token, value;
value = buffer.readUInt32LE();
value = buffer.readInt32LE();
return token = {

@@ -10,0 +9,0 @@ name: 'RETURNSTATUS',

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var metadataParse, parser, valueParse;

@@ -8,10 +8,9 @@

parser = function(buffer, colMetadata, tdsVersion) {
parser = function(buffer, colMetadata, options) {
var metadata, paramName, paramOrdinal, status, token, value;
paramOrdinal = buffer.readUInt16LE();
paramName = buffer.readBVarchar();
status = buffer.readUInt8();
metadata = metadataParse(buffer, tdsVersion);
value = valueParse(buffer, metadata);
metadata = metadataParse(buffer, options);
value = valueParse(buffer, metadata, options);
if (paramName.charAt(0) === '@') {

@@ -18,0 +17,0 @@ paramName = paramName.slice(1);

@@ -1,3 +0,3 @@

// Generated by CoffeeScript 1.6.2
var DIGITS_REGEX, parser, saveColumn, sprintf, valueParse;
// Generated by CoffeeScript 1.7.1
var parser, sprintf, valueParse;

@@ -8,11 +8,8 @@ valueParse = require('../value-parser');

DIGITS_REGEX = /^\d+$/;
parser = function(buffer, columnsMetaData) {
parser = function(buffer, columnsMetaData, options) {
var column, columnMetaData, columns, value, _i, _len;
columns = [];
columns = options.useColumnNames ? {} : [];
for (_i = 0, _len = columnsMetaData.length; _i < _len; _i++) {
columnMetaData = columnsMetaData[_i];
value = valueParse(buffer, columnMetaData);
value = valueParse(buffer, columnMetaData, options);
column = {

@@ -22,5 +19,8 @@ value: value,

};
columns.push(column);
if (!(DIGITS_REGEX.test(columnMetaData.colName))) {
saveColumn(columnMetaData.colName, columns, column);
if (options.useColumnNames) {
if (columns[columnMetaData.colName] == null) {
columns[columnMetaData.colName] = column;
}
} else {
columns.push(column);
}

@@ -35,15 +35,2 @@ }

saveColumn = function(columnName, columns, value) {
var entry;
entry = columns[columnName];
if (!entry) {
return columns[columnName] = value;
} else if (Array.isArray(entry)) {
return entry.push(value);
} else {
return columns[columnName] = [entry, value];
}
};
module.exports = parser;

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var EventEmitter, Parser, ReadableTrackingBuffer, TYPE, tokenParsers,

@@ -38,2 +38,5 @@ __hasProp = {}.hasOwnProperty,

tokenParsers[TYPE.NBCROW] = require('./nbcrow-token-parser');
/*

@@ -48,12 +51,11 @@ Buffers are thrown at the parser (by calling addBuffer).

parsing resumes.
*/
*/
Parser = (function(_super) {
__extends(Parser, _super);
function Parser(debug, colMetadata, tdsVersion) {
function Parser(debug, colMetadata, options) {
this.debug = debug;
this.colMetadata = colMetadata;
this.tdsVersion = tdsVersion;
this.options = options;
this.buffer = new ReadableTrackingBuffer(new Buffer(0), 'ucs2');

@@ -78,7 +80,9 @@ this.position = 0;

var error, token, type;
try {
if (!(this.buffer.buffer.length > this.buffer.position)) {
return false;
}
type = this.buffer.readUInt8();
if (tokenParsers[type]) {
token = tokenParsers[type](this.buffer, this.colMetadata, this.tdsVersion);
token = tokenParsers[type](this.buffer, this.colMetadata, this.options);
if (token) {

@@ -99,10 +103,12 @@ this.debug.token(token);

} else {
throw new Error("Unrecognised token " + type + " at offset " + this.buffer.position);
this.emit('tokenStreamError', "Unrecognized token " + type + " at offset " + this.buffer.position);
return false;
}
} catch (_error) {
error = _error;
if ((error != null ? error.error : void 0) === 'oob') {
if ((error != null ? error.code : void 0) === 'oob') {
return false;
} else {
throw error;
this.emit('tokenStreamError', error);
return false;
}

@@ -109,0 +115,0 @@ }

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var TYPE;

@@ -3,0 +3,0 @@

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var convertLEBytesToString, getNextRemainder, invert, isZero;

@@ -6,3 +6,2 @@

var byte, _i, _len;
for (_i = 0, _len = array.length; _i < _len; _i++) {

@@ -19,3 +18,2 @@ byte = array[_i];

var index, remainder, s, _i, _ref;
remainder = 0;

@@ -32,3 +30,2 @@ for (index = _i = _ref = array.length - 1; _i >= 0; index = _i += -1) {

var byte, index, _i, _j, _len, _len1, _results;
for (index = _i = 0, _len = array.length; _i < _len; index = ++_i) {

@@ -53,3 +50,2 @@ byte = array[index];

var array, result, sign, t;
array = Array.prototype.slice.call(buffer, 0, buffer.length);

@@ -56,0 +52,0 @@ if (isZero(array)) {

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var ReadableTrackingBuffer, convertLEBytesToString;

@@ -6,2 +6,3 @@

/*

@@ -12,5 +13,4 @@ A Buffer-like class that tracks position.

When reading, if the read would pass the end of the buffer, an error object is thrown.
*/
*/
ReadableTrackingBuffer = (function() {

@@ -34,11 +34,9 @@ function ReadableTrackingBuffer(buffer, encoding) {

ReadableTrackingBuffer.prototype.assertEnoughLeftFor = function(lengthRequired) {
var available;
var available, e;
this.previousPosition = this.position;
available = this.buffer.length - this.position;
if (available < lengthRequired) {
throw {
error: 'oob',
message: "required : " + lengthRequired + ", available : " + available
};
e = new Error("required : " + lengthRequired + ", available : " + available);
e.code = 'oob';
throw e;
}

@@ -57,3 +55,2 @@ };

var length, value;
length = 1;

@@ -67,3 +64,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 2;

@@ -77,3 +73,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 2;

@@ -87,3 +82,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 4;

@@ -97,3 +91,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 4;

@@ -107,3 +100,2 @@ this.assertEnoughLeftFor(length);

var length, value;
length = 1;

@@ -117,3 +109,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 2;

@@ -127,3 +118,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 2;

@@ -137,3 +127,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 4;

@@ -147,3 +136,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 4;

@@ -157,3 +145,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 4;

@@ -167,3 +154,2 @@ this.assertEnoughLeftFor(length);

var length;
length = 8;

@@ -175,5 +161,22 @@ this.assertEnoughLeftFor(length);

ReadableTrackingBuffer.prototype.readUInt24LE = function() {
var length, val;
length = 3;
this.assertEnoughLeftFor(length);
val |= this.buffer[this.position + 1] << 8;
val |= this.buffer[this.position];
val = val + (this.buffer[this.position + 2] << 16 >>> 0);
this.position += length;
return val;
};
ReadableTrackingBuffer.prototype.readUInt40LE = function() {
var high, low;
low = this.readBuffer(4).readUInt32LE(0);
high = Buffer.concat([this.readBuffer(1), new Buffer([0x00, 0x00, 0x00])]).readUInt32LE(0);
return low + (0x100000000 * high);
};
ReadableTrackingBuffer.prototype.readUInt64LE = function() {
var high, low;
low = this.readUInt32LE();

@@ -189,3 +192,2 @@ high = this.readUInt32LE();

var high, low;
low = this.readUInt32LE();

@@ -198,3 +200,2 @@ high = this.readUInt32LE();

var dword1, dword2, dword3;
dword1 = this.readUInt32LE();

@@ -208,3 +209,2 @@ dword2 = this.readUInt32LE();

var dword1, dword2, dword3, dword4;
dword1 = this.readUInt32LE();

@@ -226,3 +226,2 @@ dword2 = this.readUInt32LE();

var length, multiplier;
encoding || (encoding = this.encoding);

@@ -236,3 +235,2 @@ multiplier = encoding === 'ucs2' ? 2 : 1;

var length, multiplier;
encoding || (encoding = this.encoding);

@@ -239,0 +237,0 @@ multiplier = encoding === 'ucs2' ? 2 : 1;

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var ReadableTrackingBuffer, WritableTrackingBuffer;

@@ -3,0 +3,0 @@

@@ -1,6 +0,11 @@

// Generated by CoffeeScript 1.6.2
var WritableTrackingBuffer, buffertools;
// Generated by CoffeeScript 1.7.1
var SHIFT_LEFT_32, SHIFT_RIGHT_32, WritableTrackingBuffer, buffertools;
buffertools = require('../buffertools');
SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
/*

@@ -11,5 +16,4 @@ A Buffer-like class that tracks position.

When writing, automatically allocates new buffers if there's not enough space.
*/
*/
WritableTrackingBuffer = (function() {

@@ -36,3 +40,2 @@ function WritableTrackingBuffer(sizeIncrement, encoding) {

var buffer;
size || (size = this.sizeIncrement);

@@ -51,3 +54,2 @@ buffer = this.buffer.slice(0, this.position);

var length;
length = 1;

@@ -61,3 +63,2 @@ this.makeRoomFor(length);

var length;
length = 2;

@@ -75,3 +76,2 @@ this.makeRoomFor(length);

var length;
length = 2;

@@ -83,5 +83,14 @@ this.makeRoomFor(length);

WritableTrackingBuffer.prototype.writeUInt24LE = function(value) {
var length;
length = 3;
this.makeRoomFor(length);
this.buffer[this.position + 2] = (value >>> 16) & 0xff;
this.buffer[this.position + 1] = (value >>> 8) & 0xff;
this.buffer[this.position] = value & 0xff;
return this.position += length;
};
WritableTrackingBuffer.prototype.writeUInt32LE = function(value) {
var length;
length = 4;

@@ -95,3 +104,2 @@ this.makeRoomFor(length);

var high, low;
low = value % 0x100000000;

@@ -105,3 +113,2 @@ high = Math.floor(value / 0x100000000);

var length;
length = 4;

@@ -113,5 +120,14 @@ this.makeRoomFor(length);

WritableTrackingBuffer.prototype.writeUInt40LE = function(value) {
this.writeInt32LE(value & -1);
return this.writeUInt8(Math.floor(value * SHIFT_RIGHT_32));
};
WritableTrackingBuffer.prototype.writeUInt64LE = function(value) {
this.writeInt32LE(value & -1);
return this.writeUInt32LE(Math.floor(value * SHIFT_RIGHT_32));
};
WritableTrackingBuffer.prototype.writeInt8 = function(value) {
var length;
length = 1;

@@ -125,3 +141,2 @@ this.makeRoomFor(length);

var length;
length = 2;

@@ -135,3 +150,2 @@ this.makeRoomFor(length);

var length;
length = 2;

@@ -145,3 +159,2 @@ this.makeRoomFor(length);

var length;
length = 4;

@@ -155,3 +168,2 @@ this.makeRoomFor(length);

var length;
length = 4;

@@ -165,3 +177,2 @@ this.makeRoomFor(length);

var length;
length = 4;

@@ -175,3 +186,2 @@ this.makeRoomFor(length);

var length;
length = 8;

@@ -185,3 +195,2 @@ this.makeRoomFor(length);

var bytesWritten, length;
encoding || (encoding = this.encoding);

@@ -205,5 +214,48 @@ length = Buffer.byteLength(value, encoding);

WritableTrackingBuffer.prototype.writeUsVarbyte = function(value, encoding) {
var length;
if (encoding == null) {
encoding = this.encoding;
}
if (Buffer.isBuffer(value)) {
length = value.length;
} else {
value = value.toString();
length = Buffer.byteLength(value, encoding);
}
this.writeUInt16LE(length);
if (Buffer.isBuffer(value)) {
return this.writeBuffer(value);
} else {
this.makeRoomFor(length);
this.buffer.write(value, this.position, encoding);
return this.position += length;
}
};
WritableTrackingBuffer.prototype.writePLPBody = function(value, encoding) {
var length;
if (encoding == null) {
encoding = this.encoding;
}
if (Buffer.isBuffer(value)) {
length = value.length;
} else {
value = value.toString();
length = Buffer.byteLength(value, encoding);
}
this.writeUInt64LE(length);
this.writeUInt32LE(length);
if (Buffer.isBuffer(value)) {
this.writeBuffer(value);
} else {
this.makeRoomFor(length);
this.buffer.write(value, this.position, encoding);
this.position += length;
}
return this.writeUInt32LE(0);
};
WritableTrackingBuffer.prototype.writeBuffer = function(value) {
var length;
length = value.length;

@@ -215,2 +267,7 @@ this.makeRoomFor(length);

WritableTrackingBuffer.prototype.writeMoney = function(value) {
this.writeInt32LE(Math.floor(value * SHIFT_RIGHT_32));
return this.writeInt32LE(value & -1);
};
return WritableTrackingBuffer;

@@ -217,0 +274,0 @@

@@ -1,2 +0,2 @@

// Generated by CoffeeScript 1.6.2
// Generated by CoffeeScript 1.7.1
var ISOLATION_LEVEL, OPERATION_TYPE, Transaction, WritableTrackingBuffer, isolationLevelByValue, name, value, writeAllHeaders;

@@ -8,7 +8,7 @@

/*
s2.2.6.8
*/
*/
OPERATION_TYPE = {

@@ -48,5 +48,3 @@ TM_GET_DTC_ADDRESS: 0x00,

Transaction.prototype.beginPayload = function(txnDescriptor) {
var buffer, payload,
_this = this;
var buffer, payload;
buffer = new WritableTrackingBuffer(100, 'ucs2');

@@ -60,5 +58,7 @@ writeAllHeaders(buffer, txnDescriptor, this.outstandingRequestCount);

data: buffer.data,
toString: function() {
return "Begin Transaction: name=" + _this.name + ", isolationLevel=" + isolationLevelByValue[_this.isolationLevel];
}
toString: (function(_this) {
return function() {
return "Begin Transaction: name=" + _this.name + ", isolationLevel=" + isolationLevelByValue[_this.isolationLevel];
};
})(this)
};

@@ -68,5 +68,3 @@ };

Transaction.prototype.commitPayload = function(txnDescriptor) {
var buffer, payload,
_this = this;
var buffer, payload;
buffer = new WritableTrackingBuffer(100, 'ascii');

@@ -80,5 +78,7 @@ writeAllHeaders(buffer, txnDescriptor, this.outstandingRequestCount);

data: buffer.data,
toString: function() {
return "Commit Transaction: name=" + _this.name;
}
toString: (function(_this) {
return function() {
return "Commit Transaction: name=" + _this.name;
};
})(this)
};

@@ -88,5 +88,3 @@ };

Transaction.prototype.rollbackPayload = function(txnDescriptor) {
var buffer, payload,
_this = this;
var buffer, payload;
buffer = new WritableTrackingBuffer(100, 'ascii');

@@ -100,5 +98,7 @@ writeAllHeaders(buffer, txnDescriptor, this.outstandingRequestCount);

data: buffer.data,
toString: function() {
return "Rollback Transaction: name=" + _this.name;
}
toString: (function(_this) {
return function() {
return "Rollback Transaction: name=" + _this.name;
};
})(this)
};

@@ -105,0 +105,0 @@ };

@@ -1,3 +0,3 @@

// Generated by CoffeeScript 1.6.2
var MAX, MONEY_DIVISOR, NULL, PLP_NULL, THREE_AND_A_THIRD, UNKNOWN_PLP_LEN, guidParser, iconv, parse, readBinary, readChars, readDateTime, readMax, readMaxBinary, readMaxChars, readMaxNChars, readNChars, readSmallDateTime, sprintf;
// Generated by CoffeeScript 1.7.1
var MAX, MONEY_DIVISOR, NULL, PLP_NULL, THREE_AND_A_THIRD, UNKNOWN_PLP_LEN, guidParser, iconv, parse, readBinary, readChars, readDate, readDateTime, readDateTime2, readDateTimeOffset, readMax, readMaxBinary, readMaxChars, readMaxNChars, readNChars, readSmallDateTime, readTime, sprintf;

@@ -24,5 +24,4 @@ iconv = require('iconv-lite');

parse = function(buffer, metaData) {
parse = function(buffer, metaData, options) {
var codepage, dataLength, high, low, sign, textPointerLength, textPointerNull, type, value;
value = void 0;

@@ -50,2 +49,5 @@ dataLength = void 0;

switch (type.dataLengthLength) {
case 0:
dataLength = void 0;
break;
case 1:

@@ -91,3 +93,3 @@ dataLength = buffer.readUInt8();

case 1:
value = buffer.readInt8();
value = buffer.readUInt8();
break;

@@ -210,6 +212,6 @@ case 2:

case 'SmallDateTime':
value = readSmallDateTime(buffer);
value = readSmallDateTime(buffer, options.useUTC);
break;
case 'DateTime':
value = readDateTime(buffer);
value = readDateTime(buffer, options.useUTC);
break;

@@ -222,8 +224,36 @@ case 'DateTimeN':

case 4:
value = readSmallDateTime(buffer);
value = readSmallDateTime(buffer, options.useUTC);
break;
case 8:
value = readDateTime(buffer);
value = readDateTime(buffer, options.useUTC);
}
break;
case 'TimeN':
if ((dataLength = buffer.readUInt8()) === 0) {
value = null;
} else {
value = readTime(buffer, dataLength, metaData.scale);
}
break;
case 'DateN':
if ((dataLength = buffer.readUInt8()) === 0) {
value = null;
} else {
value = readDate(buffer);
}
break;
case 'DateTime2N':
if ((dataLength = buffer.readUInt8()) === 0) {
value = null;
} else {
value = readDateTime2(buffer, dataLength, metaData.scale);
}
break;
case 'DateTimeOffsetN':
if ((dataLength = buffer.readUInt8()) === 0) {
value = null;
} else {
value = readDateTimeOffset(buffer, dataLength, metaData.scale);
}
break;
case 'NumericN':

@@ -268,2 +298,5 @@ case 'DecimalN':

break;
case 'UDT':
value = readMaxBinary(buffer);
break;
default:

@@ -280,3 +313,3 @@ throw new Error(sprintf('Unrecognised type %s at offset 0x%04X', type.name, buffer.position));

} else {
return buffer.readArray(dataLength);
return buffer.readBuffer(dataLength);
}

@@ -303,3 +336,3 @@ };

return readMax(buffer, function(valueBuffer) {
return Array.prototype.slice.call(valueBuffer);
return valueBuffer;
});

@@ -322,3 +355,2 @@ };

var chunk, chunkLength, chunks, expectedLength, length, position, type, valueBuffer, _i, _len;
type = buffer.readBuffer(8);

@@ -358,25 +390,91 @@ if (type.equals(PLP_NULL)) {

readSmallDateTime = function(buffer) {
readSmallDateTime = function(buffer, useUTC) {
var days, minutes, value;
days = buffer.readUInt16LE();
minutes = buffer.readUInt16LE();
value = new Date(1900, 0, 1);
value.setDate(value.getDate() + days);
value.setMinutes(value.getMinutes() + minutes);
if (useUTC) {
value = new Date(Date.UTC(1900, 0, 1));
value.setUTCDate(value.getUTCDate() + days);
value.setUTCMinutes(value.getUTCMinutes() + minutes);
} else {
value = new Date(1900, 0, 1);
value.setDate(value.getDate() + days);
value.setMinutes(value.getMinutes() + minutes);
}
return value;
};
readDateTime = function(buffer) {
readDateTime = function(buffer, useUTC) {
var days, milliseconds, threeHundredthsOfSecond, value;
days = buffer.readInt32LE();
threeHundredthsOfSecond = buffer.readUInt32LE();
milliseconds = threeHundredthsOfSecond * THREE_AND_A_THIRD;
value = new Date(1900, 0, 1);
value.setDate(value.getDate() + days);
value.setMilliseconds(value.getMilliseconds() + milliseconds);
if (useUTC) {
value = new Date(Date.UTC(1900, 0, 1));
value.setUTCDate(value.getUTCDate() + days);
value.setUTCMilliseconds(value.getUTCMilliseconds() + milliseconds);
} else {
value = new Date(1900, 0, 1);
value.setDate(value.getDate() + days);
value.setMilliseconds(value.getMilliseconds() + milliseconds);
}
return value;
};
readTime = function(buffer, dataLength, scale) {
var date, i, value, _i, _ref;
switch (dataLength) {
case 3:
value = buffer.readUInt24LE();
break;
case 4:
value = buffer.readUInt32LE();
break;
case 5:
value = buffer.readUInt40LE();
}
if (scale < 7) {
for (i = _i = _ref = scale + 1; _ref <= 7 ? _i <= 7 : _i >= 7; i = _ref <= 7 ? ++_i : --_i) {
value *= 10;
}
}
date = new Date(Date.UTC(1970, 0, 1, 0, 0, 0, value / 10000));
Object.defineProperty(date, "nanosecondsDelta", {
enumerable: false,
value: (value % 10000) / Math.pow(10, 7)
});
return date;
};
readDate = function(buffer) {
var days;
days = buffer.readUInt24LE();
return new Date(Date.UTC(2000, 0, days - 730118));
};
readDateTime2 = function(buffer, dataLength, scale) {
var date, days, time;
time = readTime(buffer, dataLength - 3, scale);
days = buffer.readUInt24LE();
date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
Object.defineProperty(date, "nanosecondsDelta", {
enumerable: false,
value: time.nanosecondsDelta
});
return date;
};
readDateTimeOffset = function(buffer, dataLength, scale) {
var date, days, offset, time;
time = readTime(buffer, dataLength - 5, scale);
days = buffer.readUInt24LE();
offset = buffer.readInt16LE();
date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
Object.defineProperty(date, "nanosecondsDelta", {
enumerable: false,
value: time.nanosecondsDelta
});
return date;
};
module.exports = parse;

@@ -7,2 +7,3 @@ {

"lastonesky",
"Patrik Simek <patrik@patriksimek.cz>",
"Phil Dodderidge <pdodde@poyntz.com>",

@@ -18,3 +19,4 @@ "Zach Aller"

"sqlserver",
"tds"
"tds",
"msnodesql"
],

@@ -29,13 +31,13 @@ "homepage": "https://github.com/pekim/tedious",

],
"version": "0.1.5",
"version": "0.2.1",
"main": "./lib/tedious.js",
"repository": {
"type": "git",
"url": "git://github.com/pekim/tedious.git"
"url": "https://github.com/pekim/tedious.git"
},
"engines": {
"node": "0.6 || 0.7 || 0.8 || 0.9"
"node": "0.6 || 0.7 || 0.8 || 0.9 || 0.10 || 0.11"
},
"dependencies": {
"async": "0.2.6",
"async": "0.2.10",
"iconv-lite": "0.2.7",

@@ -45,4 +47,4 @@ "sprintf": "0.1.1"

"devDependencies": {
"coffee-script": "1.6.2",
"nodeunit": "0.8.0"
"coffee-script": "1.7.1",
"nodeunit": "0.8.4"
},

@@ -49,0 +51,0 @@ "scripts": {

@@ -1,44 +0,64 @@

Tedious (node implementation of TDS)
====================================
[![Build Status](https://secure.travis-ci.org/pekim/tedious.png)](http://travis-ci.org/pekim/tedious)
# Tedious (node implementation of TDS)
[![Dependency Status](https://david-dm.org/pekim/tedious.png)](https://david-dm.org/pekim/tedious) [![NPM version](https://badge.fury.io/js/tedious.png)](http://badge.fury.io/js/tedious) [![Build Status](https://secure.travis-ci.org/pekim/tedious.png)](http://travis-ci.org/pekim/tedious)
Tedious is an implementation of the [TDS protocol](http://msdn.microsoft.com/en-us/library/dd304523.aspx),
which is used to interact with instances of Microsoft's SQL Server.
which is used to interact with instances of Microsoft's SQL Server. It is intended to be a fairly slim implementation of the protocol, with not too much additional functionality.
It is intended to be a fairly slim implementation of the protocol, with not too much additional functionality.
## What's new in 0.2.0
Name
----
_Tedious_ is simply derived from a fast, slightly garbled, pronunciation of the letters T, D and S.
- Added support for TDS 7.4
- Added request cancelation
- Added support for UDT, TVP, Time, Date, DateTime2 and DateTimeOffset data types
- Added option to choose whether to pass/receive times in UTC or local time (`useUTC`)
- Binary, VarBinary, Image, Numeric, Decimal, SmallMoney and Money are now supported as input parameters
- Binary, VarBinary and Image types are now returned as Buffer (was Array)
- Connection errors are now correctly propagated to `connect` event
- Better support for numeric column names and columns with same name
- Errors are now instanceof Error / ConnectionError / RequestError (was plain text)
- Transaction isolationLevel default is now `READ_COMMITED` (was `READ_UNCOMMITED`)
- Fixed issue when zero value was casted as null when using BigInt as input parameter
- Fixed issue when dates before 1900/01/01 in input parameters resulted in "Out of bounds" error
- Fixed negative return values
- Fixed compatibility with TDS 7.1 (SQL Server 2000)
- Minor fixes
Status
------
Current version: v0.1.5
### Upgrade from 0.1.5 to 0.2.0
Coming soon
-----------
Although subject to change, this is the rough plan for the next few versions.
- Time values are now passed/received in UTC instead of local time. You can disable this by `options.useUTC = false`.
- There was a change in default transaction isolationLevel from `READ_UNCOMMITED` to `READ_COMMITED`. You can disable this by `options.isolationLevel = require('tedious').ISOLATION_LEVEL.READ_UNCOMMITTED`.
- Binary values are now returned in Buffers.
- All error values are no longer strings, but instances of Error.
- Results (rows and column metadata) are now simple arrays. You can change this to key-value collections by `options.useColumnNames = true`.
- support for more data types for parameters
- possible support for varchar(max), nvarchar(max) and varbinary(max) as streams
### Supported TDS versions
### unplanned ###
- decoding of column metadata flags
- full decoding of collation data
- ability to cancel a request
- TDS 7.4 (SQL Server 2012/2014)
- TDS 7.3.A (SQL Server 2008 R2)
- TDS 7.3.B (SQL Server 2008)
- TDS 7.2 (SQL Server 2005)
- TDS 7.1 (SQL Server 2000)
Documentation
-------------
## Installation
npm install tedious
<a name="documentation" />
## Documentation
More documentation is available at [pekim.github.io/tedious/](http://pekim.github.io/tedious/)
Discussion
----------
<a name="discussion" />
## Discussion
Google Group - http://groups.google.com/group/node-tedious
Licence
-------
(The MIT License)
<a name="name" />
## Name
_Tedious_ is simply derived from a fast, slightly garbled, pronunciation of the letters T, D and S.
Copyright (c) 2010-2012 Mike D Pilsbury
<a name="license" />
## Licence
Copyright (c) 2010-2014 Mike D Pilsbury
The MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

@@ -45,0 +65,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc