108 lines
3.4 KiB
JavaScript
108 lines
3.4 KiB
JavaScript
var Packet = require('../packets/packet');
|
|
|
|
// creating JS string is relatively expencive (compared to
|
|
// reading few bytes from buffer) because all string properties
|
|
// except for name are unlikely to be used we postpone
|
|
// string conversion until property access
|
|
//
|
|
// TODO: watch for integration benchmarks (one with real network buffer)
|
|
// there could be bad side effect as keeping reference to a buffer makes it
|
|
// sit in the memory longer (usually until final .query() callback)
|
|
// Latest v8 perform much better in regard to bugger -> string convertion,
|
|
// at some poinyt of time this optimisation might become unnecessary
|
|
// see https://github.com/sidorares/node-mysql2/pull/137
|
|
//
|
|
function ColumnDefinition(packet)
|
|
{
|
|
this._buf = packet.buffer;
|
|
|
|
this._catalogLength = packet.readLengthCodedNumber();
|
|
this._catalogStart = packet.offset;
|
|
packet.offset += this._catalogLength;
|
|
|
|
this._schemaLength = packet.readLengthCodedNumber();
|
|
this._schemaStart = packet.offset;
|
|
packet.offset += this._schemaLength;
|
|
|
|
this._tableLength = packet.readLengthCodedNumber();
|
|
this._tableStart = packet.offset;
|
|
packet.offset += this._tableLength;
|
|
|
|
this._orgTableLength = packet.readLengthCodedNumber();
|
|
this._orgTableStart = packet.offset;
|
|
packet.offset += this._orgTableLength;
|
|
|
|
// name is always used, don't make it lazy
|
|
this.name = packet.readLengthCodedString();
|
|
|
|
this._orgNameLength = packet.readLengthCodedNumber();
|
|
this._orgNameStart = packet.offset;
|
|
packet.offset += this._orgNameLength;
|
|
|
|
packet.skip(1); // length of the following fields (always 0x0c)
|
|
this.characterSet = packet.readInt16();
|
|
this.columnLength = packet.readInt32();
|
|
this.columnType = packet.readInt8();
|
|
this.flags = packet.readInt16();
|
|
this.decimals = packet.readInt8();
|
|
}
|
|
|
|
var addString = function(name) {
|
|
Object.defineProperty(ColumnDefinition.prototype, name, { get: function() {
|
|
var start = this['_' + name + 'Start'];
|
|
var end = start + this['_' + name + 'Length'];
|
|
return this._buf.utf8Slice(start, end);
|
|
}});
|
|
};
|
|
|
|
addString('catalog');
|
|
addString('schema');
|
|
addString('table');
|
|
addString('orgTable');
|
|
addString('orgName');
|
|
|
|
ColumnDefinition.prototype.inspect = function() {
|
|
return {
|
|
catalog : this.catalog,
|
|
schema : this.schema,
|
|
name : this.name,
|
|
orgName : this.orgName,
|
|
table : this.table,
|
|
orgTable : this.orgTable,
|
|
characterSet: this.characterSet,
|
|
columnLength: this.columnLength,
|
|
columnType : this.columnType,
|
|
flags : this.flags,
|
|
decimals : this.decimals
|
|
};
|
|
};
|
|
|
|
ColumnDefinition.toPacket = function(column, sequenceId)
|
|
{
|
|
var length = 0;
|
|
var fields = 'catalog schema table orgTable name orgName'.split(' ');
|
|
function addFieldLength(name) {
|
|
var str = column[name];
|
|
length +=Packet.lengthCodedNumberLength(str);
|
|
length += str.length;
|
|
}
|
|
fields.forEach(addFieldLength);
|
|
length += 13;
|
|
var buffer = new Buffer(length);
|
|
function writeField(name) {
|
|
packet.writeLengthCodedString(column[name]);
|
|
}
|
|
var packet = new Packet(sequenceId, buffer, 0, length);
|
|
packet.offset = 4;
|
|
fields.forEach(writeField);
|
|
packet.writeInt8 (0x0c);
|
|
packet.writeInt16(column.characterSet);
|
|
packet.writeInt32(column.columnLength);
|
|
packet.writeInt8 (column.columnType);
|
|
packet.writeInt16(column.flags);
|
|
packet.writeInt8 (column.decimals);
|
|
return packet;
|
|
};
|
|
|
|
module.exports = ColumnDefinition;
|