Skip to content

Commit 9b9086a

Browse files
committed
新增支持 CockroachDB-云原生分布式高可用轻松扩展数据库
1 parent a4108de commit 9b9086a

File tree

6 files changed

+100
-22
lines changed

6 files changed

+100
-22
lines changed

APIJSONORM/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>com.github.Tencent</groupId>
77
<artifactId>APIJSON</artifactId>
8-
<version>7.5.6</version>
8+
<version>7.6.0</version>
99
<packaging>jar</packaging>
1010

1111
<name>APIJSONORM</name>

APIJSONORM/src/main/java/apijson/Log.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class Log {
1414

1515
public static boolean DEBUG = true;
1616

17-
public static final String VERSION = "7.5.5";
17+
public static final String VERSION = "7.6.0";
1818
public static final String KEY_SYSTEM_INFO_DIVIDER = "\n---|-----APIJSON SYSTEM INFO-----|---\n";
1919

2020
public static final String OS_NAME;

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
9595
public static boolean ALLOW_MISSING_KEY_4_COMBINE = true;
9696

9797
public static String DEFAULT_DATABASE = DATABASE_MYSQL;
98-
public static String DEFAULT_NAMESPACE = "root";
99-
public static String DEFAULT_CATALOG = "postgres";
98+
public static String DEFAULT_NAMESPACE = ""; // "root";
99+
public static String DEFAULT_CATALOG = ""; // PostgreSQL JDBC 必须在 URI 中传 ""postgres";
100100
public static String DEFAULT_SCHEMA = "sys";
101101
public static String PREFIX_DISTINCT = "DISTINCT ";
102102

@@ -181,6 +181,7 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
181181
DATABASE_LIST.add(DATABASE_DB2);
182182
DATABASE_LIST.add(DATABASE_MARIADB);
183183
DATABASE_LIST.add(DATABASE_TIDB);
184+
DATABASE_LIST.add(DATABASE_COCKROACHDB);
184185
DATABASE_LIST.add(DATABASE_DAMENG);
185186
DATABASE_LIST.add(DATABASE_KINGBASE);
186187
DATABASE_LIST.add(DATABASE_ELASTICSEARCH);
@@ -1156,6 +1157,14 @@ public static boolean isTiDB(String db) {
11561157
return DATABASE_TIDB.equals(db);
11571158
}
11581159

1160+
@Override
1161+
public boolean isCockroachDB() {
1162+
return isCockroachDB(getSQLDatabase());
1163+
}
1164+
public static boolean isCockroachDB(String db) {
1165+
return DATABASE_COCKROACHDB.equals(db);
1166+
}
1167+
11591168
@Override
11601169
public boolean isDameng() {
11611170
return isDameng(getSQLDatabase());
@@ -1459,11 +1468,15 @@ public String getSQLTable() {
14591468
public String getTablePath() {
14601469
String q = getQuote();
14611470

1471+
String ns = isSurrealDB() ? getSQLNamespace() : null;
1472+
String cl = isPostgreSQL() || isCockroachDB() || isOpenGauss() || isDuckDB() ? getSQLCatalog() : null;
14621473
String sch = getSQLSchema();
14631474
String sqlTable = getSQLTable();
14641475

1465-
return (StringUtil.isEmpty(sch, true) ? "" : q + sch + q + ".") + q + sqlTable + q
1466-
+ (isKeyPrefix() ? getAs() + q + getSQLAlias() + q : "");
1476+
return (StringUtil.isEmpty(ns, true) ? "" : q + ns + q + ".")
1477+
+ (StringUtil.isEmpty(cl, true) ? "" : q + cl + q + ".")
1478+
+ (StringUtil.isEmpty(sch, true) ? "" : q + sch + q + ".")
1479+
+ q + sqlTable + q + (isKeyPrefix() ? getAs() + q + getSQLAlias() + q : "");
14671480
}
14681481
@Override
14691482
public AbstractSQLConfig<T> setTable(String table) { //Table已经在Parser中校验,所以这里不用防SQL注入
@@ -3955,7 +3968,7 @@ public String getRegExpString(String key, String column, Object[] values, int ty
39553968
*/
39563969
@JSONField(serialize = false)
39573970
public String getRegExpString(String key, String column, String value, boolean ignoreCase) {
3958-
if (isPostgreSQL() || isInfluxDB()) {
3971+
if (isPostgreSQL() || isCockroachDB() || isInfluxDB()) {
39593972
return getKey(column) + " ~" + (ignoreCase ? "* " : " ") + getValue(key, column, value);
39603973
}
39613974
if (isOracle() || isDameng() || isKingBase() || (isMySQL() && getDBVersionNums()[0] >= 8)) {
@@ -4281,7 +4294,7 @@ public String getContainString(String key, String column, Object[] childs, int t
42814294
}
42824295

42834296
condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR));
4284-
if (isPostgreSQL() || isInfluxDB()) {
4297+
if (isPostgreSQL() || isCockroachDB() || isInfluxDB()) {
42854298
condition += (getKey(column) + " @> " + getValue(key, column, newJSONArray(c)));
42864299
// operator does not exist: jsonb @> character varying "[" + c + "]");
42874300
}
@@ -4987,7 +5000,7 @@ else if (l > 0 && StringUtil.isName(String.valueOf(l))) {
49875000
}
49885001
else if (rt.endsWith("~")) {
49895002
boolean ignoreCase = "*~".equals(rt);
4990-
if (isPostgreSQL() || isInfluxDB()) {
5003+
if (isPostgreSQL() || isCockroachDB() || isInfluxDB()) {
49915004
sql += (first ? ON : AND) + lk + (isNot ? NOT : "") + " ~" + (ignoreCase ? "* " : " ") + rk;
49925005
}
49935006
else if (isOracle() || isDameng() || isKingBase()) {
@@ -5042,7 +5055,7 @@ else if ("{}".equals(rt) || "<>".equals(rt)) {
50425055
String arrKeyPath = isIn ? rk : lk;
50435056
String itemKeyPath = isIn ? lk : rk;
50445057

5045-
if (isPostgreSQL() || isInfluxDB()) { //operator does not exist: jsonb @> character varying "[" + c + "]");
5058+
if (isPostgreSQL() || isCockroachDB() || isInfluxDB()) { //operator does not exist: jsonb @> character varying "[" + c + "]");
50465059
sql += (first ? ON : AND) + (isNot ? "( " : "") + getCondition(isNot, arrKeyPath
50475060
+ " IS NOT NULL AND " + arrKeyPath + " @> " + itemKeyPath) + (isNot ? ") " : "");
50485061
}

APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,7 @@ else if (RequestMethod.isGetMethod(config.getMethod(), true)) {
11901190
//} else {
11911191
// statement = getConnection(config).prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
11921192
//}
1193-
if (config.isMySQL() || config.isPostgreSQL() || config.isOracle() || config.isSQLServer() || config.isDb2()) {
1193+
if (config.isMySQL() || config.isPostgreSQL() || config.isCockroachDB() || config.isOracle() || config.isSQLServer() || config.isDb2()) {
11941194
statement = getConnection(config).prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
11951195
} else {
11961196
statement = getConnection(config).prepareStatement(sql);

APIJSONORM/src/main/java/apijson/orm/SQLConfig.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ public interface SQLConfig<T extends Object> {
2222
String DATABASE_SQLSERVER = "SQLSERVER"; // https://www.microsoft.com/en-us/sql-server
2323
String DATABASE_ORACLE = "ORACLE"; // https://www.oracle.com/database
2424
String DATABASE_DB2 = "DB2"; // https://www.ibm.com/products/db2
25-
String DATABASE_MARIADB = "MARIADB"; // https://mariadb.org
26-
String DATABASE_TIDB = "TIDB"; // https://www.pingcap.com/tidb
27-
String DATABASE_DAMENG = "DAMENG"; // https://www.dameng.com
28-
String DATABASE_KINGBASE = "KINGBASE"; // https://www.kingbase.com.cn
29-
String DATABASE_ELASTICSEARCH = "ELASTICSEARCH"; // https://www.elastic.co/guide/en/elasticsearch/reference/7.4/xpack-sql.html
30-
String DATABASE_CLICKHOUSE = "CLICKHOUSE"; // https://clickhouse.com
25+
String DATABASE_MARIADB = "MARIADB"; // https://mariadb.org
26+
String DATABASE_TIDB = "TIDB"; // https://www.pingcap.com/tidb
27+
String DATABASE_COCKROACHDB = "COCKROACHDB"; // https://www.cockroachlabs.com
28+
String DATABASE_DAMENG = "DAMENG"; // https://www.dameng.com
29+
String DATABASE_KINGBASE = "KINGBASE"; // https://www.kingbase.com.cn
30+
String DATABASE_ELASTICSEARCH = "ELASTICSEARCH"; // https://www.elastic.co/guide/en/elasticsearch/reference/7.4/xpack-sql.html
31+
String DATABASE_CLICKHOUSE = "CLICKHOUSE"; // https://clickhouse.com
3132
String DATABASE_HIVE = "HIVE"; // https://hive.apache.org
3233
String DATABASE_PRESTO = "PRESTO"; // Facebook PrestoDB https://prestodb.io
3334
String DATABASE_TRINO = "TRINO"; // PrestoSQL https://trino.io
@@ -45,7 +46,7 @@ public interface SQLConfig<T extends Object> {
4546
String DATABASE_SQLITE = "SQLITE"; // https://www.sqlite.org
4647
String DATABASE_DUCKDB = "DUCKDB"; // https://duckdb.org
4748
String DATABASE_SURREALDB = "SURREALDB"; // https://surrealdb.com
48-
String DATABASE_OPENGAUSS = "OPENGAUSS"; // https://surrealdb.com
49+
String DATABASE_OPENGAUSS = "OPENGAUSS"; // https://opengauss.org
4950

5051
String DATABASE_MQ = "MQ"; //
5152

@@ -81,6 +82,7 @@ public interface SQLConfig<T extends Object> {
8182
boolean isDb2();
8283
boolean isMariaDB();
8384
boolean isTiDB();
85+
boolean isCockroachDB();
8486
boolean isDameng();
8587
boolean isKingBase();
8688
boolean isElasticsearch();

APIJSONORM/src/main/java/apijson/orm/exception/CommonException.java

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public CommonException(Throwable t, String environment) {
147147
}
148148

149149

150-
public static Exception wrap(Exception e, SQLConfig config) {
150+
public static Exception wrap(Exception e, SQLConfig<?> config) {
151151
if (Log.DEBUG == false && e instanceof SQLException) {
152152
return new SQLException("数据库驱动执行异常SQLException,非 Log.DEBUG 模式下不显示详情,避免泄漏真实模式名、表名等隐私信息", e);
153153
}
@@ -158,23 +158,32 @@ public static Exception wrap(Exception e, SQLConfig config) {
158158
// msg != null && msg.contains(Log.KEY_SYSTEM_INFO_DIVIDER) == false) {
159159
try {
160160
String db = config == null ? AbstractSQLConfig.DEFAULT_DATABASE : (config instanceof AbstractSQLConfig
161-
? ((AbstractSQLConfig) config).getSQLDatabase() : config.getDatabase()
161+
? ((AbstractSQLConfig<?>) config).getSQLDatabase() : config.getDatabase()
162162
);
163163

164-
String dbVersion = config.getDBVersion();
164+
String dbVersion = config == null ? null : config.getDBVersion();
165165
if (StringUtil.isEmpty(dbVersion)) {
166166
dbVersion = "<!-- 请填写版本号,例如 8.0 -->";
167167
}
168168

169-
if (db != null) {
169+
if (db != null || config == null) {
170170
db += " " + dbVersion;
171171
}
172172
else if (config.isMySQL()) {
173173
db = SQLConfig.DATABASE_MYSQL + " " + dbVersion;
174174
}
175+
else if (config.isMariaDB()) {
176+
db = SQLConfig.DATABASE_MARIADB + " " + dbVersion;
177+
}
178+
else if (config.isTiDB()) {
179+
db = SQLConfig.DATABASE_TIDB + " " + dbVersion;
180+
}
175181
else if (config.isPostgreSQL()) {
176182
db = SQLConfig.DATABASE_POSTGRESQL + " " + dbVersion;
177183
}
184+
else if (config.isCockroachDB()) {
185+
db = SQLConfig.DATABASE_COCKROACHDB + " " + dbVersion;
186+
}
178187
else if (config.isSQLServer()) {
179188
db = SQLConfig.DATABASE_SQLSERVER + " " + dbVersion;
180189
}
@@ -184,15 +193,69 @@ else if (config.isOracle()) {
184193
else if (config.isDb2()) {
185194
db = SQLConfig.DATABASE_DB2 + " " + dbVersion;
186195
}
196+
else if (config.isDuckDB()) {
197+
db = SQLConfig.DATABASE_DUCKDB + " " + dbVersion;
198+
}
199+
else if (config.isSurrealDB()) {
200+
db = SQLConfig.DATABASE_SURREALDB + " " + dbVersion;
201+
}
202+
else if (config.isOpenGauss()) {
203+
db = SQLConfig.DATABASE_OPENGAUSS + " " + dbVersion;
204+
}
187205
else if (config.isDameng()) {
188206
db = SQLConfig.DATABASE_DAMENG + " " + dbVersion;
189207
}
208+
else if (config.isKingBase()) {
209+
db = SQLConfig.DATABASE_KINGBASE + " " + dbVersion;
210+
}
211+
else if (config.isElasticsearch()) {
212+
db = SQLConfig.DATABASE_ELASTICSEARCH + " " + dbVersion;
213+
}
190214
else if (config.isClickHouse()) {
191215
db = SQLConfig.DATABASE_CLICKHOUSE + " " + dbVersion;
192216
}
217+
else if (config.isMilvus()) {
218+
db = SQLConfig.DATABASE_MILVUS + " " + dbVersion;
219+
}
220+
else if (config.isInfluxDB()) {
221+
db = SQLConfig.DATABASE_INFLUXDB + " " + dbVersion;
222+
}
193223
else if (config.isTDengine()) {
194224
db = SQLConfig.DATABASE_TDENGINE + " " + dbVersion;
195225
}
226+
else if (config.isIoTDB()) {
227+
db = SQLConfig.DATABASE_IOTDB + " " + dbVersion;
228+
}
229+
else if (config.isSQLite()) {
230+
db = SQLConfig.DATABASE_SQLITE + " " + dbVersion;
231+
}
232+
else if (config.isHive()) {
233+
db = SQLConfig.DATABASE_HIVE + " " + dbVersion;
234+
}
235+
else if (config.isPresto()) {
236+
db = SQLConfig.DATABASE_PRESTO + " " + dbVersion;
237+
}
238+
else if (config.isTrino()) {
239+
db = SQLConfig.DATABASE_TRINO + " " + dbVersion;
240+
}
241+
else if (config.isSnowflake()) {
242+
db = SQLConfig.DATABASE_SNOWFLAKE + " " + dbVersion;
243+
}
244+
else if (config.isDatabricks()) {
245+
db = SQLConfig.DATABASE_DATABRICKS + " " + dbVersion;
246+
}
247+
else if (config.isMongoDB()) {
248+
db = SQLConfig.DATABASE_MONGODB + " " + dbVersion;
249+
}
250+
else if (config.isCassandra()) {
251+
db = SQLConfig.DATABASE_CASSANDRA + " " + dbVersion;
252+
}
253+
else if (config.isRedis()) {
254+
db = SQLConfig.DATABASE_REDIS + " " + dbVersion;
255+
}
256+
else if (config.isKafka()) {
257+
db = SQLConfig.DATABASE_KAFKA + " " + dbVersion;
258+
}
196259
else {
197260
db = "<!-- 请填写,例如 MySQL 5.7。获取到的默认数据库为 " + AbstractSQLConfig.DEFAULT_DATABASE + " -->";
198261
}

0 commit comments

Comments
 (0)