enhancer-data-bridge
Version:
A bridge between Enhancer Clould and user business datasource
143 lines (132 loc) • 4.83 kB
JavaScript
var mssql = require('mssql');
var varTypeMap = {
bit: "number",
int: "number",
smallint: "number",
tinyint: "number",
numeric: "number",
decimal: "number",
money: "number",
smallmoney: "number",
float: "number",
real: "number",
datetime: "string",
timestamp: "string",
char: "string",
varchar: "string",
text: "string",
nchar: "string",
nvarchar: "string",
ntext: "string",
binary: "string",
varbinary: "string",
image: "string"
};
module.exports = {
testConnection: function(dbConfig, cb) {
dbConfig.server = dbConfig.host;
dbConfig.port = parseInt(dbConfig.port);
dbConfig.encrypt = dbConfig.encrypt || false;
const pool = new mssql.ConnectionPool(dbConfig);
pool.connect(err => {
if (err) {
pool.close();
return cb(null, err.message);
}
pool.close();
return cb(null, true);
});
},
testSql: function(dbConfig, sql, params, cb) {
dbConfig.server = dbConfig.host;
dbConfig.port = parseInt(dbConfig.port);
dbConfig.encrypt = dbConfig.encrypt || false;
var orginalSql = sql;
// workaround for issue: https://forum.wuyuan.io/plate/qa/topic/6150637d1b4b7267ac10ecee
sql = sql.replace(/xml\s+path\('[^']+'\)/ig, 'xml path(\'\')');
sql = 'SELECT * FROM (' + sql + ') A WHERE 1 = 0';
const pool = new mssql.ConnectionPool(dbConfig);
pool.connect(err => {
if (err) {
pool.close();
return cb(null, {
success: false,
message: err.message
});
}
var req = pool.request();
// input parameter
var i = 0;
sql = sql.replace(/\?/g, function(id) {
var pname = '@param' + i;
req.input('param' + i, params[i]);
i++;
return pname;
});
req.query(sql, (err, result) => {
if (err) {
// Retry with orginal SQL
orginalSql = orginalSql.replace(/\?/g, function(id) {
var pname = '@param' + i;
req.input('param' + i, params[i]);
i++;
return pname;
});
req.query(orginalSql, (err, result) => {
pool.close();
if (err) {
return cb(null, {
success: false,
message: err.message
});
}
var length = result.recordsets.length;
var set = result.recordsets[length - 1];
var columns = (set || {}).columns;
cb(null, {
success: true,
metaData: (function(columns) {
var fields = [];
var col;
for ( i in columns ) {
col = columns[i];
col.dbType = col.type.declaration;
col.varType = varTypeMap[col.dbType.toLowerCase()] || 'string';
fields.push(col);
}
return fields;
})(columns || [])
});
});
return;
}
pool.close();
var length = result.recordsets.length;
var set = result.recordsets[length - 1];
var columns = (set || {}).columns;
cb(null, {
success: true,
metaData: (function(columns) {
var fields = [];
var col;
for ( i in columns ) {
col = columns[i];
col.dbType = col.type.declaration;
col.varType = varTypeMap[col.dbType.toLowerCase()] || 'string';
fields.push(col);
}
return fields;
})(columns || [])
});
});
});
},
getTableNames: function(dbConfig, cb) {
// To be continued.
cb(null, []);
},
getTableColumns: function(dbConfig, tabName, cb) {
// To be continued.
cb(null, []);
}
}