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 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 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 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"; + +}