UNPKG

enhancer-data-bridge

Version:

A bridge between Enhancer Clould and user business datasource

143 lines (132 loc) 4.83 kB
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, []); } }