Comparing version 0.1.1 to 0.1.3
@@ -1,27 +0,15 @@ | ||
// +------------------------------------------------------------------------+ | ||
// | 词法分析器类 | | ||
// +------------------------------------------------------------------------+ | ||
// | Copygight (c) 2003 - 2011 Taobao.com. All Rights Reserved | | ||
// +------------------------------------------------------------------------+ | ||
// | Author: yixuan.zzq <yixuan.zzq@taobao.com> | | ||
// +------------------------------------------------------------------------+ | ||
// | 2011年10月 | | ||
// +------------------------------------------------------------------------+ | ||
var Types = { | ||
UNKNOWN : 0, | ||
KEYWORD : 1, | ||
NUMBER : 2, | ||
STRING : 3, | ||
FUNCTION : 4, | ||
VARIABLE : 5, | ||
PARAMS : 6, | ||
OPERATOR : 7, | ||
COMMAS : 8, | ||
MEMORY : 9, | ||
COMMENT : 99 | ||
}; | ||
var Types = { | ||
UNKNOWN : 0, /**< 未知的 */ | ||
KEYWORD : 1, /**< 关键字 */ | ||
NUMBER : 2, /**< 数 字 */ | ||
STRING : 3, /**< 字符串 */ | ||
FUNCTION : 4, /**< 函数名 */ | ||
VARIABLE : 5, /**< 变 量 */ | ||
PARAMS : 6, /**< 绑定值 */ | ||
OPERATOR : 7, /**< 运算符 */ | ||
COMMAS : 8, /**< 标 点 */ | ||
MEMORY : 9, | ||
COMMENT : 99, /**< 注 释 */ | ||
} | ||
var Parser = function(query) { | ||
@@ -34,3 +22,2 @@ var tks = [], pre = Types.UNKNOWN; | ||
/* {{{ 注释 */ | ||
if ('/' == cur && '*' == query.charAt(i + 1)) { | ||
@@ -55,8 +42,6 @@ tmp = ''; | ||
'text' : tmp.replace(/^[\*\s]+/, '').replace(/[\s\*]+$/, ''), | ||
'type' : Types.COMMENT, | ||
'type' : Types.COMMENT | ||
}; | ||
} | ||
/* }}} */ | ||
/* {{{ 字符串 */ | ||
else if ("'" == cur || '"' == cur || '`' == cur) { | ||
@@ -69,8 +54,6 @@ tmp = ''; | ||
'text' : tmp, | ||
'type' : ('`' == cur) ? Types.VARIABLE : Types.STRING, | ||
'type' : ('`' == cur) ? Types.VARIABLE : Types.STRING | ||
}; | ||
} | ||
/* }}} */ | ||
/* {{{ 绑定变量 */ | ||
else if (':' == cur) { | ||
@@ -88,8 +71,6 @@ tmp = cur; | ||
'text' : tmp, | ||
'type' : Types.PARAMS, | ||
'type' : Types.PARAMS | ||
}; | ||
} | ||
/* }}} */ | ||
/* {{{ 函数名 */ | ||
else if (/^[a-z_]+$/i.test(cur)) { | ||
@@ -110,6 +91,3 @@ tmp = cur; | ||
} | ||
/* }}} */ | ||
/* {{{ 数字 */ | ||
else if (('-' == cur && Types.VARIABLE != pre) || /\d+/.test(cur)) { | ||
@@ -128,3 +106,3 @@ tmp = cur; | ||
tks[tks.length] = { | ||
'text' : '-', /**< 类型转换 */ | ||
'text' : '-', | ||
'type' : Types.OPERATOR | ||
@@ -134,3 +112,3 @@ }; | ||
tks[tks.length] = { | ||
'text' : tmp - 0, /**< 类型转换 */ | ||
'text' : tmp - 0, | ||
'type' : Types.NUMBER | ||
@@ -140,14 +118,10 @@ }; | ||
} | ||
/* }}} */ | ||
/* {{{ 标点 */ | ||
else if (/^[\,;\(\)]+$/.test(cur)) { | ||
tks[tks.length] = { | ||
'text' : cur, | ||
'type' : Types.COMMAS, | ||
'type' : Types.COMMAS | ||
}; | ||
} | ||
/* }}} */ | ||
/* {{{ 运算符 */ | ||
else if (/^(\+|\-|\*|\/|>|<|=|!)$/.test(cur)) { | ||
@@ -166,6 +140,5 @@ tmp = cur; | ||
'text' : tmp, | ||
'type' : Types.OPERATOR, | ||
'type' : Types.OPERATOR | ||
}; | ||
} | ||
/* }}} */ | ||
@@ -176,5 +149,4 @@ pre = (tks.length === 0) ? pre : tks[tks.length - 1].type; | ||
return tks; | ||
} | ||
}; | ||
/* {{{ public construct() */ | ||
var Lexter = function(query) { | ||
@@ -187,3 +159,3 @@ this.tokens = (query instanceof Array) ? query : Parser(query.toString()); | ||
"(" : 1, | ||
")" : -1, | ||
")" : -1 | ||
}; | ||
@@ -199,12 +171,8 @@ | ||
} | ||
} | ||
/* }}} */ | ||
}; | ||
/* {{{ public getAll() */ | ||
Lexter.prototype.getAll = function() { | ||
return this.tokens; | ||
} | ||
/* }}} */ | ||
}; | ||
/* {{{ public indexOf() */ | ||
Lexter.prototype.indexOf = function(who, off) { | ||
@@ -221,3 +189,2 @@ var pos = 0; | ||
// xxx: 这里可以用二分法 | ||
for (var i = 0; i < this.blocks.length; ++i) { | ||
@@ -236,6 +203,4 @@ pos = this.blocks[i]; | ||
return -1; | ||
} | ||
/* }}} */ | ||
}; | ||
/*{{{ static vars()*/ | ||
exports.vars = function(idx,tokens,isString){ | ||
@@ -293,6 +258,4 @@ var res; | ||
return res; | ||
} | ||
/*}}}*/ | ||
}; | ||
/*{{{ static text()*/ | ||
exports.text = function(stack,comma){ | ||
@@ -323,4 +286,3 @@ var res = []; | ||
return res; | ||
} | ||
/*}}}*/ | ||
}; | ||
@@ -330,3 +292,2 @@ exports.types = Types; | ||
return new Lexter(query); | ||
} | ||
}; |
@@ -1,15 +0,8 @@ | ||
/* | ||
作者:yixuan | ||
介绍:sql语句(delete语句)解析类 | ||
邮箱:yixuan.zzq@taobao.com | ||
*/ | ||
var Lexter = require('../lexter.js'); | ||
var Tool = require('../sqlParseTool.js'); | ||
/*{{{ divideTokens()*/ | ||
/** | ||
* 分解sql语句 | ||
* @param {Array} tokens 需要分解的tokens | ||
* @return {Object} 分解结果 | ||
* Devide tokens | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -37,20 +30,15 @@ function divideTokens(tokens){ | ||
return parts; | ||
} | ||
/*}}}*/ | ||
/*{{{ parseSource()*/ | ||
/** | ||
* 解析Source字段 | ||
* @param {Array} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse source | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
function parseSource(tokens){ | ||
function parseSource(tokens) { | ||
var res = {}; | ||
if(!(/^delete$/i.test(tokens.shift().text))){ | ||
if (!(/^delete$/i.test(tokens.shift().text))) { | ||
throw new Error("no keyword 'delete'"); | ||
} | ||
if(!(/^from$/i.test(tokens.shift().text))){ | ||
if (!(/^from$/i.test(tokens.shift().text))) { | ||
throw new Error("no keyword 'from'"); | ||
@@ -64,14 +52,12 @@ } | ||
type: get["type"], | ||
source : get["source"], | ||
} | ||
source: get["source"], | ||
}; | ||
} | ||
} | ||
exports.parseSource = parseSource; | ||
/*}}}*/ | ||
/*{{{ parseWhere()*/ | ||
/** | ||
* 解析Where字段 | ||
* @param {Array} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse 'where' | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -89,15 +75,12 @@ function parseWhere(tokens){ | ||
return res; | ||
} | ||
} | ||
exports.parseWhere = parseWhere; | ||
/*}}}*/ | ||
/*{{{ createObj()*/ | ||
/** | ||
* 创建sql对应的sql对象,可以选择解析部分 | ||
* @param {String} sql 需要分析的sql | ||
* @return {Object} 结果对象 | ||
* Create SQL Obj | ||
* @param {String} sql | ||
* @return {Object} | ||
*/ | ||
exports.createObj = function(sql){ | ||
var res = {}; | ||
@@ -114,3 +97,2 @@ | ||
return res; | ||
} | ||
/*}}}*/ | ||
}; |
@@ -1,15 +0,8 @@ | ||
/* | ||
作者:yixuan | ||
介绍:sql语句(insert语句)解析类 | ||
邮箱:yixuan.zzq@taobao.com | ||
*/ | ||
var Lexter = require('../lexter.js'); | ||
var Tool = require('../sqlParseTool.js'); | ||
/*{{{ divideTokens()*/ | ||
/** | ||
* 分解sql语句 | ||
* @param {Array} tokens 需要分解的tokens | ||
* @return {Object} 分解结果 | ||
* Divide tokens | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -37,16 +30,11 @@ function divideTokens(tokens){ | ||
return parts; | ||
} | ||
/*}}}*/ | ||
/*{{{ parseSource()*/ | ||
/** | ||
* 把tokens当做sql中的table字段解析 | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse source | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
function parseSource(tokens){ | ||
var res = {}; | ||
if(!(/^insert$/i.test(tokens.shift().text))){throw new Error("no keyword 'insert'");} | ||
@@ -104,13 +92,10 @@ if(!(/^into$/i.test(tokens.shift().text))){throw new Error("no keyword 'into'");} | ||
} | ||
} | ||
exports.parseSource = parseSource; | ||
/*}}}*/ | ||
/*{{{ parseValues()*/ | ||
/** | ||
* 把tokens当做sql中的value字段解析 | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse value | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -144,8 +129,8 @@ function parseValues(tokens){ | ||
var get = Tool.removeParenthese(tokens.slice(pre)); | ||
var getText = Tool.removeParenthese(tokens.slice(pre)); | ||
var tmp = []; | ||
for(var i = 0;i < get.length; i++){ | ||
if(get[i].text === ","){continue;} | ||
tmp.push(get[i]); | ||
for(var i = 0;i < getText.length; i++){ | ||
if(getText[i].text === ","){continue;} | ||
tmp.push(getText[i]); | ||
} | ||
@@ -155,12 +140,9 @@ res.push(tmp); | ||
return res; | ||
} | ||
exports.parseValues = parseValues; | ||
/*}}}*/ | ||
/*{{{ createObj()*/ | ||
/** | ||
* 创建sql对应的sql对象,可以选择解析部分 | ||
* @param {String} sql 需要分析的sql | ||
* @return {Object} 结果对象 | ||
* Create SQL object | ||
* @param {String} sql | ||
* @return {Object} | ||
*/ | ||
@@ -180,5 +162,2 @@ exports.createObj = function(sql){ | ||
return res; | ||
} | ||
/*}}}*/ | ||
}; |
@@ -1,7 +0,1 @@ | ||
/* | ||
作者:yixuan | ||
介绍:sql语句(select语句)解析类 | ||
邮箱:yixuan.zzq@taobao.com | ||
*/ | ||
var Lexter = require('../lexter.js'); | ||
@@ -11,7 +5,6 @@ var Tool = require('../sqlParseTool.js'); | ||
/*{{{ divideUnion()*/ | ||
/** | ||
* 根据union划分tokens | ||
* @param {String} tokens sql解析出的tokens | ||
* @return {Array} 解析结果数组 | ||
* Divide union | ||
* @param {String} tokens sql | ||
* @return {Array} | ||
*/ | ||
@@ -36,11 +29,8 @@ function divideUnion(tokens){ | ||
return res; | ||
} | ||
/*}}}*/ | ||
/*{{{ divideTokens()*/ | ||
/** | ||
* 将所有token分解为几个组成部分(每部分都是token数组) | ||
* @param {Array} tokens sql分解为的tokens | ||
* @return {Object} 分解结果 | ||
* Divide tokens | ||
* @param {Array} tokens sql | ||
* @return {Object} | ||
*/ | ||
@@ -50,3 +40,3 @@ function divideTokens(tokens){ | ||
var posArr = []; | ||
var Map = {} | ||
var Map = {}; | ||
var pre = 0; | ||
@@ -99,3 +89,2 @@ var lev = 0; | ||
} | ||
} | ||
@@ -110,10 +99,7 @@ | ||
} | ||
/*}}}*/ | ||
/*{{{ parseColumn()*/ | ||
/** | ||
* 将tokens当做sql中column字段分解 | ||
* (介于select和from中间的部分) | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse sql column | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -137,5 +123,3 @@ function parseColumn(tokens){ | ||
} | ||
/*}}}*/ | ||
/*{{{ 判断每个column名字并赋值 */ | ||
var colName; | ||
@@ -176,18 +160,13 @@ var tmpVar; | ||
} | ||
/*}}}*/ | ||
} | ||
return res; | ||
} | ||
exports.parseColumn = parseColumn; | ||
/*}}}*/ | ||
/*{{{ parseSource()*/ | ||
/** | ||
* 将tokens当做sql中source字段分解 | ||
* (介于from和join中间的部分) | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse source | ||
* (from join) | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -210,13 +189,10 @@ function parseSource(tokens){ | ||
return res; | ||
} | ||
} | ||
exports.parseSource = parseSource; | ||
/*}}}*/ | ||
/*{{{ parseJoinmap()*/ | ||
/** | ||
* 将tokens当做sql中join字段分解 | ||
* (介于join和where中间的部分) | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse Join map | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -243,7 +219,5 @@ function parseJoinmap(tokens){ | ||
//如果一个部分的结尾念着下面字段,则这个字段是属于后面一个JOIN的一部分 | ||
forNext = (/^(LEFT|RIGHT|OUTER|INNER)$/i.test(tmp[tmp.length-1].text)) ? tmp.pop().text : undefined; | ||
var onPos = undefined; | ||
/*{{{ 分析源和源类型*/ | ||
for(var j = 0;j < tmp.length; j++){ | ||
@@ -260,5 +234,3 @@ if(/^on$/i.test(tmp[j].text)){ | ||
} | ||
/*}}}*/ | ||
/*{{{ 分析ON后面的条件元素*/ | ||
if(onPos === undefined){ | ||
@@ -279,3 +251,2 @@ throw new Error("no keyword 'on' in join part"); | ||
} | ||
/*}}}*/ | ||
@@ -289,15 +260,11 @@ res[name] = { | ||
} | ||
return res; | ||
} | ||
} | ||
exports.parseJoinmap = parseJoinmap | ||
/*}}}*/ | ||
/*{{{ parseWhere()*/ | ||
/** | ||
* 将tokens当做sql中where字段分解 | ||
* (介于where和group by中间的部分) | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse where | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -312,2 +279,3 @@ function parseWhere(tokens){ | ||
parts.forEach(function(part){ | ||
console.log(part); | ||
res.push(Tool.parseOneWhere(part)); | ||
@@ -317,13 +285,10 @@ }); | ||
return res; | ||
} | ||
} | ||
exports.parseWhere = parseWhere; | ||
/*}}}*/ | ||
/*{{{ parseGroupby()*/ | ||
/** | ||
* 将tokens当做sql中group by字段分解 | ||
* (介于group by和order by中间的部分) | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse group by | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -343,13 +308,10 @@ function parseGroupby(tokens){ | ||
return res; | ||
} | ||
} | ||
exports.parseGroupby = parseGroupby; | ||
/*}}}*/ | ||
/*{{{ parseOrderby()*/ | ||
/** | ||
* 将tokens当做sql中order by字段分解 | ||
* (介于order by和limit中间的部分) | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse order by | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -381,13 +343,9 @@ function parseOrderby(tokens){ | ||
return res; | ||
} | ||
exports.parseOrderby = parseOrderby; | ||
/*}}}*/ | ||
/*{{{ parseLimit()*/ | ||
/** | ||
* 将tokens当做sql中limit字段分解 | ||
* (limit部分) | ||
* @param {String} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse limit | ||
* @param {String} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -414,12 +372,10 @@ function parseLimit(tokens){ | ||
return res; | ||
} | ||
} | ||
exports.parseLimit = parseLimit; | ||
/*}}}*/ | ||
/*{{{ createObj()*/ | ||
/** | ||
* 创建sql对应的sql对象,可以选择解析部分 | ||
* @param {String} sql 需要分析的sql | ||
* @return {Object} 结果对象 | ||
* Create SQL object | ||
* @param {String} sql | ||
* @return {Object} | ||
*/ | ||
@@ -451,5 +407,2 @@ exports.createObj= function(sql){ | ||
return result; | ||
} | ||
/*}}}*/ | ||
}; |
@@ -1,15 +0,8 @@ | ||
/* | ||
作者:yixuan | ||
介绍:sql语句(update语句)解析类 | ||
邮箱:yixuan.zzq@taobao.com | ||
*/ | ||
var Lexter = require('../lexter.js'); | ||
var Tool = require('../sqlParseTool.js'); | ||
/*{{{ divideTokens()*/ | ||
/** | ||
* 分解Tokens | ||
* @param {Array} tokens 需要分解的tokens | ||
* @return {Object} 分解结果 | ||
* Divide tokens | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -47,14 +40,9 @@ function divideTokens(tokens){ | ||
} | ||
/*}}}*/ | ||
/*{{{ parseSource()*/ | ||
/** | ||
* 把tokens当做sql中的table字段解析 | ||
* @param {Array} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse source | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
function parseSource(tokens){ | ||
var res = {}; | ||
if(!(/^update$/i.test(tokens.shift().text))){i | ||
@@ -71,12 +59,10 @@ throw new Error("no keyword 'update'"); | ||
} | ||
} | ||
} | ||
exports.parseSource = parseSource; | ||
/*}}}*/ | ||
/*{{{ parseColumn()*/ | ||
/** | ||
* 把tokens当做sql中的set字段解析 | ||
* @param {Array} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse column | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -96,10 +82,9 @@ function parseColumn(tokens){ | ||
} | ||
exports.parseColumn = parseColumn; | ||
/*}}}*/ | ||
/*{{{ parseWhere()*/ | ||
/** | ||
* 把tokens当做sql中的where字段解析 | ||
* @param {Array} tokens 需要解析的tokens | ||
* @return {Object} 解析结果 | ||
* Parse where | ||
* @param {Array} tokens | ||
* @return {Object} | ||
*/ | ||
@@ -118,12 +103,10 @@ function parseWhere(tokens){ | ||
return res; | ||
} | ||
} | ||
exports.parseWhere = parseWhere; | ||
/*}}}*/ | ||
/*{{{ createObj()*/ | ||
/** | ||
* 创建sql对应的sql对象,可以选择解析部分 | ||
* @param {String} sql 需要分析的sql | ||
* @return {Object} 结果对象 | ||
* Create object | ||
* @param {String} sql | ||
* @return {Object} | ||
*/ | ||
@@ -144,4 +127,2 @@ exports.createObj = function(sql){ | ||
return res; | ||
} | ||
/*}}}*/ | ||
}; |
@@ -8,3 +8,3 @@ var Tool = require(__dirname + '/sqlParseTool.js'); | ||
require('fs').readdirSync(__dirname + '/parsers').forEach(function(file) { | ||
var match = file.match(/^(\w+)\.js$/); | ||
var match = file.match(/^(\w+)\.js$/); | ||
if (!match) { | ||
@@ -16,16 +16,19 @@ return; | ||
} | ||
init(); | ||
exports.parse = function(sql) { | ||
var parse = function(sql) { | ||
sql = sql.trim(); | ||
var who = sql.substr(0,sql.indexOf(' ')).toLowerCase(); | ||
if(parsers[who] === undefined){ | ||
throw new Error("Unsupport sentence"); | ||
throw new Error("Unsupported sentence"); | ||
} | ||
return parsers[who].createObj(sql); | ||
} | ||
}; | ||
exports.parse = parse; | ||
exports.RELATE = Tool.RELATE; | ||
exports.JOIN = Tool.JOIN; | ||
exports.ORDER = Tool.ORDER; | ||
exports.types = Lexter.types; | ||
exports.types = Lexter.types; |
var Lexter = require('./lexter.js'); | ||
/*{{{ RELATE*/ | ||
var RELATE = { | ||
@@ -18,16 +17,14 @@ "=": 1, | ||
"is null": 20, | ||
"not null": 21, | ||
"not null": 21 | ||
}; | ||
exports.RELATE = RELATE; | ||
/*}}}*/ | ||
/*{{{ ORDER*/ | ||
var ORDER = { | ||
'ASC' : 1, | ||
'DESC' : 2 | ||
} | ||
}; | ||
exports.ORDER = ORDER; | ||
/*}}}*/ | ||
/*{{{ JOIN*/ | ||
var JOIN = { | ||
@@ -37,10 +34,9 @@ 'INNER JOIN' : 1, | ||
'LEFT JOIN' : 3, | ||
'RIGHT JOIN' : 4, | ||
} | ||
'RIGHT JOIN' : 4 | ||
}; | ||
exports.JOIN = JOIN; | ||
/*}}}*/ | ||
/*{{{ removeParenthese()*/ | ||
/** | ||
* 过滤最外面的括号对 | ||
* Remove parent | ||
* @param {Array} tokens | ||
@@ -65,10 +61,9 @@ * @return {Array} | ||
} | ||
exports.removeParenthese = removeParenthese; | ||
/*}}}*/ | ||
/*{{{ merge()*/ | ||
/** | ||
* 拼合一组token的text字段 | ||
* @param {Array} parts token组成的数组 | ||
* @param {String} sep 连接分隔符 | ||
* Merge | ||
* @param {Array} parts token | ||
* @param {String} sep | ||
* @return {String} | ||
@@ -84,13 +79,12 @@ */ | ||
} | ||
exports.merge = merge; | ||
/*}}}*/ | ||
/*{{{ pickUp()*/ | ||
/** | ||
* 将str中的内容按照分隔符提取成数组,类似Array里的split | ||
* @param {String} str 待分割的字符串 | ||
* @param {String} sep 分隔符 | ||
* Pick up | ||
* @param {String} tokens | ||
* @param {String} sep | ||
* @return {Array} | ||
*/ | ||
function pickUp(tokens,sep){ | ||
function pickUp(tokens, sep){ | ||
tokens.push({text:sep}); | ||
@@ -115,11 +109,10 @@ var res = []; | ||
} | ||
exports.pickUp = pickUp; | ||
/*}}}*/ | ||
/*{{{ getHint()*/ | ||
/** | ||
* 获得hint信息 | ||
* @param {array} part 可能包含hint的部分 | ||
* @param {int} pos hint出现的位置 | ||
* @return {obj||undefined} 返回信息对象或者Undefined | ||
* Hint | ||
* @param {Array} part | ||
* @param {int} pos | ||
* @return {obj||undefined} | ||
*/ | ||
@@ -140,10 +133,9 @@ function getHint(part,pos){ | ||
} | ||
exports.getHint = getHint; | ||
/*}}}*/ | ||
/*{{{ parseOneSource()*/ | ||
/** | ||
* 解析一个源 | ||
* @param {Object} part 由几个token表示的一个源 | ||
* @return {Object} 这个源的解析结果 | ||
* Parse one source | ||
* @param {Object} part | ||
* @return {Object} | ||
*/ | ||
@@ -156,7 +148,4 @@ function parseOneSource(part){ | ||
var idx = part[0].text.indexOf("."); | ||
//确定源种类 | ||
type = part[0].text.substr(0,idx); | ||
/*{{{ 确定具体源*/ | ||
//例如from字段跟的是(select * from table)这样的子表 | ||
if(idx === -1){ | ||
@@ -178,3 +167,2 @@ if(part[0].text === "("){ | ||
} | ||
//例如sql.()这样的源 | ||
}else if(idx === part[0].text.length - 1){ | ||
@@ -194,3 +182,2 @@ if(part[1].text !== "("){throw new Error("something wrong in 'source' part");} | ||
if(j === part.length){throw new Error("lack parentheses in 'source' part");} | ||
//列入db.table这样的源 | ||
}else{ | ||
@@ -200,5 +187,3 @@ source = part[0].text.substr(idx+1); | ||
} | ||
/*}}}*/ | ||
/*{{{ 确定源名字,并设置返回对象*/ | ||
if(part.length === 0){ | ||
@@ -218,15 +203,12 @@ res = { | ||
} | ||
/*}}}*/ | ||
return res; | ||
} | ||
} | ||
exports.parseOneSource = parseOneSource; | ||
/*}}}*/ | ||
/*{{{ parseOneWhere()*/ | ||
/** | ||
* 解析一个条件 | ||
* @param {Object} part 由几个token表示的一个条件 | ||
* @return {Object} 这个条件的解析结果 | ||
* Parse One Where | ||
* @param {Object} part | ||
* @return {Object} | ||
*/ | ||
@@ -237,3 +219,2 @@ function parseOneWhere(part){ | ||
res["column"] = part[0]; | ||
//如果关系是操作符 | ||
if(relate.type === Lexter.types.OPERATOR){ | ||
@@ -245,3 +226,2 @@ if(RELATE[relate.text] === undefined){ | ||
res["values"] = group(part.slice(2),','); | ||
//如果关系是类似 in , like 这样的关键字 | ||
}else{ | ||
@@ -283,10 +263,9 @@ if(relate.text.toLowerCase() === "between"){ | ||
} | ||
exports.parseOneWhere = parseOneWhere; | ||
/*}}}*/ | ||
/*{{{ group */ | ||
/** | ||
* token分组 | ||
* @param {array} part token组 | ||
* @param {string} sep 分隔符 | ||
* Group | ||
* @param {array} part token | ||
* @param {string} sep | ||
* @param {} | ||
@@ -313,4 +292,2 @@ */ | ||
return res; | ||
} | ||
/*}}}*/ | ||
} |
{ | ||
"name": "sql-parse", | ||
"version": "0.1.1", | ||
"version": "0.1.3", | ||
"author": { | ||
@@ -26,2 +26,2 @@ "name": "Andriy Ermolenko", | ||
"license": "MIT" | ||
} | ||
} |
# sql-parse | ||
A tool for parsing SQL queries. | ||
### A tool for parsing SQL queries. | ||
[![Build Status](https://travis-ci.org/invercity/sql-parse.svg)](https://travis-ci.org/invercity/sql-parse) | ||
[![NPM Version][npm-image]][npm-url] | ||
# Installing | ||
## Installing | ||
@@ -9,3 +11,3 @@ ```bash | ||
``` | ||
# Usage | ||
## Usage | ||
@@ -16,3 +18,3 @@ ```javascript | ||
``` | ||
# Testing | ||
## Testing | ||
@@ -22,3 +24,6 @@ * make test | ||
# License | ||
## License | ||
### MIT | ||
[npm-image]: https://img.shields.io/npm/v/sql-parse.svg | ||
[npm-url]: https://npmjs.org/package/sql-parse |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
26
58671
18
2071