UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

289 lines (248 loc) 8.44 kB
// Generated by CoffeeScript 1.7.1 var SHIFT_LEFT_32, SHIFT_RIGHT_32, UNKNOWN_PLP_LEN, WritableTrackingBuffer, bigint, buffertools; bigint = require('./bigint'); buffertools = require('../buffertools'); SHIFT_LEFT_32 = (1 << 16) * (1 << 16); SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; UNKNOWN_PLP_LEN = new Buffer([0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]); /* A Buffer-like class that tracks position. As values are written, the position advances by the size of the written data. When writing, automatically allocates new buffers if there's not enough space. */ WritableTrackingBuffer = (function() { function WritableTrackingBuffer(initialSize, encoding, doubleSizeGrowth) { this.initialSize = initialSize; this.encoding = encoding; this.doubleSizeGrowth = doubleSizeGrowth; this.doubleSizeGrowth || (this.doubleSizeGrowth = false); this.encoding || (this.encoding = 'ucs2'); this.buffer = new Buffer(this.initialSize); this.position = 0; this.__defineGetter__("data", function() { this.newBuffer(0); return this.compositeBuffer; }); } WritableTrackingBuffer.prototype.copyFrom = function(buffer) { var length; length = buffer.length; this.makeRoomFor(length); buffer.copy(this.buffer, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.makeRoomFor = function(requiredLength) { var size; if (this.buffer.length - this.position < requiredLength) { if (this.doubleSizeGrowth) { size = this.buffer.length * 2; while (size < requiredLength) { size *= 2; } return this.newBuffer(size); } else { return this.newBuffer(requiredLength); } } }; WritableTrackingBuffer.prototype.newBuffer = function(size) { var buffer; size || (size = this.initialSize); buffer = this.buffer.slice(0, this.position); if (this.compositeBuffer) { this.compositeBuffer = Buffer.concat([this.compositeBuffer, buffer]); } else { this.compositeBuffer = buffer; } this.buffer = new Buffer(size); return this.position = 0; }; WritableTrackingBuffer.prototype.writeUInt8 = function(value) { var length; length = 1; this.makeRoomFor(length); this.buffer.writeUInt8(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeUInt16LE = function(value) { var length; length = 2; this.makeRoomFor(length); this.buffer.writeUInt16LE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeUShort = function(value) { return this.writeUInt16LE(value); }; WritableTrackingBuffer.prototype.writeUInt16BE = function(value) { var length; length = 2; this.makeRoomFor(length); this.buffer.writeUInt16BE(value, this.position); return this.position += 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; this.makeRoomFor(length); this.buffer.writeUInt32LE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeUInt64LE = function(value) { var high, low; low = value % 0x100000000; high = Math.floor(value / 0x100000000); this.writeUInt32LE(low); return this.writeUInt32LE(high); }; WritableTrackingBuffer.prototype.writeInt64LE = function(value) { var buf; buf = bigint.numberToInt64LE(value); return this.copyFrom(buf); }; WritableTrackingBuffer.prototype.writeUInt32BE = function(value) { var length; length = 4; this.makeRoomFor(length); this.buffer.writeUInt32BE(value, this.position); return this.position += 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; this.makeRoomFor(length); this.buffer.writeInt8(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeInt16LE = function(value) { var length; length = 2; this.makeRoomFor(length); this.buffer.writeInt16LE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeInt16BE = function(value) { var length; length = 2; this.makeRoomFor(length); this.buffer.writeInt16BE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeInt32LE = function(value) { var length; length = 4; this.makeRoomFor(length); this.buffer.writeInt32LE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeInt32BE = function(value) { var length; length = 4; this.makeRoomFor(length); this.buffer.writeInt32BE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeFloatLE = function(value) { var length; length = 4; this.makeRoomFor(length); this.buffer.writeFloatLE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeDoubleLE = function(value) { var length; length = 8; this.makeRoomFor(length); this.buffer.writeDoubleLE(value, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeString = function(value, encoding) { var bytesWritten, length; encoding || (encoding = this.encoding); length = Buffer.byteLength(value, encoding); this.makeRoomFor(length); bytesWritten = this.buffer.write(value, this.position, encoding); this.position += length; return bytesWritten; }; WritableTrackingBuffer.prototype.writeBVarchar = function(value, encoding) { this.writeUInt8(value.length); return this.writeString(value, encoding); }; WritableTrackingBuffer.prototype.writeUsVarchar = function(value, encoding) { this.writeUInt16LE(value.length); return this.writeString(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.writeBuffer(UNKNOWN_PLP_LEN); 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; this.makeRoomFor(length); value.copy(this.buffer, this.position); return this.position += length; }; WritableTrackingBuffer.prototype.writeMoney = function(value) { this.writeInt32LE(Math.floor(value * SHIFT_RIGHT_32)); return this.writeInt32LE(value & -1); }; return WritableTrackingBuffer; })(); module.exports = WritableTrackingBuffer;