From b248b42b009e7a11fbbef74ddbd0a56794676c47 Mon Sep 17 00:00:00 2001
From: TommyLemon <1184482681@qq.com>
Date: Sun, 9 Oct 2022 18:57:04 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81=E8=BE=BE?=
=?UTF-8?q?=E6=A2=A6=E6=95=B0=E6=8D=AE=E5=BA=93=EF=BC=9B=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF=E5=8F=8A=E6=97=A5=E5=BF=97?=
=?UTF-8?q?=E6=89=93=E5=8D=B0=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=BC=82=E5=B8=B8?=
=?UTF-8?q?=E6=A0=88=E4=B8=8D=E5=A4=9F=E7=B2=BE=E5=87=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
APIJSONORM/pom.xml | 2 +-
APIJSONORM/src/main/java/apijson/Log.java | 26 +-
.../apijson/orm/AbstractObjectParser.java | 48 +---
.../main/java/apijson/orm/AbstractParser.java | 173 ++++----------
.../java/apijson/orm/AbstractSQLConfig.java | 23 +-
.../src/main/java/apijson/orm/SQLConfig.java | 2 +
.../orm/exception/CommonException.java | 224 ++++++++++++++++++
.../java/apijson/orm/model/DbaColumn.java | 18 ++
.../main/java/apijson/orm/model/DbaTable.java | 18 ++
9 files changed, 357 insertions(+), 177 deletions(-)
create mode 100755 APIJSONORM/src/main/java/apijson/orm/exception/CommonException.java
create mode 100644 APIJSONORM/src/main/java/apijson/orm/model/DbaColumn.java
create mode 100644 APIJSONORM/src/main/java/apijson/orm/model/DbaTable.java
diff --git a/APIJSONORM/pom.xml b/APIJSONORM/pom.xml
index bafc9c85..d1caf6c4 100644
--- a/APIJSONORM/pom.xml
+++ b/APIJSONORM/pom.xml
@@ -5,7 +5,7 @@
com.github.Tencent
APIJSON
- 5.2.0
+ 5.3.0
jar
APIJSONORM
diff --git a/APIJSONORM/src/main/java/apijson/Log.java b/APIJSONORM/src/main/java/apijson/Log.java
index 01f3e25e..f58e5f46 100755
--- a/APIJSONORM/src/main/java/apijson/Log.java
+++ b/APIJSONORM/src/main/java/apijson/Log.java
@@ -14,18 +14,30 @@ public class Log {
public static boolean DEBUG = true;
- public static final String VERSION = "5.2.0";
- public static final String KEY_SYSTEM_INFO_DIVIDER = "---|-----APIJSON SYSTEM INFO-----|---";
+ public static final String VERSION = "5.3.0";
+ public static final String KEY_SYSTEM_INFO_DIVIDER = "\n---|-----APIJSON SYSTEM INFO-----|---\n";
- //默认的时间格式
- public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
+ public static final String OS_NAME;
+ public static final String OS_VERSION;
+ public static final String OS_ARCH;
+ public static final String JAVA_VERSION;
+ static {
+ OS_NAME = System.getProperty("os.name");
+ OS_VERSION = System.getProperty("os.version");
+ OS_ARCH = System.getProperty("os.arch");
+ JAVA_VERSION = System.getProperty("java.version");
+ }
+
+
+ //默认的时间格式
+ public static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
/**
* modify date format
* @param dateFormatString
*/
public static void setDateFormat(String dateFormatString) {
- dateFormat = new SimpleDateFormat(dateFormatString);
+ DATE_FORMAT = new SimpleDateFormat(dateFormatString);
}
/**
@@ -36,10 +48,10 @@ public class Log {
*/
public static void logInfo(String TAG, String msg, String level){
if(level.equals("DEBUG") || level .equals("ERROR") ||level.equals("WARN")){
- System.err.println(dateFormat.format(System.currentTimeMillis()) + ": " + TAG + "." + level + ": " + msg);
+ System.err.println(DATE_FORMAT.format(System.currentTimeMillis()) + ": " + TAG + "." + level + ": " + msg);
}
else if(level.equals("VERBOSE") || level .equals("INFO") ){
- System.out.println(dateFormat.format(System.currentTimeMillis()) + ": " + TAG + "." + level + ": " + msg);
+ System.out.println(DATE_FORMAT.format(System.currentTimeMillis()) + ": " + TAG + "." + level + ": " + msg);
}
}
diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java b/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java
index 0fc5379c..ecfa5b97 100755
--- a/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java
+++ b/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java
@@ -12,6 +12,7 @@ import apijson.RequestMethod;
import apijson.StringUtil;
import apijson.orm.AbstractFunctionParser.FunctionBean;
import apijson.orm.exception.ConflictException;
+import apijson.orm.exception.CommonException;
import apijson.orm.exception.NotExistException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
@@ -19,6 +20,7 @@ import com.alibaba.fastjson.JSONObject;
import javax.activation.UnsupportedDataTypeException;
import java.rmi.ServerException;
+import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
@@ -282,46 +284,7 @@ public abstract class AbstractObjectParser implements ObjectParser {
}
} catch (Exception e) {
if (tri == false) {
- if (Log.DEBUG && sqlConfig != null && e.getMessage().contains(Log.KEY_SYSTEM_INFO_DIVIDER) == false) {
- try {
- String db = sqlConfig.getDatabase();
- if (db == null) {
- if (sqlConfig.isMySQL()) {
- db = SQLConfig.DATABASE_MYSQL;
- }
- else if (sqlConfig.isPostgreSQL()) {
- db = SQLConfig.DATABASE_POSTGRESQL;
- }
- else if (sqlConfig.isSQLServer()) {
- db = SQLConfig.DATABASE_SQLSERVER;
- }
- else if (sqlConfig.isOracle()) {
- db = SQLConfig.DATABASE_ORACLE;
- }
- else if (sqlConfig.isDb2()) {
- db = SQLConfig.DATABASE_DB2;
- }
- else if (sqlConfig.isClickHouse()) {
- db = SQLConfig.DATABASE_CLICKHOUSE;
- }
- else {
- db = AbstractSQLConfig.DEFAULT_DATABASE;
- }
- }
-
- Class extends Exception> clazz = e.getClass();
- e = clazz.getConstructor(String.class).newInstance(
- e.getMessage()
- + " " + Log.KEY_SYSTEM_INFO_DIVIDER + " \n **环境信息** "
- + " \n 系统: " + System.getProperty("os.name") + " " + System.getProperty("os.version")
- + " \n 数据库: " + db + " " + sqlConfig.getDBVersion()
- + " \n JDK: " + System.getProperty("java.version") + " " + System.getProperty("os.arch")
- + " \n APIJSON: " + Log.VERSION
- );
- } catch (Throwable e2) {}
- }
-
- throw e; // 不忽略错误,抛异常
+ throw CommonException.wrap(e, sqlConfig); // 不忽略错误,抛异常
}
invalidate(); // 忽略错误,还原request
}
@@ -515,9 +478,9 @@ public abstract class AbstractObjectParser implements ObjectParser {
/**
+ * @param index
* @param key
* @param value
- * @param isFirst
* @return
* @throws Exception
*/
@@ -746,9 +709,6 @@ public abstract class AbstractObjectParser implements ObjectParser {
protected SQLConfig sqlConfig = null;//array item复用
/**SQL查询,for array item
- * @param count
- * @param page
- * @param position
* @return this
* @throws Exception
*/
diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java b/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java
index 3f598df1..722125ad 100755
--- a/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java
+++ b/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java
@@ -6,7 +6,6 @@ This source code is licensed under the Apache License Version 2.0.*/
package apijson.orm;
import static apijson.JSONObject.KEY_EXPLAIN;
-import static apijson.JSONObject.KEY_JSON;
import static apijson.RequestMethod.GET;
import java.io.UnsupportedEncodingException;
@@ -44,6 +43,7 @@ import apijson.RequestMethod;
import apijson.StringUtil;
import apijson.orm.exception.ConditionErrorException;
import apijson.orm.exception.ConflictException;
+import apijson.orm.exception.CommonException;
import apijson.orm.exception.NotExistException;
import apijson.orm.exception.NotLoggedInException;
import apijson.orm.exception.OutOfRangeException;
@@ -493,14 +493,18 @@ public abstract class AbstractParser implements Parser, Par
res.put("time:start|duration|end|parse|sql", startTime + "|" + duration + "|" + endTime + "|" + parseDuration + "|" + executedSQLDuration);
if (error != null) {
- res.put("trace:throw", error.getClass().getName());
- res.put("trace:stack", error.getStackTrace());
+ // String msg = error.getMessage();
+ // if (msg != null && msg.contains(Log.KEY_SYSTEM_INFO_DIVIDER)) {
+ // }
+ Throwable t = error instanceof CommonException && error.getCause() != null ? error.getCause() : error;
+ res.put("trace:throw", t.getClass().getName());
+ res.put("trace:stack", t.getStackTrace());
}
}
onClose();
- //CS304 Issue link: https://github.com/Tencent/APIJSON/issues/232
+ // CS304 Issue link: https://github.com/Tencent/APIJSON/issues/232
if (IS_PRINT_REQUEST_STRING_LOG || Log.DEBUG || error != null) {
Log.sl("\n\n\n", '<', "");
Log.fd(TAG, requestMethod + "/parseResponse request = \n" + requestString + "\n\n");
@@ -691,18 +695,18 @@ public abstract class AbstractParser implements Parser, Par
public static JSONObject extendResult(JSONObject object, int code, String msg, boolean isRoot) {
int index = Log.DEBUG == false || isRoot == false || msg == null ? -1 : msg.lastIndexOf(Log.KEY_SYSTEM_INFO_DIVIDER);
String debug = Log.DEBUG == false || isRoot == false ? null : (index >= 0 ? msg.substring(index + Log.KEY_SYSTEM_INFO_DIVIDER.length()).trim()
- : " \n 提 bug 请发请求和响应的【完整截屏】,没图的自行解决!"
- + " \n 开发者有限的时间和精力主要放在【维护项目源码和文档】上!"
- + " \n 【描述不详细】 或 【文档/常见问题 已有答案】 的问题可能会被忽略!!"
- + " \n 【态度 不文明/不友善】的可能会被踢出群,问题也可能不予解答!!!"
+ : " \n提 bug 请发请求和响应的【完整截屏】,没图的自行解决!"
+ + " \n开发者有限的时间和精力主要放在【维护项目源码和文档】上!"
+ + " \n【描述不详细】 或 【文档/常见问题 已有答案】 的问题可能会被忽略!!"
+ + " \n【态度 不文明/不友善】的可能会被踢出群,问题也可能不予解答!!!"
+ " \n\n **环境信息** "
- + " \n 系统: " + System.getProperty("os.name") + " " + System.getProperty("os.version")
- + " \n 数据库: DEFAULT_DATABASE = " + AbstractSQLConfig.DEFAULT_DATABASE
- + " \n JDK: " + System.getProperty("java.version") + " " + System.getProperty("os.arch")
- + " \n APIJSON: " + Log.VERSION
- + " \n | \n 常见问题:https://github.com/Tencent/APIJSON/issues/36"
- + " \n 通用文档:https://github.com/Tencent/APIJSON/blob/master/Document.md"
- + " \n 视频教程:https://search.bilibili.com/all?keyword=APIJSON");
+ + " \n系统: " + Log.OS_NAME + " " + Log.OS_VERSION
+ + " \n数据库: DEFAULT_DATABASE = " + AbstractSQLConfig.DEFAULT_DATABASE
+ + " \nJDK: " + Log.JAVA_VERSION + " " + Log.OS_ARCH
+ + " \nAPIJSON: " + Log.VERSION
+ + " \n \n【常见问题】:https://github.com/Tencent/APIJSON/issues/36"
+ + " \n【通用文档】:https://github.com/Tencent/APIJSON/blob/master/Document.md"
+ + " \n【视频教程】:https://search.bilibili.com/all?keyword=APIJSON");
msg = index >= 0 ? msg.substring(0, index) : msg;
@@ -710,10 +714,10 @@ public abstract class AbstractParser implements Parser, Par
object = new JSONObject(true);
}
- if (object.containsKey(JSONResponse.KEY_OK) == false) {
+ if (object.get(JSONResponse.KEY_OK) == null) {
object.put(JSONResponse.KEY_OK, JSONResponse.isSuccess(code));
}
- if (object.containsKey(JSONResponse.KEY_CODE) == false) {
+ if (object.get(JSONResponse.KEY_CODE) == null) {
object.put(JSONResponse.KEY_CODE, code);
}
@@ -763,7 +767,6 @@ public abstract class AbstractParser implements Parser, Par
/**添加请求成功的状态内容
* @param object
* @param e
- * @param isRoot
* @return
*/
public static JSONObject extendErrorResult(JSONObject object, Exception e) {
@@ -783,20 +786,25 @@ public abstract class AbstractParser implements Parser, Par
* @return
*/
public static JSONObject extendErrorResult(JSONObject object, Exception e, RequestMethod requestMethod, String url, boolean isRoot) {
- String msg = e.getMessage();
+ String msg = CommonException.getMsg(e);
if (Log.DEBUG && isRoot) {
try {
- int index = msg.lastIndexOf(Log.KEY_SYSTEM_INFO_DIVIDER);
- String info = index >= 0 ? msg.substring(index + Log.KEY_SYSTEM_INFO_DIVIDER.length()).trim()
- : " \n **环境信息** "
- + " \n 系统: " + System.getProperty("os.name") + " " + System.getProperty("os.version")
- + " \n 数据库: "
- + " \n JDK: " + System.getProperty("java.version") + " " + System.getProperty("os.arch")
- + " \n APIJSON: " + Log.VERSION;
+ boolean isCommon = e instanceof CommonException;
+ String env = isCommon ? ((CommonException) e).getEnvironment() : null;
+ if (StringUtil.isEmpty(env)) {
+ //int index = msg.lastIndexOf(Log.KEY_SYSTEM_INFO_DIVIDER);
+ //env = index >= 0 ? msg.substring(index + Log.KEY_SYSTEM_INFO_DIVIDER.length()).trim()
+ env = " \n **环境信息** "
+ + " \n 系统: " + Log.OS_NAME + " " + Log.OS_VERSION
+ + " \n 数据库: "
+ + " \n JDK: " + Log.JAVA_VERSION + " " + Log.OS_ARCH
+ + " \n APIJSON: " + Log.VERSION;
- msg = index < 0 ? msg : msg.substring(0, index).trim();
- String encodedMsg = URLEncoder.encode(msg, "UTF-8");
+ //msg = index < 0 ? msg : msg.substring(0, index).trim();
+ }
+
+ String encodedMsg = URLEncoder.encode(msg, "UTF-8");
if (StringUtil.isEmpty(url, true)) {
String host = "localhost";
@@ -824,12 +832,12 @@ public abstract class AbstractParser implements Parser, Par
req = URLEncoder.encode(req, "UTF-8");
} catch (Throwable e2) {}
-
- boolean isSQLException = e instanceof SQLException; // SQL 报错一般都是通用问题,优先搜索引擎
- String apiatuoAndGitHubLink = "\n【APIAuto】: \n http://apijson.cn/api?type=JSON&url=" + URLEncoder.encode(url, "UTF-8") + "&json=" + req
+ Throwable t = isCommon ? e.getCause() : e;
+ boolean isSQLException = t instanceof SQLException; // SQL 报错一般都是通用问题,优先搜索引擎
+ String apiatuoAndGitHubLink = "\n\n【APIAuto】: \n http://apijson.cn/api?type=JSON&url=" + URLEncoder.encode(url, "UTF-8") + "&json=" + req
+ " \n\n【GitHub】: \n https://www.google.com/search?q=site%3Agithub.com%2FTencent%2FAPIJSON+++" + encodedMsg;
- msg += Log.KEY_SYSTEM_INFO_DIVIDER + " \n | \n 浏览器打开以下链接查看解答"
+ msg += Log.KEY_SYSTEM_INFO_DIVIDER + " 浏览器打开以下链接查看解答"
+ (isSQLException ? "" : apiatuoAndGitHubLink)
// GitHub Issue 搜索貌似是精准包含,不易找到答案 + " \n\nGitHub: \n https://github.com/Tencent/APIJSON/issues?q=is%3Aissue+" + encodedMsg
+ " \n\n【Google】:\n https://www.google.com/search?q=" + encodedMsg
@@ -838,10 +846,10 @@ public abstract class AbstractParser implements Parser, Par
+ " \n\n都没找到答案?打开这个链接 \n https://github.com/Tencent/APIJSON/issues/new?assignees=&labels=&template=--bug.md "
+ " \n然后提交问题,推荐用以下模板修改,注意要换行保持清晰可读。"
+ " \n【标题】:" + msg
- + " \n【内容】:" + info + "\n\n**问题描述**\n" + msg
+ + " \n【内容】:" + env + "\n\n**问题描述**\n" + msg
+ " \n\n"
+ " \n\nPOST " + url
- + " \n请求 Request JSON:\n ```js"
+ + " \n发送请求 Request JSON:\n ```js"
+ " \n 请填写,例如 { \"Users\":{} }"
+ " \n```"
+ " \n\n返回结果 Response JSON:\n ```js"
@@ -850,8 +858,8 @@ public abstract class AbstractParser implements Parser, Par
} catch (Throwable e2) {}
}
- JSONObject error = newErrorResult(e, isRoot);
- return extendResult(object, error.getIntValue(JSONResponse.KEY_CODE), msg, isRoot);
+ int code = CommonException.getCode(e);
+ return extendResult(object, code, msg, isRoot);
}
/**新建错误状态内容
@@ -868,50 +876,14 @@ public abstract class AbstractParser implements Parser, Par
*/
public static JSONObject newErrorResult(Exception e, boolean isRoot) {
if (e != null) {
- e.printStackTrace();
+ // if (Log.DEBUG) {
+ e.printStackTrace();
+ // }
- int code;
- if (e instanceof UnsupportedEncodingException) {
- code = JSONResponse.CODE_UNSUPPORTED_ENCODING;
- }
- else if (e instanceof IllegalAccessException) {
- code = JSONResponse.CODE_ILLEGAL_ACCESS;
- }
- else if (e instanceof UnsupportedOperationException) {
- code = JSONResponse.CODE_UNSUPPORTED_OPERATION;
- }
- else if (e instanceof NotExistException) {
- code = JSONResponse.CODE_NOT_FOUND;
- }
- else if (e instanceof IllegalArgumentException) {
- code = JSONResponse.CODE_ILLEGAL_ARGUMENT;
- }
- else if (e instanceof NotLoggedInException) {
- code = JSONResponse.CODE_NOT_LOGGED_IN;
- }
- else if (e instanceof TimeoutException) {
- code = JSONResponse.CODE_TIME_OUT;
- }
- else if (e instanceof ConflictException) {
- code = JSONResponse.CODE_CONFLICT;
- }
- else if (e instanceof ConditionErrorException) {
- code = JSONResponse.CODE_CONDITION_ERROR;
- }
- else if (e instanceof UnsupportedDataTypeException) {
- code = JSONResponse.CODE_UNSUPPORTED_TYPE;
- }
- else if (e instanceof OutOfRangeException) {
- code = JSONResponse.CODE_OUT_OF_RANGE;
- }
- else if (e instanceof NullPointerException) {
- code = JSONResponse.CODE_NULL_POINTER;
- }
- else {
- code = JSONResponse.CODE_SERVER_ERROR;
- }
+ String msg = CommonException.getMsg(e);
+ Integer code = CommonException.getCode(e);
- return newResult(code, e.getMessage(), isRoot);
+ return newResult(code, msg, isRoot);
}
return newResult(JSONResponse.CODE_SERVER_ERROR, JSONResponse.MSG_SERVER_ERROR, isRoot);
@@ -1987,50 +1959,7 @@ public abstract class AbstractParser implements Parser, Par
return result;
}
catch (Exception e) {
- String msg = e.getMessage();
- if (Log.DEBUG && msg != null && msg.contains(Log.KEY_SYSTEM_INFO_DIVIDER) == false) {
- try {
- String db = config.getDatabase();
- if (db == null) {
- if (config.isMySQL()) {
- db = SQLConfig.DATABASE_MYSQL;
- }
- else if (config.isPostgreSQL()) {
- db = SQLConfig.DATABASE_POSTGRESQL;
- }
- else if (config.isSQLServer()) {
- db = SQLConfig.DATABASE_SQLSERVER;
- }
- else if (config.isOracle()) {
- db = SQLConfig.DATABASE_ORACLE;
- }
- else if (config.isDb2()) {
- db = SQLConfig.DATABASE_DB2;
- }
- else if (config.isClickHouse()) {
- db = SQLConfig.DATABASE_CLICKHOUSE;
- }
- else {
- db = AbstractSQLConfig.DEFAULT_DATABASE;
- }
- }
-
- Class extends Exception> clazz = e.getClass();
- e = clazz.getConstructor(String.class).newInstance(
- msg
- + " " + Log.KEY_SYSTEM_INFO_DIVIDER + " \n **环境信息** "
- + " \n 系统: " + System.getProperty("os.name") + " " + System.getProperty("os.version")
- + " \n 数据库: " + db + " " + config.getDBVersion()
- + " \n JDK: " + System.getProperty("java.version") + " " + System.getProperty("os.arch")
- + " \n APIJSON: " + Log.VERSION
- );
- } catch (Throwable e2) {}
- }
-
- if (Log.DEBUG == false && e instanceof SQLException) {
- throw new SQLException("数据库驱动执行异常SQLException,非 Log.DEBUG 模式下不显示详情,避免泄漏真实模式名、表名等隐私信息", e);
- }
- throw e;
+ throw CommonException.wrap(e, config);
}
finally {
if (config.getPosition() == 0 && config.limitSQLCount()) {
diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java
index 646b7d0d..83588e7f 100755
--- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java
+++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java
@@ -63,6 +63,8 @@ import apijson.orm.Join.On;
import apijson.orm.exception.NotExistException;
import apijson.orm.model.Access;
import apijson.orm.model.Column;
+import apijson.orm.model.DbaColumn;
+import apijson.orm.model.DbaTable;
import apijson.orm.model.Document;
import apijson.orm.model.ExtendedProperty;
import apijson.orm.model.Function;
@@ -131,6 +133,8 @@ public abstract class AbstractSQLConfig implements SQLConfig {
TABLE_KEY_MAP.put(SysTable.class.getSimpleName(), SysTable.TABLE_NAME);
TABLE_KEY_MAP.put(SysColumn.class.getSimpleName(), SysColumn.TABLE_NAME);
TABLE_KEY_MAP.put(ExtendedProperty.class.getSimpleName(), ExtendedProperty.TABLE_NAME);
+ TABLE_KEY_MAP.put(DbaTable.class.getSimpleName(), DbaTable.TABLE_NAME);
+ TABLE_KEY_MAP.put(DbaColumn.class.getSimpleName(), DbaColumn.TABLE_NAME);
CONFIG_TABLE_LIST = new ArrayList<>(); // Table, Column 等是系统表 AbstractVerifier.SYSTEM_ACCESS_MAP.keySet());
CONFIG_TABLE_LIST.add(Function.class.getSimpleName());
@@ -146,6 +150,7 @@ public abstract class AbstractSQLConfig implements SQLConfig {
DATABASE_LIST.add(DATABASE_SQLSERVER);
DATABASE_LIST.add(DATABASE_ORACLE);
DATABASE_LIST.add(DATABASE_DB2);
+ DATABASE_LIST.add(DATABASE_DAMENG);
DATABASE_LIST.add(DATABASE_CLICKHOUSE);
DATABASE_LIST.add(DATABASE_HIVE);
DATABASE_LIST.add(DATABASE_TDENGINE);
@@ -982,6 +987,14 @@ public abstract class AbstractSQLConfig implements SQLConfig {
public static boolean isDb2(String db) {
return DATABASE_DB2.equals(db);
}
+
+ @Override
+ public boolean isDameng() {
+ return isDameng(getSQLDatabase());
+ }
+ public static boolean isDameng(String db) {
+ return DATABASE_DAMENG.equals(db);
+ }
@Override
public boolean isClickHouse() {
return isClickHouse(getSQLDatabase());
@@ -1029,6 +1042,9 @@ public abstract class AbstractSQLConfig implements SQLConfig {
if (SysTable.TAG.equals(table) || SysColumn.TAG.equals(table) || ExtendedProperty.TAG.equals(table)) {
return SCHEMA_SYS; //SQL Server 在 sys 中的属性比 information_schema 中的要全,能拿到注释
}
+ if (DbaTable.TAG.equals(table) || DbaColumn.TAG.equals(table)) {
+ return ""; //Oracle, Dameng 的 dba_tables 和 all_tab_columns 表好像不属于任何 Schema
+ }
String sch = getSchema();
return sch == null ? DEFAULT_SCHEMA : sch;
@@ -1071,9 +1087,10 @@ public abstract class AbstractSQLConfig implements SQLConfig {
@JSONField(serialize = false)
@Override
public String getSQLTable() {
- // String t = TABLE_KEY_MAP.containsKey(table) ? TABLE_KEY_MAP.get(table) : table;
- //如果要强制小写,则可在子类重写这个方法再 toLowerCase return DATABASE_POSTGRESQL.equals(getDatabase()) ? t.toLowerCase() : t;
- return TABLE_KEY_MAP.containsKey(table) ? TABLE_KEY_MAP.get(table) : table;
+ // 如果要强制小写,则可在子类重写这个方法再 toLowerCase return DATABASE_POSTGRESQL.equals(getDatabase()) ? t.toLowerCase() : t;
+ String ot = getTable();
+ String nt = TABLE_KEY_MAP.get(ot);
+ return StringUtil.isEmpty(nt) ? ot : nt;
}
@JSONField(serialize = false)
@Override
diff --git a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java
index 1dbcdf3a..5182cf5f 100755
--- a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java
+++ b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java
@@ -22,6 +22,7 @@ public interface SQLConfig {
String DATABASE_SQLSERVER = "SQLSERVER";
String DATABASE_ORACLE = "ORACLE";
String DATABASE_DB2 = "DB2";
+ String DATABASE_DAMENG = "DAMENG";
String DATABASE_CLICKHOUSE = "CLICKHOUSE";
String DATABASE_HIVE = "HIVE";
String DATABASE_TDENGINE = "TDENGINE";
@@ -40,6 +41,7 @@ public interface SQLConfig {
boolean isSQLServer();
boolean isOracle();
boolean isDb2();
+ boolean isDameng();
boolean isClickHouse();
boolean isHive();
boolean isTDengine();
diff --git a/APIJSONORM/src/main/java/apijson/orm/exception/CommonException.java b/APIJSONORM/src/main/java/apijson/orm/exception/CommonException.java
new file mode 100755
index 00000000..c9b7b999
--- /dev/null
+++ b/APIJSONORM/src/main/java/apijson/orm/exception/CommonException.java
@@ -0,0 +1,224 @@
+/*Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
+
+This source code is licensed under the Apache License Version 2.0.*/
+
+
+package apijson.orm.exception;
+
+import java.io.UnsupportedEncodingException;
+import java.sql.SQLException;
+import java.util.concurrent.TimeoutException;
+
+import javax.activation.UnsupportedDataTypeException;
+
+import apijson.JSONResponse;
+import apijson.Log;
+import apijson.StringUtil;
+import apijson.orm.AbstractSQLConfig;
+import apijson.orm.SQLConfig;
+
+/**异常包装器,主要用来包装构造器没有 Throwable 参数的 Exception
+ * @author Lemon
+ */
+public class CommonException extends Exception {
+ private static final long serialVersionUID = 1L;
+ private Integer code;
+ private String environment;
+
+ public CommonException setCode(Integer code) {
+ this.code = code;
+ return this;
+ }
+ public Integer getCode() {
+ if (code == null) {
+ code = getCode(getCause());
+ }
+ return code;
+ }
+
+
+ public static int getCode(Throwable e) {
+ boolean isCommon = Log.DEBUG && e instanceof CommonException;
+
+ Integer code = isCommon ? ((CommonException) e).getCode() : null;
+ if (code != null) {
+ return code;
+ }
+
+ Throwable t = isCommon ? e.getCause() : e;
+ if (t == null) {
+ return JSONResponse.CODE_SERVER_ERROR;
+ }
+
+ if (t instanceof UnsupportedEncodingException) {
+ return JSONResponse.CODE_UNSUPPORTED_ENCODING;
+ }
+
+ if (t instanceof IllegalAccessException) {
+ return JSONResponse.CODE_ILLEGAL_ACCESS;
+ }
+
+ if (t instanceof UnsupportedOperationException) {
+ return JSONResponse.CODE_UNSUPPORTED_OPERATION;
+ }
+
+ if (t instanceof NotExistException) {
+ return JSONResponse.CODE_NOT_FOUND;
+ }
+
+ if (t instanceof IllegalArgumentException) {
+ return JSONResponse.CODE_ILLEGAL_ARGUMENT;
+ }
+
+ if (t instanceof NotLoggedInException) {
+ return JSONResponse.CODE_NOT_LOGGED_IN;
+ }
+
+ if (t instanceof TimeoutException) {
+ return JSONResponse.CODE_TIME_OUT;
+ }
+
+ if (t instanceof ConflictException) {
+ return JSONResponse.CODE_CONFLICT;
+ }
+
+ if (t instanceof ConditionErrorException) {
+ return JSONResponse.CODE_CONDITION_ERROR;
+ }
+
+ if (t instanceof UnsupportedDataTypeException) {
+ return JSONResponse.CODE_UNSUPPORTED_TYPE;
+ }
+
+ if (t instanceof OutOfRangeException) {
+ return JSONResponse.CODE_OUT_OF_RANGE;
+ }
+
+ if (t instanceof NullPointerException) {
+ return JSONResponse.CODE_NULL_POINTER;
+ }
+
+ return JSONResponse.CODE_SERVER_ERROR;
+ }
+
+ public static String getMsg(Throwable e) {
+ if (e == null) {
+ return null;
+ }
+
+ String msg = e.getMessage();
+ if (msg != null) {
+ return msg;
+ }
+
+ Throwable t = e.getCause();
+ return t == null ? null : t.getMessage();
+ }
+
+ public CommonException setEnvironment(String environment) {
+ this.environment = environment;
+ return this;
+ }
+
+ public String getEnvironment() {
+ return environment;
+ }
+
+ public CommonException(Throwable t) {
+ this(null, t);
+ }
+ public CommonException(String msg, Throwable t) {
+ super(msg == null && t != null ? t.getMessage() : null, t);
+ }
+
+ public CommonException(int code, String msg) {
+ this(code, msg, null);
+ }
+ public CommonException(int code, String msg, Throwable t) {
+ this(msg, t);
+ setCode(code);
+ }
+ public CommonException(Throwable t, String environment) {
+ this(null, t);
+ setEnvironment(environment);
+ }
+
+
+ public static Exception wrap(Exception e, SQLConfig config) {
+ if (Log.DEBUG == false && e instanceof SQLException) {
+ return new SQLException("数据库驱动执行异常SQLException,非 Log.DEBUG 模式下不显示详情,避免泄漏真实模式名、表名等隐私信息", e);
+ }
+
+ // String msg = e.getMessage();
+
+ if (Log.DEBUG && (e instanceof CommonException == false || ((CommonException) e).getEnvironment() == null)) {
+ // msg != null && msg.contains(Log.KEY_SYSTEM_INFO_DIVIDER) == false) {
+ try {
+ String db = config == null ? AbstractSQLConfig.DEFAULT_DATABASE : (config instanceof AbstractSQLConfig
+ ? ((AbstractSQLConfig) config).getSQLDatabase() : config.getDatabase()
+ );
+
+ String dbVersion = config.getDBVersion();
+ if (StringUtil.isEmpty(dbVersion)) {
+ dbVersion = "";
+ }
+
+ if (db != null) {
+ db += " " + dbVersion;
+ }
+ else if (config.isMySQL()) {
+ db = SQLConfig.DATABASE_MYSQL + " " + dbVersion;
+ }
+ else if (config.isPostgreSQL()) {
+ db = SQLConfig.DATABASE_POSTGRESQL + " " + dbVersion;
+ }
+ else if (config.isSQLServer()) {
+ db = SQLConfig.DATABASE_SQLSERVER + " " + dbVersion;
+ }
+ else if (config.isOracle()) {
+ db = SQLConfig.DATABASE_ORACLE + " " + dbVersion;
+ }
+ else if (config.isDb2()) {
+ db = SQLConfig.DATABASE_DB2 + " " + dbVersion;
+ }
+ else if (config.isDameng()) {
+ db = SQLConfig.DATABASE_DAMENG + " " + dbVersion;
+ }
+ else if (config.isClickHouse()) {
+ db = SQLConfig.DATABASE_CLICKHOUSE + " " + dbVersion;
+ }
+ else if (config.isTDengine()) {
+ db = SQLConfig.DATABASE_TDENGINE + " " + dbVersion;
+ }
+ else {
+ db = "";
+ }
+
+// Class extends Exception> clazz = e.getClass();
+// msg = msg
+// + " " + Log.KEY_SYSTEM_INFO_DIVIDER + " **环境信息** "
+ String env = " **环境信息** "
+ + " \n 系统: " + Log.OS_NAME + " " + Log.OS_VERSION
+ + " \n 数据库: " + db
+ + " \n JDK: " + Log.JAVA_VERSION + " " + Log.OS_ARCH
+ + " \n APIJSON: " + Log.VERSION;
+
+ if (e instanceof CommonException) {
+ ((CommonException) e).setEnvironment(env);
+ return e;
+ }
+
+// try {
+// e = clazz.getConstructor(String.class, Throwable.class).newInstance(msg, e);
+// }
+// catch (Throwable e2) {
+ return new CommonException(e, env); // e = clazz.getConstructor(String.class).newInstance(msg);
+// }
+ } catch (Throwable e2) {}
+ }
+
+ return e;
+ }
+
+}
+
diff --git a/APIJSONORM/src/main/java/apijson/orm/model/DbaColumn.java b/APIJSONORM/src/main/java/apijson/orm/model/DbaColumn.java
new file mode 100644
index 00000000..f5750155
--- /dev/null
+++ b/APIJSONORM/src/main/java/apijson/orm/model/DbaColumn.java
@@ -0,0 +1,18 @@
+/*Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
+
+This source code is licensed under the Apache License Version 2.0.*/
+
+
+package apijson.orm.model;
+
+import apijson.MethodAccess;
+
+/**SQL Server 在 sys 下的字段(列名)
+ * @author Lemon
+ */
+@MethodAccess(POST = {}, PUT = {}, DELETE = {})
+public class DbaColumn {
+ public static final String TAG = "DbaColumn";
+ public static final String TABLE_NAME = "all_tab_columns";
+
+}
diff --git a/APIJSONORM/src/main/java/apijson/orm/model/DbaTable.java b/APIJSONORM/src/main/java/apijson/orm/model/DbaTable.java
new file mode 100644
index 00000000..3642e165
--- /dev/null
+++ b/APIJSONORM/src/main/java/apijson/orm/model/DbaTable.java
@@ -0,0 +1,18 @@
+/*Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
+
+This source code is licensed under the Apache License Version 2.0.*/
+
+
+package apijson.orm.model;
+
+import apijson.MethodAccess;
+
+/**SQL Server 表属性
+ * @author Lemon
+ */
+@MethodAccess(POST = {}, PUT = {}, DELETE = {})
+public class DbaTable {
+ public static final String TAG = "DbaTable";
+ public static final String TABLE_NAME = "dba_tables";
+
+}