Skip to content

Commit c3cc0de

Browse files
committed
Server:大小写敏感,正则匹配,包含选项,增加移除,POST等功能兼容PostgreSQL
1 parent 534bf30 commit c3cc0de

File tree

2 files changed

+46
-25
lines changed

2 files changed

+46
-25
lines changed

APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/server/DemoSQLConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ public class DemoSQLConfig extends AbstractSQLConfig {
3939
TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user");
4040
TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy");
4141
}
42+
43+
// @Override
44+
// public String getDatabase() {
45+
// return DATABASE_POSTGRESQL;
46+
// }
4247

4348
@Override
4449
public String getDBUri() {

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/AbstractSQLConfig.java

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,9 @@ public String getTable() {
236236
@JSONField(serialize = false)
237237
@Override
238238
public String getSQLTable() {
239-
String t = TABLE_KEY_MAP.containsKey(table) ? TABLE_KEY_MAP.get(table) : table;
240-
return DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? t.toLowerCase() : t;
239+
// String t = TABLE_KEY_MAP.containsKey(table) ? TABLE_KEY_MAP.get(table) : table;
240+
//如果要强制小写,则可在子类重写这个方法再 toLowerCase return DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? t.toLowerCase() : t;
241+
return TABLE_KEY_MAP.containsKey(table) ? TABLE_KEY_MAP.get(table) : table;
241242
}
242243
@JSONField(serialize = false)
243244
@Override
@@ -257,7 +258,8 @@ public String getAlias() {
257258
}
258259
String q = getQuote();
259260
//getTable 不能小写,因为Verifier用大小写敏感的名称判断权限
260-
return q + (DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? alias.toLowerCase() : alias) + q;
261+
//如果要强制小写,则可在子类重写这个方法再 toLowerCase return q + (DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? alias.toLowerCase() : alias) + q;
262+
return q + alias + q;
261263
}
262264
@Override
263265
public AbstractSQLConfig setAlias(String alias) {
@@ -490,21 +492,24 @@ public String getColumnString(boolean inSQLJoin) throws Exception {
490492
}
491493
}
492494
}
493-
return SQL.count(column != null && column.size() == 1 ? column.get(0) : "*");
495+
return SQL.count(column != null && column.size() == 1 ? getKey(column.get(0)) : "*");
494496
case POST:
495497
if (column == null || column.isEmpty()) {
496498
throw new IllegalArgumentException("POST 请求必须在Table内设置要保存的 key:value !");
497499
}
498500

499-
if (isPrepared()) { //不能通过 ? 来代替,SELECT 'id','name' 返回的就是 id:"id", name:"name",而不是数据库里的值!
500-
for (String c : column) {
501-
if (StringUtil.isName(c) == false) {
502-
throw new IllegalArgumentException("POST请求: 每一个 key:value 中的key都必须是1个单词!");
503-
}
501+
String s = "";
502+
boolean pfirst = true;
503+
for (String c : column) {
504+
if (isPrepared() && StringUtil.isName(c) == false) { //不能通过 ? 来代替,SELECT 'id','name' 返回的就是 id:"id", name:"name",而不是数据库里的值!
505+
throw new IllegalArgumentException("POST请求: 每一个 key:value 中的key都必须是1个单词!");
504506
}
507+
s += ((pfirst ? "" : ",") + getKey(c));
508+
509+
pfirst = false;
505510
}
506511

507-
return "(" + StringUtil.getString(column.toArray()) + ")";
512+
return "(" + s + ")";
508513
case GET:
509514
case GETS:
510515
boolean isQuery = RequestMethod.isQueryMethod(method);
@@ -1015,7 +1020,7 @@ else if ("!".equals(ce.getKey())) {
10151020

10161021
SQLConfig jc;
10171022
String js;
1018-
1023+
10191024
boolean changed = false;
10201025
//各种 JOIN 没办法统一用 & | !连接,只能按优先级,和 @combine 一样?
10211026
for (Join j : joinList) {
@@ -1204,7 +1209,7 @@ public String getCompareString(String key, Object value, String type) throws Exc
12041209
if (StringUtil.isName(key) == false) {
12051210
throw new IllegalArgumentException(key + type + ":value 中key不合法!比较运算 [>, <, >=, <=] 不支持 [&, !, |] 中任何逻辑运算符 !");
12061211
}
1207-
1212+
12081213
return getKey(key) + " " + type + " " + (value instanceof Subquery ? getSubqueryString((Subquery) value) : getValue(value));
12091214
}
12101215

@@ -1349,6 +1354,9 @@ public String getRegExpString(String key, Object[] values, int type, boolean ign
13491354
*/
13501355
@JSONField(serialize = false)
13511356
public String getRegExpString(String key, String value, boolean ignoreCase) {
1357+
if (DATABASE_POSTGRESQL.equals(getDatabase())) {
1358+
return getKey(key) + " ~" + (ignoreCase ? "* " : " ") + getValue(value);
1359+
}
13521360
return getKey(key) + " REGEXP " + (ignoreCase ? "" : "BINARY ") + getValue(value);
13531361
}
13541362
//~ regexp >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@@ -1583,14 +1591,20 @@ public String getContainString(String key, Object[] childs, int type) throws Ill
15831591
if (childs[i] instanceof String) {
15841592
childs[i] = "\"" + childs[i] + "\"";
15851593
}
1586-
condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR))
1587-
+ "json_contains(" + getKey(key) + ", " + getValue(childs[i]) + ")";
1594+
1595+
if (DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase())) {
1596+
condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR))
1597+
+ getKey(key) + " @> " + getValue(childs[i]);
1598+
} else {
1599+
condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR))
1600+
+ "json_contains(" + getKey(key) + ", " + getValue(childs[i]) + ")";
1601+
}
15881602
}
15891603
}
15901604
if (condition.isEmpty()) {
1591-
condition = (SQL.isNull(key, true) + OR + getLikeString(key, "[]")); // key = '[]' 无结果!
1605+
condition = (getKey(key) + SQL.isNull(true) + OR + getLikeString(key, "[]")); // key = '[]' 无结果!
15921606
} else {
1593-
condition = (SQL.isNull(key, false) + AND + "(" + condition + ")");
1607+
condition = (getKey(key) + SQL.isNull(false) + AND + "(" + condition + ")");
15941608
}
15951609
}
15961610
if (condition.isEmpty()) {
@@ -1692,7 +1706,7 @@ public String getSetString(RequestMethod method, Map<String, Object> content, bo
16921706
value = content.get(key);
16931707
key = getRealKey(method, key, false, true, verifyName, quote);
16941708

1695-
setString += (isFirst ? "" : ", ") + (key + "=" + (keyType == 1 ? getAddString(key, value) : (keyType == 2
1709+
setString += (isFirst ? "" : ", ") + (getKey(key) + "=" + (keyType == 1 ? getAddString(key, value) : (keyType == 2
16961710
? getRemoveString(key, value) : getValue(value)) ) );
16971711

16981712
isFirst = false;
@@ -1714,10 +1728,10 @@ public String getSetString(RequestMethod method, Map<String, Object> content, bo
17141728
@JSONField(serialize = false)
17151729
public String getAddString(String key, Object value) throws IllegalArgumentException {
17161730
if (value instanceof Number) {
1717-
return key + " + " + value;
1731+
return getKey(key) + " + " + value;
17181732
}
17191733
if (value instanceof String) {
1720-
return " CONCAT (" + key + ", " + getValue(value) + ") ";
1734+
return " CONCAT (" + getKey(key) + ", " + getValue(value) + ") ";
17211735
}
17221736
throw new IllegalArgumentException(key + "+ 对应的值 " + value + " 不是Number,String,Array中的任何一种!");
17231737
}
@@ -1730,10 +1744,10 @@ public String getAddString(String key, Object value) throws IllegalArgumentExcep
17301744
@JSONField(serialize = false)
17311745
public String getRemoveString(String key, Object value) throws IllegalArgumentException {
17321746
if (value instanceof Number) {
1733-
return key + " - " + value;
1747+
return getKey(key) + " - " + value;
17341748
}
17351749
if (value instanceof String) {
1736-
return SQL.replace(key, (String) getValue(value), "");// " replace(" + key + ", '" + value + "', '') ";
1750+
return SQL.replace(getKey(key), (String) getValue(value), "");// " replace(" + key + ", '" + value + "', '') ";
17371751
}
17381752
throw new IllegalArgumentException(key + "- 对应的值 " + value + " 不是Number,String,Array中的任何一种!");
17391753
}
@@ -1868,10 +1882,12 @@ public String getJoinString() throws Exception {
18681882

18691883
jt = jc.getTable();
18701884
tn = j.getTargetName();
1871-
if (DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase())) {
1872-
jt = jt.toLowerCase();
1873-
tn = tn.toLowerCase();
1874-
}
1885+
1886+
//如果要强制小写,则可在子类重写这个方法再 toLowerCase
1887+
// if (DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase())) {
1888+
// jt = jt.toLowerCase();
1889+
// tn = tn.toLowerCase();
1890+
// }
18751891

18761892
switch (j.getJoinType()) { //TODO $ SELF JOIN
18771893
// case "@": // APP JOIN

0 commit comments

Comments
 (0)