mybatis-mapper-myyrakle
Advanced tools
Comparing version 0.6.6 to 0.6.7
@@ -1,98 +0,99 @@ | ||
var convertChildren = function(children, param, namespace, myBatisMapper) { | ||
var convertChildren = function (children, param, namespace, myBatisMapper) { | ||
if (param == null) { | ||
param = {}; | ||
} | ||
if (!isDict(param)){ | ||
if (!isDict(param)) { | ||
throw new Error("Parameter argument should be Key-Value type or Null."); | ||
} | ||
if (children.type == 'text') { | ||
if (children.type == "text") { | ||
// Convert Parameters | ||
return convertParameters(children, param); | ||
} else if (children.type == 'tag') { | ||
} else if (children.type == "tag") { | ||
switch (children.name.toLowerCase()) { | ||
case 'if': | ||
return convertIf(children, param, namespace, myBatisMapper); | ||
break; | ||
case 'choose': | ||
return convertChoose(children, param, namespace, myBatisMapper); | ||
break; | ||
case 'trim': | ||
case 'where': | ||
return convertTrimWhere(children, param, namespace, myBatisMapper); | ||
break; | ||
case 'set': | ||
return convertSet(children, param, namespace, myBatisMapper); | ||
break; | ||
case 'foreach': | ||
return convertForeach(children, param, namespace, myBatisMapper); | ||
break; | ||
case 'bind': | ||
param = convertBind(children, param); | ||
return ''; | ||
break; | ||
case 'include': | ||
return convertInclude(children, param, namespace, myBatisMapper); | ||
default: | ||
throw new Error("XML is not well-formed character or markup. Consider using CDATA section."); | ||
break; | ||
case "if": | ||
return convertIf(children, param, namespace, myBatisMapper); | ||
break; | ||
case "choose": | ||
return convertChoose(children, param, namespace, myBatisMapper); | ||
break; | ||
case "trim": | ||
case "where": | ||
return convertTrimWhere(children, param, namespace, myBatisMapper); | ||
break; | ||
case "set": | ||
return convertSet(children, param, namespace, myBatisMapper); | ||
break; | ||
case "foreach": | ||
return convertForeach(children, param, namespace, myBatisMapper); | ||
break; | ||
case "bind": | ||
param = convertBind(children, param); | ||
return ""; | ||
break; | ||
case "include": | ||
return convertInclude(children, param, namespace, myBatisMapper); | ||
default: | ||
throw new Error( | ||
"XML is not well-formed character or markup. Consider using CDATA section." | ||
); | ||
break; | ||
} | ||
} else { | ||
return ''; | ||
return ""; | ||
} | ||
} | ||
}; | ||
var convertParameters = function(children, param) { | ||
var convertParameters = function (children, param) { | ||
var convertString = children.content; | ||
try{ | ||
convertString = convertParametersInner('#', convertString, param); | ||
convertString = convertParametersInner('$', convertString, param); | ||
try { | ||
convertString = convertParametersInner("#", convertString, param); | ||
convertString = convertParametersInner("$", convertString, param); | ||
} catch (err) { | ||
throw new Error("Error occurred during convert parameters."); | ||
} | ||
try{ | ||
try { | ||
// convert CDATA string | ||
convertString = convertString.replace(/(\&\;)/g,'&'); | ||
convertString = convertString.replace(/(\<\;)/g,'<'); | ||
convertString = convertString.replace(/(\>\;)/g,'>'); | ||
convertString = convertString.replace(/(\"\;)/g,'"'); | ||
convertString = convertString.replace(/(\&\;)/g, "&"); | ||
convertString = convertString.replace(/(\<\;)/g, "<"); | ||
convertString = convertString.replace(/(\>\;)/g, ">"); | ||
convertString = convertString.replace(/(\"\;)/g, '"'); | ||
} catch (err) { | ||
throw new Error("Error occurred during convert CDATA section."); | ||
} | ||
return convertString; | ||
} | ||
}; | ||
var isObject = function (variable) { | ||
return typeof variable === 'object' && variable !== null; | ||
} | ||
return typeof variable === "object" && variable !== null; | ||
}; | ||
var isArray = function (variable) { | ||
return isObject(variable) && variable.hasOwnProperty('length'); | ||
} | ||
return isObject(variable) && variable.hasOwnProperty("length"); | ||
}; | ||
var convertParametersInner = function(change, convertString, param) { | ||
var stringReg = new RegExp('(\\' + change + '\\{[a-zA-Z0-9._\\$]+\\})', 'g'); | ||
var convertParametersInner = function (change, convertString, param) { | ||
var stringReg = new RegExp("(\\" + change + "\\{[a-zA-Z0-9._\\$]+\\})", "g"); | ||
var stringTarget = convertString.match(stringReg); | ||
if (stringTarget != null && stringTarget.length > 0){ | ||
if (stringTarget != null && stringTarget.length > 0) { | ||
stringTarget = uniqueArray(stringTarget); | ||
var target = null; | ||
for (var i=0; i<stringTarget.length; i++) { | ||
for (var i = 0; i < stringTarget.length; i++) { | ||
target = stringTarget[i]; | ||
var t = target.replace(change + '{', '').replace('}',''); | ||
var tempParamKey = eval('param.' + t); | ||
if (tempParamKey !== undefined){ | ||
var reg = new RegExp('\\' + change + '{' + t + '}', 'g'); | ||
var t = target.replace(change + "{", "").replace("}", ""); | ||
var tempParamKey = eval("param." + t); | ||
if (tempParamKey !== undefined) { | ||
var reg = new RegExp("\\" + change + "{" + t + "}", "g"); | ||
if (tempParamKey === null) { | ||
tempParamKey = 'NULL'; | ||
tempParamKey = "NULL"; | ||
convertString = convertString.replace(reg, tempParamKey); | ||
} else { | ||
if (change == '#') { | ||
if (change == "#") { | ||
// processing JSON fields structures | ||
@@ -102,8 +103,14 @@ if (isObject(tempParamKey) || isArray(tempParamKey)) { | ||
} else { | ||
tempParamKey = tempParamKey.toString().replace(/"/g, '\\\"'); | ||
tempParamKey = tempParamKey.toString().replace(/"/g, '"'); | ||
// I think it dont need backslash. | ||
// This is because it will be wrapped in single quotes anyway. | ||
// And in the case of postgres, backslash escape is not valid. | ||
} | ||
tempParamKey = tempParamKey.replace(/'/g, '\'\''); | ||
convertString = convertString.replace(reg, "'" + tempParamKey + "'"); | ||
} else if (change == '$') { | ||
tempParamKey = tempParamKey.replace(/'/g, "''"); | ||
convertString = convertString.replace( | ||
reg, | ||
"'" + tempParamKey + "'" | ||
); | ||
} else if (change == "$") { | ||
convertString = convertString.replace(reg, tempParamKey); | ||
@@ -116,60 +123,77 @@ } | ||
return convertString; | ||
} | ||
}; | ||
var convertIf = function(children, param, namespace, myBatisMapper) { | ||
try{ | ||
var convertIf = function (children, param, namespace, myBatisMapper) { | ||
try { | ||
var evalString = children.attrs.test; | ||
// Create Evaluate string | ||
evalString = replaceEvalString(evalString, param); | ||
evalString = evalString.replace(/ and /gi, ' && '); | ||
evalString = evalString.replace(/ or /gi, ' || '); | ||
evalString = evalString.replace(/ and /gi, " && "); | ||
evalString = evalString.replace(/ or /gi, " || "); | ||
// replace == to === for strict evaluate | ||
evalString = evalString.replace(/==/g, "==="); | ||
evalString = evalString.replace(/!=/g, "!=="); | ||
} catch (err) { | ||
throw new Error("Error occurred during convert <if> element."); | ||
} | ||
// Execute Evaluate string | ||
try { | ||
if (eval(evalString)) { | ||
var convertString = ''; | ||
for (var i=0, nextChildren; nextChildren=children['children'][i]; i++){ | ||
convertString += convertChildren(nextChildren, param, namespace, myBatisMapper); | ||
var convertString = ""; | ||
for ( | ||
var i = 0, nextChildren; | ||
(nextChildren = children["children"][i]); | ||
i++ | ||
) { | ||
convertString += convertChildren( | ||
nextChildren, | ||
param, | ||
namespace, | ||
myBatisMapper | ||
); | ||
} | ||
return convertString; | ||
} else { | ||
return ''; | ||
return ""; | ||
} | ||
} catch (e) { | ||
return ''; | ||
return ""; | ||
} | ||
} | ||
}; | ||
var convertForeach = function (children, param, namespace, myBatisMapper) { | ||
try{ | ||
var collection = eval('param.' + children.attrs.collection); | ||
try { | ||
var collection = eval("param." + children.attrs.collection); | ||
var item = children.attrs.item; | ||
var open = (children.attrs.open == null)? '' : children.attrs.open; | ||
var close = (children.attrs.close == null)? '' : children.attrs.close; | ||
var separator = (children.attrs.separator == null)? '' : children.attrs.separator; | ||
var open = children.attrs.open == null ? "" : children.attrs.open; | ||
var close = children.attrs.close == null ? "" : children.attrs.close; | ||
var separator = | ||
children.attrs.separator == null ? "" : children.attrs.separator; | ||
var foreachTexts = []; | ||
var coll = null; | ||
for (var j=0; j<collection.length; j++){ | ||
for (var j = 0; j < collection.length; j++) { | ||
coll = collection[j]; | ||
var foreachParam = param; | ||
foreachParam[item] = coll; | ||
var foreachText = ''; | ||
for (var k=0, nextChildren; nextChildren=children.children[k]; k++){ | ||
var fText = convertChildren(nextChildren, foreachParam, namespace, myBatisMapper); | ||
fText = fText.replace(/^\s*$/g, ''); | ||
if (fText != null && fText.length > 0){ | ||
var foreachText = ""; | ||
for ( | ||
var k = 0, nextChildren; | ||
(nextChildren = children.children[k]); | ||
k++ | ||
) { | ||
var fText = convertChildren( | ||
nextChildren, | ||
foreachParam, | ||
namespace, | ||
myBatisMapper | ||
); | ||
fText = fText.replace(/^\s*$/g, ""); | ||
if (fText != null && fText.length > 0) { | ||
foreachText += fText; | ||
@@ -179,25 +203,28 @@ } | ||
if (foreachText != null && foreachText.length > 0){ | ||
if (foreachText != null && foreachText.length > 0) { | ||
foreachTexts.push(foreachText); | ||
} | ||
} | ||
return (open + foreachTexts.join(separator) + close); | ||
return open + foreachTexts.join(separator) + close; | ||
} catch (err) { | ||
throw new Error("Error occurred during convert <foreach> element."); | ||
} | ||
} | ||
}; | ||
var convertChoose = function (children, param, namespace, myBatisMapper) { | ||
try{ | ||
for (var i=0, whenChildren; whenChildren=children.children[i];i++){ | ||
if (whenChildren.type == 'tag' && whenChildren.name.toLowerCase() == 'when'){ | ||
try { | ||
for (var i = 0, whenChildren; (whenChildren = children.children[i]); i++) { | ||
if ( | ||
whenChildren.type == "tag" && | ||
whenChildren.name.toLowerCase() == "when" | ||
) { | ||
var evalString = whenChildren.attrs.test; | ||
// Create Evaluate string | ||
evalString = replaceEvalString(evalString, param); | ||
evalString = evalString.replace(/ and /gi, ' && '); | ||
evalString = evalString.replace(/ or /gi, ' || '); | ||
evalString = evalString.replace(/ and /gi, " && "); | ||
evalString = evalString.replace(/ or /gi, " || "); | ||
// Execute Evaluate string | ||
@@ -207,5 +234,14 @@ try { | ||
// If <when> condition is true, do it. | ||
var convertString = ''; | ||
for (var k=0, nextChildren; nextChildren=whenChildren.children[k]; k++){ | ||
convertString += convertChildren(nextChildren, param, namespace, myBatisMapper); | ||
var convertString = ""; | ||
for ( | ||
var k = 0, nextChildren; | ||
(nextChildren = whenChildren.children[k]); | ||
k++ | ||
) { | ||
convertString += convertChildren( | ||
nextChildren, | ||
param, | ||
namespace, | ||
myBatisMapper | ||
); | ||
} | ||
@@ -219,7 +255,19 @@ return convertString; | ||
} | ||
} else if (whenChildren.type == 'tag' && whenChildren.name.toLowerCase() == 'otherwise') { | ||
} else if ( | ||
whenChildren.type == "tag" && | ||
whenChildren.name.toLowerCase() == "otherwise" | ||
) { | ||
// If reached <otherwise> tag, do it. | ||
var convertString = ''; | ||
for (var k=0, nextChildren; nextChildren=whenChildren.children[k]; k++){ | ||
convertString += convertChildren(nextChildren, param, namespace, myBatisMapper); | ||
var convertString = ""; | ||
for ( | ||
var k = 0, nextChildren; | ||
(nextChildren = whenChildren.children[k]); | ||
k++ | ||
) { | ||
convertString += convertChildren( | ||
nextChildren, | ||
param, | ||
namespace, | ||
myBatisMapper | ||
); | ||
} | ||
@@ -229,90 +277,109 @@ return convertString; | ||
} | ||
// If there is no suitable when and otherwise, just return null. | ||
return ''; | ||
return ""; | ||
} catch (err) { | ||
throw new Error("Error occurred during convert <choose> element."); | ||
} | ||
} | ||
}; | ||
var convertTrimWhere = function(children, param, namespace, myBatisMapper) { | ||
var convertString = ''; | ||
var convertTrimWhere = function (children, param, namespace, myBatisMapper) { | ||
var convertString = ""; | ||
var prefix = null; | ||
var prefixOverrides = null; | ||
var globalSet = null; | ||
try{ | ||
try { | ||
switch (children.name.toLowerCase()) { | ||
case 'trim': | ||
prefix = children.attrs.prefix; | ||
prefixOverrides = children.attrs.prefixOverrides; | ||
globalSet = 'g'; | ||
break; | ||
case 'where': | ||
prefix = 'WHERE'; | ||
prefixOverrides = 'and|or'; | ||
globalSet = 'gi'; | ||
break; | ||
default: | ||
throw new Error("Error occurred during convert <trim/where> element."); | ||
break; | ||
case "trim": | ||
prefix = children.attrs.prefix; | ||
prefixOverrides = children.attrs.prefixOverrides; | ||
globalSet = "g"; | ||
break; | ||
case "where": | ||
prefix = "WHERE"; | ||
prefixOverrides = "and|or"; | ||
globalSet = "gi"; | ||
break; | ||
default: | ||
throw new Error("Error occurred during convert <trim/where> element."); | ||
break; | ||
} | ||
// Convert children first. | ||
for (var j=0, nextChildren; nextChildren=children.children[j]; j++){ | ||
convertString += convertChildren(nextChildren, param, namespace, myBatisMapper); | ||
for (var j = 0, nextChildren; (nextChildren = children.children[j]); j++) { | ||
convertString += convertChildren( | ||
nextChildren, | ||
param, | ||
namespace, | ||
myBatisMapper | ||
); | ||
} | ||
// Remove prefixOverrides | ||
var trimRegex = new RegExp('(^)([\\s]*?)(' + prefixOverrides + ')', globalSet); | ||
convertString = convertString.replace(trimRegex, ''); | ||
if (children.name.toLowerCase() != 'trim'){ | ||
var trimRegex = new RegExp('(' + prefixOverrides + ')([\\s]*?)($)', globalSet); | ||
convertString = convertString.replace(trimRegex, ''); | ||
} | ||
var trimRegex = new RegExp( | ||
"(^)([\\s]*?)(" + prefixOverrides + ")", | ||
globalSet | ||
); | ||
convertString = convertString.replace(trimRegex, ""); | ||
if (children.name.toLowerCase() != "trim") { | ||
var trimRegex = new RegExp( | ||
"(" + prefixOverrides + ")([\\s]*?)($)", | ||
globalSet | ||
); | ||
convertString = convertString.replace(trimRegex, ""); | ||
} | ||
// Add Prefix if String is not empty. | ||
var trimRegex = new RegExp('([a-zA-Z])', 'g'); | ||
var trimRegex = new RegExp("([a-zA-Z])", "g"); | ||
var w = convertString.match(trimRegex); | ||
if (w != null && w.length > 0) { | ||
convertString = prefix + ' '+ convertString; | ||
convertString = prefix + " " + convertString; | ||
} | ||
// Remove comma(,) before WHERE | ||
if (children.name.toLowerCase() != 'where'){ | ||
var regex = new RegExp('(,)([\\s]*?)(where)', 'gi'); | ||
convertString = convertString.replace(regex, ' WHERE '); | ||
if (children.name.toLowerCase() != "where") { | ||
var regex = new RegExp("(,)([\\s]*?)(where)", "gi"); | ||
convertString = convertString.replace(regex, " WHERE "); | ||
} | ||
return convertString; | ||
} catch (err) { | ||
throw new Error("Error occurred during convert <" + children.name.toLowerCase() + "> element."); | ||
throw new Error( | ||
"Error occurred during convert <" + | ||
children.name.toLowerCase() + | ||
"> element." | ||
); | ||
} | ||
} | ||
}; | ||
var convertSet = function(children, param, namespace, myBatisMapper) { | ||
var convertString = ''; | ||
try{ | ||
var convertSet = function (children, param, namespace, myBatisMapper) { | ||
var convertString = ""; | ||
try { | ||
// Convert children first. | ||
for (var j=0, nextChildren; nextChildren=children.children[j]; j++){ | ||
convertString += convertChildren(nextChildren, param, namespace, myBatisMapper); | ||
for (var j = 0, nextChildren; (nextChildren = children.children[j]); j++) { | ||
convertString += convertChildren( | ||
nextChildren, | ||
param, | ||
namespace, | ||
myBatisMapper | ||
); | ||
} | ||
// Remove comma repeated more than 2. | ||
var regex = new RegExp('(,)(,|\\s){2,}', 'g'); | ||
convertString = convertString.replace(regex, ',\n'); | ||
var regex = new RegExp("(,)(,|\\s){2,}", "g"); | ||
convertString = convertString.replace(regex, ",\n"); | ||
// Remove first comma if exists. | ||
var regex = new RegExp('(^)([\\s]*?)(,)', 'g'); | ||
convertString = convertString.replace(regex, ''); | ||
var regex = new RegExp("(^)([\\s]*?)(,)", "g"); | ||
convertString = convertString.replace(regex, ""); | ||
// Remove last comma if exists. | ||
regex = new RegExp('(,)([\\s]*?)($)', 'g'); | ||
convertString = convertString.replace(regex, ''); | ||
convertString = ' SET ' + convertString; | ||
regex = new RegExp("(,)([\\s]*?)($)", "g"); | ||
convertString = convertString.replace(regex, ""); | ||
convertString = " SET " + convertString; | ||
return convertString; | ||
@@ -322,73 +389,95 @@ } catch (err) { | ||
} | ||
} | ||
}; | ||
var convertBind = function(children, param) { | ||
var convertBind = function (children, param) { | ||
var evalString = children.attrs.value; | ||
// Create Evaluate string | ||
evalString = replaceEvalString(evalString, param); | ||
param[children.attrs.name] = eval(evalString); | ||
return param; | ||
} | ||
}; | ||
var convertInclude = function(children, param, namespace, myBatisMapper) { | ||
try{ | ||
var convertInclude = function (children, param, namespace, myBatisMapper) { | ||
try { | ||
// Add Properties to param | ||
for (var j=0, nextChildren; nextChildren=children.children[j]; j++){ | ||
if (nextChildren.type == 'tag' && nextChildren.name == 'property'){ | ||
param[nextChildren.attrs['name']] = nextChildren.attrs['value']; | ||
for (var j = 0, nextChildren; (nextChildren = children.children[j]); j++) { | ||
if (nextChildren.type == "tag" && nextChildren.name == "property") { | ||
param[nextChildren.attrs["name"]] = nextChildren.attrs["value"]; | ||
} | ||
} | ||
} catch (err) { | ||
throw new Error("Error occurred during read <property> element in <include> element."); | ||
throw new Error( | ||
"Error occurred during read <property> element in <include> element." | ||
); | ||
} | ||
try{ | ||
var refid = convertParametersInner('#', children['attrs']['refid'], param); | ||
refid = convertParametersInner('$', refid, param); | ||
var statement = ''; | ||
for (var i=0, children; children = myBatisMapper[namespace][refid][i]; i++) { | ||
try { | ||
var refid = convertParametersInner("#", children["attrs"]["refid"], param); | ||
refid = convertParametersInner("$", refid, param); | ||
var statement = ""; | ||
for ( | ||
var i = 0, children; | ||
(children = myBatisMapper[namespace][refid][i]); | ||
i++ | ||
) { | ||
statement += convertChildren(children, param, namespace, myBatisMapper); | ||
} | ||
} | ||
} catch (err) { | ||
throw new Error("Error occurred during convert 'refid' attribute in <include> element."); | ||
throw new Error( | ||
"Error occurred during convert 'refid' attribute in <include> element." | ||
); | ||
} | ||
return statement; | ||
} | ||
}; | ||
var isDict = function(v) { | ||
return typeof v==='object' && v!==null && !(v instanceof Array) && !(v instanceof Date); | ||
} | ||
var isDict = function (v) { | ||
return ( | ||
typeof v === "object" && | ||
v !== null && | ||
!(v instanceof Array) && | ||
!(v instanceof Date) | ||
); | ||
}; | ||
var replaceEvalString = function(evalString, param) { | ||
var replaceEvalString = function (evalString, param) { | ||
var keys = Object.keys(param); | ||
for (var i=0; i<keys.length; i++){ | ||
var replacePrefix = ''; | ||
var replacePostfix = ''; | ||
for (var i = 0; i < keys.length; i++) { | ||
var replacePrefix = ""; | ||
var replacePostfix = ""; | ||
var paramRegex = null; | ||
if (isDict(param[keys[i]])) { | ||
replacePrefix = ' param.'; | ||
replacePostfix = ''; | ||
paramRegex = new RegExp('(^|[^a-zA-Z0-9])(' + keys[i] + '\\.)([a-zA-Z0-9]+)', 'g'); | ||
} else { | ||
replacePrefix = ' param.'; | ||
replacePostfix = ' '; | ||
paramRegex = new RegExp('(^|[^a-zA-Z0-9])(' + keys[i] + ')($|[^a-zA-Z0-9])', 'g'); | ||
replacePrefix = " param."; | ||
replacePostfix = ""; | ||
paramRegex = new RegExp( | ||
"(^|[^a-zA-Z0-9])(" + keys[i] + "\\.)([a-zA-Z0-9]+)", | ||
"g" | ||
); | ||
} else { | ||
replacePrefix = " param."; | ||
replacePostfix = " "; | ||
paramRegex = new RegExp( | ||
"(^|[^a-zA-Z0-9])(" + keys[i] + ")($|[^a-zA-Z0-9])", | ||
"g" | ||
); | ||
} | ||
evalString = evalString.replace(paramRegex, ("$1" + replacePrefix + "$2" + replacePostfix + "$3")); | ||
evalString = evalString.replace( | ||
paramRegex, | ||
"$1" + replacePrefix + "$2" + replacePostfix + "$3" | ||
); | ||
} | ||
return evalString; | ||
} | ||
}; | ||
var uniqueArray = function(a){ | ||
var uniqueArray = function (a) { | ||
var seen = {}; | ||
@@ -398,5 +487,5 @@ var out = []; | ||
var j = 0; | ||
for(var i=0; i<len; i++) { | ||
for (var i = 0; i < len; i++) { | ||
var item = a[i]; | ||
if(seen[item] !== 1) { | ||
if (seen[item] !== 1) { | ||
seen[item] = 1; | ||
@@ -407,3 +496,3 @@ out[j++] = item; | ||
return out; | ||
} | ||
}; | ||
@@ -418,3 +507,3 @@ module.exports = { | ||
convertChoose, | ||
convertBind | ||
convertBind, | ||
}; |
{ | ||
"name": "mybatis-mapper-myyrakle", | ||
"version": "0.6.6", | ||
"version": "0.6.7", | ||
"description": "mybatis-mapper can generate SQL statements from the MyBatis3 Mapper XML file in node.js. You can use Dynamic SQL elements", | ||
@@ -5,0 +5,0 @@ "author": { |
67780
874