103 lines
2.8 KiB
JavaScript
103 lines
2.8 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const Collations = require('../const/collations.js');
|
||
|
const FieldType = require('../const/field-type');
|
||
|
const Capabilities = require('../const/capabilities');
|
||
|
|
||
|
/**
|
||
|
* Column definition
|
||
|
* see https://mariadb.com/kb/en/library/resultset/#column-definition-packet
|
||
|
*/
|
||
|
class ColumnDef {
|
||
|
constructor(packet, info) {
|
||
|
this._parse = new StringParser(packet);
|
||
|
if (info.serverCapabilities & Capabilities.MARIADB_CLIENT_EXTENDED_TYPE_INFO) {
|
||
|
const subPacket = packet.subPacketLengthEncoded();
|
||
|
while (subPacket.remaining()) {
|
||
|
switch (subPacket.readUInt8()) {
|
||
|
case 0:
|
||
|
this.dataTypeName = subPacket.readAsciiStringLengthEncoded();
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
this.dataTypeFormat = subPacket.readAsciiStringLengthEncoded();
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// skip data
|
||
|
const len = subPacket.readUnsignedLength();
|
||
|
if (len) {
|
||
|
subPacket.skip(len);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
packet.skip(1); // length of fixed fields
|
||
|
this.collation = Collations.fromIndex(packet.readUInt16());
|
||
|
this.columnLength = packet.readUInt32();
|
||
|
this.columnType = packet.readUInt8();
|
||
|
this.flags = packet.readUInt16();
|
||
|
this.scale = packet.readUInt8();
|
||
|
this.type = FieldType.TYPES[this.columnType];
|
||
|
}
|
||
|
|
||
|
db() {
|
||
|
return this._parse.packet.readString(this._parse.dbOffset, this._parse.dbLength);
|
||
|
}
|
||
|
|
||
|
schema() {
|
||
|
return this._parse.packet.readString(this._parse.dbOffset, this._parse.dbLength);
|
||
|
}
|
||
|
|
||
|
table() {
|
||
|
return this._parse.packet.readString(this._parse.tableOffset, this._parse.tableLength);
|
||
|
}
|
||
|
|
||
|
orgTable() {
|
||
|
return this._parse.packet.readString(this._parse.orgTableOffset, this._parse.orgTableLength);
|
||
|
}
|
||
|
|
||
|
name() {
|
||
|
return this._parse.packet.readString(this._parse.nameOffset, this._parse.nameLength);
|
||
|
}
|
||
|
|
||
|
orgName() {
|
||
|
return this._parse.packet.readString(this._parse.orgNameOffset, this._parse.orgNameLength);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* String parser.
|
||
|
* This object permits to avoid listing all private information to metadata object.
|
||
|
*/
|
||
|
class StringParser {
|
||
|
constructor(packet) {
|
||
|
packet.skip(4); // skip 'def'
|
||
|
|
||
|
this.dbLength = packet.readUnsignedLength();
|
||
|
this.dbOffset = packet.pos;
|
||
|
packet.skip(this.dbLength);
|
||
|
|
||
|
this.tableLength = packet.readUnsignedLength();
|
||
|
this.tableOffset = packet.pos;
|
||
|
packet.skip(this.tableLength);
|
||
|
|
||
|
this.orgTableLength = packet.readUnsignedLength();
|
||
|
this.orgTableOffset = packet.pos;
|
||
|
packet.skip(this.orgTableLength);
|
||
|
|
||
|
this.nameLength = packet.readUnsignedLength();
|
||
|
this.nameOffset = packet.pos;
|
||
|
packet.skip(this.nameLength);
|
||
|
|
||
|
this.orgNameLength = packet.readUnsignedLength();
|
||
|
this.orgNameOffset = packet.pos;
|
||
|
packet.skip(this.orgNameLength);
|
||
|
this.packet = packet;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = ColumnDef;
|