主要是对字符串和数组的一些操作, 逻辑如下:
function parse(sqlStr){
// 清空form
var rows = grid.findRows(function (row) {
return true;
});
grid.removeRows(rows, true);
var sql = sqlStr.sender.value
// 转为全大写
var upCaseSql = sql.toUpperCase().trim();
// 判断是否为select语句
if(upCaseSql.indexOf('SELECT') != 0
&& upCaseSql.indexOf('UPDATE') != 0
&& upCaseSql.indexOf('DELETE') != 0
&& upCaseSql.indexOf('INSERT') != 0
){
return;
}
// 按照 FROM 和 JOIN 分割sql并合并数组
var sqlFromAttr = upCaseSql.split(' FROM ');
var sqlJoinAttrMerge = upCaseSql.split(' JOIN ');
sqlFromAttr.forEach(item=>{sqlJoinAttrMerge.push(item) })
// 去除两端空格
for (let i = 0; i < sqlJoinAttrMerge.length; i++) {
sqlJoinAttrMerge[i] = sqlJoinAttrMerge[i].trim();
}
// 若数组只分割出一个元素则不进行解析
if(sqlJoinAttrMerge.length < 2){
return;
}
// 删除第一个元素
sqlJoinAttrMerge.shift();
var parseResult = [];
for (var s of sqlJoinAttrMerge) {
// 获取第一个空格的位置若不存在则取length
let sqlLastBlank = s.indexOf(" ") == -1 ? s.length : s.indexOf(" ");
// 获取得到FROM或JOIN后的第一个串sql
var result = s.substring(0, sqlLastBlank);
// 排除select语句
if (result.indexOf(".") !== -1 || (result.indexOf("SELECT") == -1 && result.indexOf("(") == -1)) {
parseResult.push(result);
}
}
// 分割结果获取到 表 Schema 库
parseResult.forEach(x => {
var index = upCaseSql.indexOf(x);
var originSql = sql.substring(index,index+x.length)
var parseResultAttr = originSql.split(".");
var data = {}
if (parseResultAttr.length >= 3) {
data.sourceTable = parseResultAttr[parseResultAttr.length - 1];
data.sourceSchema = parseResultAttr[parseResultAttr.length - 2];
data.sourceSystem = parseResultAttr[parseResultAttr.length - 3];
}
if (parseResultAttr.length == 2) {
data.sourceTable = parseResultAttr[parseResultAttr.length - 1];
data.sourceSchema = parseResultAttr[parseResultAttr.length - 2];
}
if (parseResultAttr.length == 1) {
data.sourceTable = parseResultAttr[parseResultAttr.length - 1];
}
if (parseResultAttr.length == 0) {
console.log("脚本{["+sql+"]}: 解析成功,但未得到任何结果。。。");
}
var sourceAttr = grid.getData();
for (var attr of sourceAttr) {
if(attr.sourceTable == data.sourceTable && attr.sourceSchema == data.sourceSchema
&& attr.sourceSystem == data.sourceSystem){
return;
}
}
if(data.sourceTable != null && data.sourceTable != ""){
grid.addRow(data);
}
});
}