Skip to content

Commit f7dbe3c

Browse files
lvhuichaoQIQI03
authored andcommitted
1. extract SqlBasedQueryExecutionContext and SqlBasedDatasourceConnectionConfig for sql data sources
2. enable disable preparedStatement for all sql data soureces
1 parent b98b146 commit f7dbe3c

File tree

26 files changed

+332
-632
lines changed

26 files changed

+332
-632
lines changed

deploy/docker/entrypoint.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ add_user() {
2727
echo "Starting with UID : $USER_ID"
2828
groupadd -g $GROUP_ID $GROUP_NAME || true
2929
useradd -u $USER_ID -g $GROUP_ID $USER_NAME || true
30-
chown -R $USER_ID:$GROUP_ID /openblocks /openblocks-stacks /etc/nginx /var /etc/redis /etc/supervisor
31-
chown $USER_ID:$GROUP_ID /run
30+
chown -R $USER_ID:$GROUP_ID /openblocks /openblocks-stacks /etc/nginx /var /etc/redis /run /etc/supervisor
3231
}
3332

3433
init_mongodb

server/openblocks-plugins/clickHousePlugin/src/main/java/com/openblocks/plugin/clickhouse/ClickHouseConnector.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,9 @@ public ClickHouseDatasourceConfig resolveConfig(Map<String, Object> configMap) {
6969
@Override
7070
public Set<String> validateConfig(ClickHouseDatasourceConfig connectionConfig) {
7171

72-
ClickHouseDatasourceConfig datasourceConfig = ClickHouseDatasourceConfig.from(connectionConfig);
73-
7472
Set<String> invalids = new HashSet<>();
7573

76-
String host = datasourceConfig.getHost();
74+
String host = connectionConfig.getHost();
7775
if (StringUtils.isBlank(host)) {
7876
invalids.add("HOST_EMPTY");
7977
}
@@ -86,7 +84,7 @@ public Set<String> validateConfig(ClickHouseDatasourceConfig connectionConfig) {
8684
invalids.add("INVALID_HOST");
8785
}
8886

89-
if (StringUtils.isBlank(datasourceConfig.getDatabase())) {
87+
if (StringUtils.isBlank(connectionConfig.getDatabase())) {
9088
invalids.add("DATABASE_NAME_EMPTY");
9189
}
9290

server/openblocks-plugins/clickHousePlugin/src/main/java/com/openblocks/plugin/clickhouse/ClickHouseQueryExecutor.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838

3939
import com.openblocks.plugin.clickhouse.model.ClickHouseDatasourceConfig;
4040
import com.openblocks.plugin.clickhouse.model.ClickHouseQueryConfig;
41-
import com.openblocks.plugin.clickhouse.model.ClickHouseQueryExecutionContext;
4241
import com.openblocks.plugin.clickhouse.utils.ClickHouseStructureParser;
4342
import com.openblocks.sdk.config.dynamic.ConfigCenter;
4443
import com.openblocks.sdk.exception.InvalidHikariDatasourceException;
@@ -49,6 +48,7 @@
4948
import com.openblocks.sdk.models.QueryExecutionResult;
5049
import com.openblocks.sdk.plugin.common.QueryExecutor;
5150
import com.openblocks.sdk.plugin.common.SqlQueryUtils;
51+
import com.openblocks.sdk.plugin.common.sql.SqlBasedQueryExecutionContext;
5252
import com.openblocks.sdk.query.QueryVisitorContext;
5353
import com.zaxxer.hikari.HikariDataSource;
5454

@@ -57,7 +57,7 @@
5757

5858
@Slf4j
5959
@Extension
60-
public class ClickHouseQueryExecutor implements QueryExecutor<ClickHouseDatasourceConfig, HikariDataSource, ClickHouseQueryExecutionContext> {
60+
public class ClickHouseQueryExecutor implements QueryExecutor<ClickHouseDatasourceConfig, HikariDataSource, SqlBasedQueryExecutionContext> {
6161

6262
private final Supplier<Duration> getStructureTimeout;
6363

@@ -67,7 +67,7 @@ public ClickHouseQueryExecutor(ConfigCenter configCenter) {
6767
}
6868

6969
@Override
70-
public ClickHouseQueryExecutionContext buildQueryExecutionContext(ClickHouseDatasourceConfig datasourceConfig,
70+
public SqlBasedQueryExecutionContext buildQueryExecutionContext(ClickHouseDatasourceConfig datasourceConfig,
7171
Map<String, Object> queryConfigMap,
7272
Map<String, Object> requestParams, QueryVisitorContext queryVisitorContext) {
7373

@@ -82,24 +82,22 @@ public ClickHouseQueryExecutionContext buildQueryExecutionContext(ClickHouseData
8282
throw new PluginException(QUERY_ARGUMENT_ERROR, "CLICKHOUSE_PS_ERROR");
8383
}
8484

85-
return ClickHouseQueryExecutionContext.builder()
85+
return SqlBasedQueryExecutionContext.builder()
8686
.query(query)
87-
.timeoutInMillis(queryConfig.getTimeout())
8887
.requestParams(requestParams)
89-
.disablePreparedStatement(queryConfig.isDisablePreparedStatement())
88+
.disablePreparedStatement(datasourceConfig.isEnableTurnOffPreparedStatement() &&
89+
queryConfig.isDisablePreparedStatement())
9090
.build();
9191
}
9292

9393
@Override
94-
public Mono<QueryExecutionResult> executeQuery(HikariDataSource hikariDataSource, ClickHouseQueryExecutionContext queryExecutionContext) {
94+
public Mono<QueryExecutionResult> executeQuery(HikariDataSource hikariDataSource, SqlBasedQueryExecutionContext queryExecutionContext) {
9595

9696
String query = queryExecutionContext.getQuery();
9797
Map<String, Object> requestParams = queryExecutionContext.getRequestParams();
98-
int queryTimeoutMs = queryExecutionContext.getTimeoutInMillis();
9998
boolean preparedStatement = !queryExecutionContext.isDisablePreparedStatement();
10099

101100
return Mono.fromSupplier(() -> executeQuery0(hikariDataSource, query, requestParams, preparedStatement))
102-
.timeout(Duration.ofMillis(queryTimeoutMs))
103101
.onErrorMap(e -> {
104102
if (e instanceof PluginException) {
105103
return e;
@@ -118,7 +116,6 @@ public Mono<DatasourceStructure> getStructure(HikariDataSource hikariDataSource)
118116
Map<String, Table> tablesByName = new LinkedHashMap<>();
119117
try (Statement statement = connection.createStatement()) {
120118
ClickHouseStructureParser.parseTableAndColumns(tablesByName, statement);
121-
// ClickHouseStructureParser.parseTableKeys(tablesByName, statement);
122119
} catch (SQLException throwable) {
123120
throw new PluginException(DATASOURCE_GET_STRUCTURE_ERROR, "DATASOURCE_GET_STRUCTURE_ERROR",
124121
throwable.getMessage());
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,39 @@
11
package com.openblocks.plugin.clickhouse.model;
22

3-
import static com.openblocks.sdk.exception.BizError.INVALID_DATASOURCE_CONFIG_TYPE;
43
import static com.openblocks.sdk.exception.PluginCommonError.DATASOURCE_ARGUMENT_ERROR;
5-
import static com.openblocks.sdk.util.ExceptionUtils.ofException;
64
import static com.openblocks.sdk.util.ExceptionUtils.ofPluginException;
75
import static com.openblocks.sdk.util.JsonUtils.fromJson;
86
import static com.openblocks.sdk.util.JsonUtils.toJson;
9-
import static org.apache.commons.lang3.ObjectUtils.firstNonNull;
107

118
import java.util.Map;
12-
import java.util.function.Function;
139

14-
import org.apache.commons.lang3.StringUtils;
15-
16-
import com.fasterxml.jackson.annotation.JsonCreator;
17-
import com.fasterxml.jackson.annotation.JsonView;
18-
import com.openblocks.sdk.config.SerializeConfig.JsonViews;
1910
import com.openblocks.sdk.models.DatasourceConnectionConfig;
11+
import com.openblocks.sdk.plugin.common.sql.SqlBasedDatasourceConnectionConfig;
2012

2113
import lombok.Builder;
22-
import lombok.Getter;
2314
import lombok.extern.slf4j.Slf4j;
2415

2516
@Slf4j
26-
@Getter
27-
@Builder
28-
public class ClickHouseDatasourceConfig implements DatasourceConnectionConfig {
29-
30-
private static final long DEFAULT_PORT = 3306L;
31-
32-
private final String database;
33-
private final String username;
17+
public class ClickHouseDatasourceConfig extends SqlBasedDatasourceConnectionConfig {
3418

35-
@JsonView(JsonViews.Internal.class)
36-
private String password;
19+
private static final long DEFAULT_PORT = 8123L;
3720

38-
private final String host;
39-
private final Long port;
40-
private final boolean usingSsl;
41-
42-
private final boolean isReadonly;
21+
@Builder
22+
protected ClickHouseDatasourceConfig(String database, String username, String password, String host, Long port, boolean usingSsl,
23+
String serverTimezone, boolean isReadonly, boolean enableTurnOffPreparedStatement) {
24+
super(database, username, password, host, port, usingSsl, serverTimezone, isReadonly, enableTurnOffPreparedStatement);
25+
}
4326

44-
private final boolean enableTurnOffPreparedStatement;
27+
@Override
28+
protected long defaultPort() {
29+
return DEFAULT_PORT;
30+
}
4531

46-
@JsonCreator
47-
private ClickHouseDatasourceConfig(String database, String username, String password, String host, Long port,
48-
boolean usingSsl, boolean isReadonly,
49-
boolean enableTurnOffPreparedStatement) {
50-
this.database = database;
51-
this.username = username;
52-
this.password = password;
53-
this.usingSsl = usingSsl;
54-
this.host = host;
55-
this.port = port;
56-
this.isReadonly = isReadonly;
57-
this.enableTurnOffPreparedStatement = enableTurnOffPreparedStatement;
32+
@Override
33+
protected DatasourceConnectionConfig createMergedConnectionConfig(String database, String username, String password, String host, long port,
34+
boolean usingSsl, String serverTimezone, boolean readonly, boolean enableTurnOffPreparedStatement) {
35+
return new ClickHouseDatasourceConfig(database, username, password, host, port, usingSsl, serverTimezone, readonly,
36+
enableTurnOffPreparedStatement);
5837
}
5938

6039
public static ClickHouseDatasourceConfig buildFrom(Map<String, Object> requestMap) {
@@ -65,72 +44,5 @@ public static ClickHouseDatasourceConfig buildFrom(Map<String, Object> requestMa
6544
return result;
6645
}
6746

68-
public static ClickHouseDatasourceConfig from(DatasourceConnectionConfig datasourceConfig) {
69-
if (datasourceConfig instanceof ClickHouseDatasourceConfig config) {
70-
return config;
71-
}
72-
throw ofPluginException(DATASOURCE_ARGUMENT_ERROR, "INVALID_CLICKHOUSE_CONFIG");
73-
}
74-
75-
public String getDatabase() {
76-
return StringUtils.trimToEmpty(database);
77-
}
78-
79-
public long getPort() {
80-
return port == null ? DEFAULT_PORT : port;
81-
}
82-
83-
public String getHost() {
84-
return StringUtils.trimToEmpty(host);
85-
}
86-
87-
public String getUsername() {
88-
return StringUtils.trimToEmpty(username);
89-
}
90-
91-
public boolean isReadonly() {
92-
return isReadonly;
93-
}
9447

95-
@Override
96-
public DatasourceConnectionConfig mergeWithUpdatedConfig(DatasourceConnectionConfig updatedConfig) {
97-
if (!(updatedConfig instanceof ClickHouseDatasourceConfig updatedMysqlConfig)) {
98-
throw ofException(INVALID_DATASOURCE_CONFIG_TYPE, "INVALID_DATASOURCE_CONFIG_TYPE", updatedConfig.getClass().getSimpleName());
99-
}
100-
101-
return new ClickHouseDatasourceConfig(updatedMysqlConfig.getDatabase(),
102-
updatedMysqlConfig.getUsername(),
103-
firstNonNull(updatedMysqlConfig.getPassword(), getPassword()),
104-
updatedMysqlConfig.getHost(),
105-
updatedMysqlConfig.getPort(),
106-
updatedMysqlConfig.isUsingSsl(),
107-
updatedMysqlConfig.isReadonly(),
108-
updatedMysqlConfig.isEnableTurnOffPreparedStatement());
109-
}
110-
111-
public boolean isEnableTurnOffPreparedStatement() {
112-
return enableTurnOffPreparedStatement;
113-
}
114-
115-
@Override
116-
public DatasourceConnectionConfig doEncrypt(Function<String, String> encryptFunc) {
117-
try {
118-
password = encryptFunc.apply(password);
119-
return this;
120-
} catch (Exception e) {
121-
log.error("fail to encrypt password: {}", password, e);
122-
return this;
123-
}
124-
}
125-
126-
@Override
127-
public DatasourceConnectionConfig doDecrypt(Function<String, String> decryptFunc) {
128-
try {
129-
password = decryptFunc.apply(password);
130-
return this;
131-
} catch (Exception e) {
132-
log.error("fail to encrypt password: {}", password, e);
133-
return this;
134-
}
135-
}
13648
}

server/openblocks-plugins/clickHousePlugin/src/main/java/com/openblocks/plugin/clickhouse/model/ClickHouseQueryConfig.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
@Getter
1717
public class ClickHouseQueryConfig {
1818

19-
private static final int DEFAULT_TIMEOUT = 8000;
20-
2119
private final String sql;
2220
private final boolean disablePreparedStatement;
2321
private final int timeout;
@@ -46,7 +44,4 @@ public String getSql() {
4644
return sql.trim();
4745
}
4846

49-
public int getTimeout() {
50-
return timeout == 0 ? DEFAULT_TIMEOUT : timeout;
51-
}
5247
}

server/openblocks-plugins/clickHousePlugin/src/main/java/com/openblocks/plugin/clickhouse/model/ClickHouseQueryExecutionContext.java

Lines changed: 0 additions & 19 deletions
This file was deleted.

server/openblocks-plugins/mssqlPlugin/src/main/java/com/openblocks/plugin/mssql/MssqlQueryExecutor.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,8 @@
3333
import org.apache.commons.lang3.StringUtils;
3434
import org.pf4j.Extension;
3535

36-
import com.google.common.collect.ImmutableMap;
3736
import com.openblocks.plugin.mssql.model.MssqlDatasourceConfig;
3837
import com.openblocks.plugin.mssql.model.MssqlQueryConfig;
39-
import com.openblocks.plugin.mssql.model.MssqlQueryExecutionContext;
4038
import com.openblocks.plugin.mssql.util.MssqlResultParser;
4139
import com.openblocks.sdk.config.dynamic.ConfigCenter;
4240
import com.openblocks.sdk.exception.InvalidHikariDatasourceException;
@@ -47,6 +45,7 @@
4745
import com.openblocks.sdk.models.QueryExecutionResult;
4846
import com.openblocks.sdk.plugin.common.QueryExecutor;
4947
import com.openblocks.sdk.plugin.common.sql.ResultSetParser;
48+
import com.openblocks.sdk.plugin.common.sql.SqlBasedQueryExecutionContext;
5049
import com.openblocks.sdk.query.QueryVisitorContext;
5150
import com.zaxxer.hikari.HikariDataSource;
5251

@@ -55,7 +54,7 @@
5554

5655
@Slf4j
5756
@Extension
58-
public class MssqlQueryExecutor implements QueryExecutor<MssqlDatasourceConfig, HikariDataSource, MssqlQueryExecutionContext> {
57+
public class MssqlQueryExecutor implements QueryExecutor<MssqlDatasourceConfig, HikariDataSource, SqlBasedQueryExecutionContext> {
5958

6059
private final Supplier<Duration> getStructureTimeout;
6160

@@ -65,7 +64,7 @@ public MssqlQueryExecutor(ConfigCenter configCenter) {
6564
}
6665

6766
@Override
68-
public MssqlQueryExecutionContext buildQueryExecutionContext(MssqlDatasourceConfig datasourceConfig,
67+
public SqlBasedQueryExecutionContext buildQueryExecutionContext(MssqlDatasourceConfig datasourceConfig,
6968
Map<String, Object> queryConfig,
7069
Map<String, Object> requestParams, QueryVisitorContext queryVisitorContext) {
7170
MssqlQueryConfig mssqlQueryConfig = MssqlQueryConfig.from(queryConfig);
@@ -75,15 +74,16 @@ public MssqlQueryExecutionContext buildQueryExecutionContext(MssqlDatasourceConf
7574
throw new PluginException(QUERY_ARGUMENT_ERROR, "SQL_EMPTY");
7675
}
7776

78-
return MssqlQueryExecutionContext.builder()
77+
return SqlBasedQueryExecutionContext.builder()
7978
.query(query)
8079
.requestParams(requestParams)
81-
.disablePreparedStatement(mssqlQueryConfig.isDisablePreparedStatement())
80+
.disablePreparedStatement(datasourceConfig.isEnableTurnOffPreparedStatement() &&
81+
mssqlQueryConfig.isDisablePreparedStatement())
8282
.build();
8383
}
8484

8585
@Override
86-
public Mono<QueryExecutionResult> executeQuery(HikariDataSource hikariDataSource, MssqlQueryExecutionContext context) {
86+
public Mono<QueryExecutionResult> executeQuery(HikariDataSource hikariDataSource, SqlBasedQueryExecutionContext context) {
8787

8888
String query = context.getQuery();
8989
Map<String, Object> requestParams = context.getRequestParams();
@@ -178,7 +178,7 @@ private QueryExecutionResult parseExecuteResult(boolean preparedStatement, State
178178

179179
Object affectedRows = preparedStatement ? Math.max(preparedQuery.getUpdateCount(), 0) // might return -1 here
180180
: Math.max(statement.getUpdateCount(), 0);
181-
return QueryExecutionResult.success(ImmutableMap.of("affectedRows", affectedRows));
181+
return QueryExecutionResult.success(Map.of("affectedRows", affectedRows));
182182
}
183183

184184
private List<Map<String, Object>> parseDataRows(ResultSet resultSet, ResultSetMetaData metaData, int colCount) throws SQLException {

0 commit comments

Comments
 (0)