Skip to content

Commit 973ae99

Browse files
committed
Java:MultiDataSource 中 SQLAuto 支持匿名变量,直接 ? + 参数配置填值
1 parent f491b68 commit 973ae99

2 files changed

Lines changed: 26 additions & 19 deletions

File tree

‎APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/DemoController.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,13 +2244,13 @@ public static void init(boolean shutdownWhenServerError, APIJSONCreator<?, ? ext
22442244

22452245
for (int j = 0; j < args.length; j++) {
22462246
String arg = StringUtil.trim(args[j]);
2247-
int ind = arg.startsWith("//") || arg.startsWith("#") || arg.startsWith("--") ? -1 : arg.indexOf(": ");
2247+
int ind = arg.startsWith("//") || arg.startsWith("#") || arg.startsWith("--") ? -1 : arg.indexOf(":");
22482248
String key = ind <= 0 ? null : arg.substring(0, ind);
22492249
if (StringUtil.isEmpty(key)) {
22502250
continue;
22512251
}
22522252

2253-
valuesMap.put(key, "?");
2253+
valuesMap.put(key.trim(), "?");
22542254
// 语法报错 sql = sql.replaceAll("\${" + key + "}", "?");
22552255
}
22562256

‎APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/static/sql/js/main.js‎

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,13 +1209,14 @@ https://github.com/Tencent/APIJSON/issues
12091209
}
12101210

12111211
index = item2.indexOf(':')
1212-
if (index <= 0) {
1213-
throw new Error('请求头 Request Header 输入错误!请按照每行 key: value 的格式输入,不要有多余的换行或空格!'
1212+
var key = index <= 0 ? 'sqlautoVal' + i : StringUtil.trim(item2.substring(0, index))
1213+
if (index == 0) { // <= 0) {
1214+
throw new Error('请求头 Request Header 输入错误!请按照每行 key: value // 对应 ${key} 或 value // 对应 ? 的格式输入,不要有多余的换行或空格!'
12141215
+ '\n错误位置: 第 ' + (i + 1) + ' 行'
12151216
+ '\n错误文本: ' + item)
12161217
}
12171218

1218-
var val = item2.substring(index + 1, item2.length).trim();
1219+
var val = index < 0 ? item2.trim() : item2.substring(index + 1, item2.length).trim();
12191220

12201221
// var ind = val.indexOf('(') //一定要有函数是为了避免里面是一个简短单词和 SQLAuto 代码中变量冲突
12211222
// if (ind > 0 && val.indexOf(')') > ind) { //不从 0 开始是为了保证是函数,且不是 (1) 这种单纯限制作用域的括号
@@ -1227,7 +1228,7 @@ https://github.com/Tencent/APIJSON/issues
12271228
}
12281229
// }
12291230

1230-
header[StringUtil.trim(item2.substring(0, index))] = val
1231+
header[key] = val
12311232
}
12321233
}
12331234

@@ -7573,6 +7574,8 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
75737574
var lastVarIndex = -1;
75747575

75757576
const q = '`'; // 只能用反引号,因为很可能有换行,需要 eval return this.getQuote()
7577+
var sqlRest = sql
7578+
75767579
for (let i = 0; i < reqCount; i ++) {
75777580
const which = i;
75787581
const lineItem = lines[i] || '';
@@ -7600,14 +7603,17 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
76007603
const index = line.indexOf(': '); //APIJSON Table:alias 前面不会有空格 //致后面就接 { 'a': 1} 报错 Unexpected token ':' lastIndexOf(': '); // indexOf(': '); 可能会有 Comment:to
76017604
const p_k = line.substring(0, index);
76027605

7603-
var varIndex = sql.indexOf('${' + p_k + '}')
7604-
if (varIndex <= 0) {
7605-
throw new Error('参数配置第 ' + (i + 1) + ' 行错误! \n' + p_k + ': value 必须对应以上 SQL 中有 ${' + p_k + '} !\n不允许任何多余的空格!\n必须按 SQL 中变量的顺序配置参数,且 SQL 中不允许同名变量!')
7606-
}
7607-
if (varIndex <= lastVarIndex) {
7608-
throw new Error('参数配置第 ' + (i + 1) + ' 行位置错误!\n' + p_k + ': value 必须按在 SQL 中变量 ${' + p_k + '} 的位置配置参数,且 SQL 中不允许同名变量!')
7606+
var hasKey = StringUtil.isNotEmpty(p_k)
7607+
var varExp = hasKey ? '${' + p_k + '}' : '?'
7608+
var varIndex = sqlRest.indexOf(varExp)
7609+
if (varIndex < 0) {
7610+
throw new Error('参数配置第 ' + (i + 1) + ' 行错误! \n' + p_k + ': value 必须对应以上 SQL 中有 ' + varExp + ' !\n不允许任何多余的空格!\n必须按 SQL 中变量的顺序配置参数,且 SQL 中不允许同名变量!')
76097611
}
7612+
// if (varIndex <= lastVarIndex) {
7613+
// throw new Error('参数配置第 ' + (i + 1) + ' 行位置错误!\n' + p_k + ': value 必须按在 SQL 中变量 ' + varExp + ' 的位置配置参数,且 SQL 中不允许同名变量!')
7614+
// }
76107615

7616+
sqlRest = sqlRest.substring(varIndex + varExp.length)
76117617
lastVarIndex = varIndex
76127618

76137619
const bi = -1; //没必要支持,用 before: undefined, after: .. 同样支持替换,反而这样导致不兼容包含空格的 key p_k.indexOf(' ');
@@ -7624,17 +7630,18 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
76247630

76257631
const lastKeyInPath = pathKeys[pathKeys.length - 1]
76267632
const customizeKey = bi > 0;
7627-
const key = customizeKey ? p_k.substring(bi + 1) : lastKeyInPath;
7633+
var key = customizeKey ? p_k.substring(bi + 1) : lastKeyInPath;
76287634
if (key == null || key.trim().length <= 0) {
7629-
throw new Error('参数注入 第 ' + (i + 1) + ' 行格式错误!\n字符 ' + key + ' 不是合法的 JSON key!' +
7630-
'\n每个随机变量配置都必须按照\n key0/key1/../targetKey replaceKey: value // 注释\n的格式!' +
7631-
'\n注意冒号 ": " 左边 0 空格,右边 1 空格!其中 replaceKey 可省略。' +
7632-
'\nkey: {} 中最外层常量对象 {} 必须用括号包裹为 ({}),也就是 key: ({}) 这种格式!' +
7633-
'\nkey: 多行代码 必须用 function f() { var a = 1; return a; } f() 这种一行代码格式!');
7635+
// throw new Error('参数注入 第 ' + (i + 1) + ' 行格式错误!\n字符 ' + key + ' 不是合法的 JSON key!' +
7636+
// '\n每个随机变量配置都必须按照\n key0/key1/../targetKey replaceKey: value // 注释\n的格式!' +
7637+
// '\n注意冒号 ": " 左边 0 空格,右边 1 空格!其中 replaceKey 可省略。' +
7638+
// '\nkey: {} 中最外层常量对象 {} 必须用括号包裹为 ({}),也就是 key: ({}) 这种格式!' +
7639+
// '\nkey: 多行代码 必须用 function f() { var a = 1; return a; } f() 这种一行代码格式!');
7640+
key = "sqlautoVar" + i
76347641
}
76357642

76367643
// value RANDOM_DB
7637-
const value = line.substring(index + ': '.length);
7644+
const value = index < 0 ? line : line.substring(index + ': '.length);
76387645

76397646
var invoke = function (val, which, p_k, pathKeys, key, lastKeyInPath) {
76407647
try {

0 commit comments

Comments
 (0)