"use strict";
|
|
const metadataParse = require('../metadata-parser');
|
|
function readTableName(parser, options, metadata, callback) {
|
if (metadata.type.hasTableName) {
|
if (options.tdsVersion >= '7_2') {
|
parser.readUInt8(numberOfTableNameParts => {
|
const tableName = [];
|
let i = 0;
|
|
function next(done) {
|
if (numberOfTableNameParts === i) {
|
return done();
|
}
|
|
parser.readUsVarChar(part => {
|
tableName.push(part);
|
i++;
|
next(done);
|
});
|
}
|
|
next(() => {
|
callback(tableName);
|
});
|
});
|
} else {
|
parser.readUsVarChar(callback);
|
}
|
} else {
|
callback(undefined);
|
}
|
}
|
|
function readColumnName(parser, options, index, metadata, callback) {
|
parser.readBVarChar(colName => {
|
if (options.columnNameReplacer) {
|
callback(options.columnNameReplacer(colName, index, metadata));
|
} else if (options.camelCaseColumns) {
|
callback(colName.replace(/^[A-Z]/, function (s) {
|
return s.toLowerCase();
|
}));
|
} else {
|
callback(colName);
|
}
|
});
|
}
|
|
function readColumn(parser, options, index, callback) {
|
metadataParse(parser, options, metadata => {
|
readTableName(parser, options, metadata, tableName => {
|
readColumnName(parser, options, index, metadata, colName => {
|
callback({
|
userType: metadata.userType,
|
flags: metadata.flags,
|
type: metadata.type,
|
colName: colName,
|
collation: metadata.collation,
|
precision: metadata.precision,
|
scale: metadata.scale,
|
udtInfo: metadata.udtInfo,
|
dataLength: metadata.dataLength,
|
tableName: tableName
|
});
|
});
|
});
|
});
|
}
|
|
module.exports = function (parser, colMetadata, options, callback) {
|
parser.readUInt16LE(columnCount => {
|
const columns = [];
|
let i = 0;
|
|
function next(done) {
|
if (i === columnCount) {
|
return done();
|
}
|
|
readColumn(parser, options, i, column => {
|
columns.push(column);
|
i++;
|
next(done);
|
});
|
}
|
|
next(() => {
|
callback({
|
name: 'COLMETADATA',
|
event: 'columnMetadata',
|
columns: columns
|
});
|
});
|
});
|
};
|