@vuept/loopback-connector-mssql
Version:
Microsoft SQL Server connector for LoopBack
248 lines (214 loc) • 6.54 kB
JavaScript
'use strict';
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var sprintf = require('sprintf-js').sprintf;
var HEADER_LENGTH = module.exports.HEADER_LENGTH = 8;
var TYPE = module.exports.TYPE = {
SQL_BATCH: 0x01,
RPC_REQUEST: 0x03,
TABULAR_RESULT: 0x04,
ATTENTION: 0x06,
BULK_LOAD: 0x07,
TRANSACTION_MANAGER: 0x0E,
LOGIN7: 0x10,
NTLMAUTH_PKT: 0x11,
PRELOGIN: 0x12
};
var typeByValue = {};
for (var name in TYPE) {
typeByValue[TYPE[name]] = name;
}
var STATUS = {
NORMAL: 0x00,
EOM: 0x01,
IGNORE: 0x02,
RESETCONNECTION: 0x08,
RESETCONNECTIONSKIPTRAN: 0x10
};
var OFFSET = module.exports.OFFSET = {
Type: 0,
Status: 1,
Length: 2,
SPID: 4,
PacketID: 6,
Window: 7
};
var DEFAULT_SPID = 0;
var DEFAULT_PACKETID = 1;
var DEFAULT_WINDOW = 0;
var NL = '\n';
var Packet = function () {
function Packet(typeOrBuffer) {
(0, _classCallCheck3.default)(this, Packet);
if (typeOrBuffer instanceof Buffer) {
this.buffer = typeOrBuffer;
} else {
var type = typeOrBuffer;
this.buffer = new Buffer(HEADER_LENGTH).fill(0);
this.buffer.writeUInt8(type, OFFSET.Type);
this.buffer.writeUInt8(STATUS.NORMAL, OFFSET.Status);
this.buffer.writeUInt16BE(DEFAULT_SPID, OFFSET.SPID);
this.buffer.writeUInt8(DEFAULT_PACKETID, OFFSET.PacketID);
this.buffer.writeUInt8(DEFAULT_WINDOW, OFFSET.Window);
this.setLength();
}
}
(0, _createClass3.default)(Packet, [{
key: 'setLength',
value: function setLength() {
this.buffer.writeUInt16BE(this.buffer.length, OFFSET.Length);
}
}, {
key: 'length',
value: function length() {
return this.buffer.readUInt16BE(OFFSET.Length);
}
}, {
key: 'resetConnection',
value: function resetConnection(reset) {
var status = this.buffer.readUInt8(OFFSET.Status);
if (reset) {
status |= STATUS.RESETCONNECTION;
} else {
status &= 0xFF - STATUS.RESETCONNECTION;
}
this.buffer.writeUInt8(status, OFFSET.Status);
}
}, {
key: 'last',
value: function last(_last) {
var status = this.buffer.readUInt8(OFFSET.Status);
if (arguments.length > 0) {
if (_last) {
status |= STATUS.EOM;
} else {
status &= 0xFF - STATUS.EOM;
}
this.buffer.writeUInt8(status, OFFSET.Status);
}
return this.isLast();
}
}, {
key: 'isLast',
value: function isLast() {
return !!(this.buffer.readUInt8(OFFSET.Status) & STATUS.EOM);
}
}, {
key: 'packetId',
value: function packetId(_packetId) {
if (_packetId) {
this.buffer.writeUInt8(_packetId % 256, OFFSET.PacketID);
}
return this.buffer.readUInt8(OFFSET.PacketID);
}
}, {
key: 'addData',
value: function addData(data) {
this.buffer = Buffer.concat([this.buffer, data]);
this.setLength();
return this;
}
}, {
key: 'data',
value: function data() {
return this.buffer.slice(HEADER_LENGTH);
}
}, {
key: 'type',
value: function type() {
return this.buffer.readUInt8(OFFSET.Type);
}
}, {
key: 'statusAsString',
value: function statusAsString() {
var status = this.buffer.readUInt8(OFFSET.Status);
var statuses = [];
for (var _name in STATUS) {
var value = STATUS[_name];
if (status & value) {
statuses.push(_name);
} else {
statuses.push(undefined);
}
}
return statuses.join(' ').trim();
}
}, {
key: 'headerToString',
value: function headerToString(indent) {
indent || (indent = '');
var 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));
return indent + text;
}
}, {
key: 'dataToString',
value: function dataToString(indent) {
indent || (indent = '');
var BYTES_PER_GROUP = 0x04;
var CHARS_PER_GROUP = 0x08;
var BYTES_PER_LINE = 0x20;
var data = this.data();
var dataDump = '';
var chars = '';
for (var offset = 0; offset < data.length; offset++) {
if (offset % BYTES_PER_LINE === 0) {
dataDump += indent;
dataDump += sprintf('%04X ', offset);
}
if (data[offset] < 0x20 || data[offset] > 0x7E) {
chars += '.';
if ((offset + 1) % CHARS_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) {
chars += ' ';
}
} else {
chars += String.fromCharCode(data[offset]);
}
if (data[offset] != null) {
dataDump += sprintf('%02X', data[offset]);
}
if ((offset + 1) % BYTES_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) {
dataDump += ' ';
}
if ((offset + 1) % BYTES_PER_LINE === 0) {
dataDump += ' ' + chars;
chars = '';
if (offset < data.length - 1) {
dataDump += NL;
}
}
}
if (chars.length) {
dataDump += ' ' + chars;
}
return dataDump;
}
}, {
key: 'toString',
value: function toString(indent) {
indent || (indent = '');
return this.headerToString(indent) + '\n' + this.dataToString(indent + indent);
}
}, {
key: 'payloadString',
value: function payloadString() {
return '';
}
}]);
return Packet;
}();
module.exports.Packet = Packet;
module.exports.isPacketComplete = isPacketComplete;
function isPacketComplete(potentialPacketBuffer) {
if (potentialPacketBuffer.length < HEADER_LENGTH) {
return false;
} else {
return potentialPacketBuffer.length >= potentialPacketBuffer.readUInt16BE(OFFSET.Length);
}
}
module.exports.packetLength = packetLength;
function packetLength(potentialPacketBuffer) {
return potentialPacketBuffer.readUInt16BE(OFFSET.Length);
}