init
This commit is contained in:
		
							
								
								
									
										75
									
								
								lib/filter.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								lib/filter.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,75 @@
 | 
			
		||||
const replaceStrFormIndexArr=require("../utils").replaceStrFormIndexArr;
 | 
			
		||||
 | 
			
		||||
function filterComments(sql) {
 | 
			
		||||
    let tmpArr = [];
 | 
			
		||||
    const comments = [];
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < sql.length; i++) {
 | 
			
		||||
        let char = sql[i];
 | 
			
		||||
 | 
			
		||||
        //读取字符
 | 
			
		||||
        if (char == "'" || char == "\"" || char == "-" || char == "\n") {
 | 
			
		||||
            //推入数组
 | 
			
		||||
            tmpArr.push({
 | 
			
		||||
                index: i,
 | 
			
		||||
                char: char
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        //校验数组是否有匹配语法
 | 
			
		||||
        if (tmpArr.length < 2) {
 | 
			
		||||
            if (tmpArr[0] && tmpArr[0].char == "\n") {
 | 
			
		||||
                tmpArr = [];
 | 
			
		||||
            }
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let firstChar = tmpArr[0];
 | 
			
		||||
        let lastChar = tmpArr[tmpArr.length - 1];
 | 
			
		||||
 | 
			
		||||
        if (firstChar.char == "'" || firstChar.char == "\"") {
 | 
			
		||||
            //引号匹配,则清空
 | 
			
		||||
            if (lastChar.char == firstChar.char) {
 | 
			
		||||
                tmpArr = [];
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
        } else if (firstChar.char == "-") {
 | 
			
		||||
            //假如第一个是横线,则开始校验注释规则
 | 
			
		||||
 | 
			
		||||
            //判断是否为两个注释符号,不是,则清空
 | 
			
		||||
            if (tmpArr[1].char != "-") {
 | 
			
		||||
                tmpArr = [];
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            //为注释作用域,遇到换行符,则结束注释
 | 
			
		||||
            else if (lastChar.char == "\n") {
 | 
			
		||||
                comments.push({
 | 
			
		||||
                    begin: firstChar.index,
 | 
			
		||||
                    end: lastChar.index
 | 
			
		||||
                })
 | 
			
		||||
                tmpArr = [];
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            //解析结束
 | 
			
		||||
            else if (i == sql.length - 1) {
 | 
			
		||||
                comments.push({
 | 
			
		||||
                    begin: firstChar.index,
 | 
			
		||||
                    end: i
 | 
			
		||||
                })
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            tmpArr = [];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sql = replaceStrFormIndexArr(sql, '', comments)
 | 
			
		||||
 | 
			
		||||
    return sql;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function cleanSql(sql){
 | 
			
		||||
    return filterComments(sql).trim();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.filterComments=filterComments;
 | 
			
		||||
exports.cleanSql=cleanSql;
 | 
			
		||||
							
								
								
									
										22
									
								
								lib/parser.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								lib/parser.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
const Parser = require('../core/astParser');
 | 
			
		||||
const Cache = require("../core/cache");
 | 
			
		||||
const filter = require("./filter");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const astCache=new Cache();
 | 
			
		||||
 | 
			
		||||
function parse(sql){
 | 
			
		||||
    const cleanSql=filter.cleanSql(sql);
 | 
			
		||||
    console.log(cleanSql)
 | 
			
		||||
    let ast=astCache.get(cleanSql);
 | 
			
		||||
    if(ast){
 | 
			
		||||
        return ast
 | 
			
		||||
    }else{
 | 
			
		||||
        ast=Parser.parse(cleanSql).ast;
 | 
			
		||||
        astCache.set(cleanSql,ast);
 | 
			
		||||
        return ast;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
exports.parse=parse;
 | 
			
		||||
		Reference in New Issue
	
	Block a user