Skip to content

Commit 5e2f79f

Browse files
author
chengluo
committed
feat: add snowflake plugin
1 parent 6806d43 commit 5e2f79f

File tree

22 files changed

+355
-24
lines changed

22 files changed

+355
-24
lines changed

server/api-service/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ IDEA 2021.3.2 (Community Edition):
6262
</tr>
6363
<tr>
6464
<td>VM options </td>
65-
<td>-Dpf4j.mode=development -Dpf4j.pluginsDir=openblocks-plugins -Dspring.profiles.active=openblocks -XX:+AllowRedefinitionToAddDeleteMethods </td>
65+
<td>-Dpf4j.mode=development -Dpf4j.pluginsDir=openblocks-plugins -Dspring.profiles.active=openblocks -XX:+AllowRedefinitionToAddDeleteMethods --add-opens java.base/java.nio=ALL-UNNAMED</td>
6666
</tr>
6767
<tr>
6868
<td>Main class </td>

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/datasource/service/impl/DatasourceStructureServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private Mono<DatasourceStructure> getLatestStructure(Datasource datasource,
9999
QueryExecutor<? extends DatasourceConnectionConfig, Object, ? extends QueryExecutionContext> queryExecutor) {
100100

101101
return connectionContextService.getOrCreateConnection(datasource)
102-
.flatMap(connectionContext -> queryExecutor.doGetStructure(connectionContext.connection())
102+
.flatMap(connectionContext -> queryExecutor.doGetStructure(connectionContext.connection(), datasource.getDetailConfig())
103103
.timeout(Duration.ofMillis(GET_STRUCTURE_DEFAULT_TIMEOUT_MILLIS))
104104
.doOnError(connectionContext::onQueryError)
105105
.onErrorMap(TimeoutException.class, e -> new BizException(BizError.PLUGIN_EXECUTION_TIMEOUT, "PLUGIN_EXECUTION_TIMEOUT",

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/plugin/service/impl/DatasourceMetaInfoServiceImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ public class DatasourceMetaInfoServiceImpl implements DatasourceMetaInfoService
117117
.connectionPool(ClientBasedConnectionPool.class)
118118
.build();
119119

120+
121+
private static final DatasourceMetaInfo SNOWFLAKE = DatasourceMetaInfo.builder()
122+
.type("snowflake")
123+
.displayName("Snowflake")
124+
.pluginExecutorKey("snowflake-plugin")
125+
.hasStructureInfo(true)
126+
.connectionPool(ClientBasedConnectionPool.class)
127+
.build();
128+
120129
private static final DatasourceMetaInfo GOOGLE_SHEETS = DatasourceMetaInfo.builder()
121130
.type("googleSheets")
122131
.displayName("Google Sheets")

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ public Mono<QueryExecutionResult> executeQuery(HikariDataSource hikariDataSource
108108
}
109109

110110
@Override
111-
public Mono<DatasourceStructure> getStructure(HikariDataSource hikariDataSource) {
111+
public Mono<DatasourceStructure> getStructure(HikariDataSource hikariDataSource,
112+
ClickHouseDatasourceConfig connectionConfig) {
112113

113114
return Mono.fromCallable(() -> {
114115
Connection connection = getConnection(hikariDataSource);

server/api-service/openblocks-plugins/mongoPlugin/src/main/java/com/openblocks/plugin/mongo/MongoPlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,8 @@ public Mono<DatasourceTestResult> testConnection(MongoDatasourceConfig connectio
471471
}
472472

473473
@Override
474-
public Mono<DatasourceStructure> getStructure(MongoConnection mongoClient) {
474+
public Mono<DatasourceStructure> getStructure(MongoConnection mongoClient,
475+
MongoDatasourceConfig connectionConfig) {
475476
final DatasourceStructure structure = new DatasourceStructure();
476477
List<DatasourceStructure.Table> tables = new ArrayList<>();
477478
structure.setTables(tables);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ public Mono<QueryExecutionResult> executeQuery(HikariDataSource hikariDataSource
119119
}
120120

121121
@Override
122-
public Mono<DatasourceStructure> getStructure(HikariDataSource hikariDataSource) {
122+
public Mono<DatasourceStructure> getStructure(HikariDataSource hikariDataSource,
123+
MssqlDatasourceConfig connectionConfig) {
123124
return Mono.fromCallable(() -> {
124125
Connection connection = getConnection(hikariDataSource);
125126

server/api-service/openblocks-plugins/mysqlPlugin/src/main/java/com/openblocks/plugin/mysql/MysqlQueryExecutor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.openblocks.sdk.exception.PluginException;
2323
import com.openblocks.sdk.models.DatasourceStructure;
2424
import com.openblocks.sdk.models.DatasourceStructure.Table;
25+
import com.openblocks.sdk.plugin.common.sql.SqlBasedDatasourceConnectionConfig;
2526
import com.openblocks.sdk.plugin.sqlcommand.GuiSqlCommand;
2627
import com.openblocks.sdk.plugin.sqlcommand.command.mysql.MysqlBulkInsertCommand;
2728
import com.openblocks.sdk.plugin.sqlcommand.command.mysql.MysqlBulkUpdateCommand;
@@ -42,7 +43,8 @@ public MysqlQueryExecutor() {
4243

4344
@Nonnull
4445
@Override
45-
protected DatasourceStructure getDatabaseMetadata(Connection connection) {
46+
protected DatasourceStructure getDatabaseMetadata(Connection connection,
47+
SqlBasedDatasourceConnectionConfig connectionConfig) {
4648
Map<String, Table> tablesByName = new LinkedHashMap<>();
4749
try (Statement statement = connection.createStatement()) {
4850
parseTableAndColumns(tablesByName, statement);

server/api-service/openblocks-plugins/mysqlPlugin/src/main/java/com/openblocks/plugin/mysql/OldMysqlQueryExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,8 @@ private HikariDataSource getHikariDataSource(HikariPerfWrapper hikariDataSource)
202202

203203
@Nonnull
204204
@Override
205-
public DatasourceStructure blockingGetStructure(HikariPerfWrapper hikariPerfWrapper) {
205+
public DatasourceStructure blockingGetStructure(HikariPerfWrapper hikariPerfWrapper,
206+
MysqlDatasourceConfig connectionConfig) {
206207

207208
Map<String, Table> tablesByName = new LinkedHashMap<>();
208209
try (Connection connection = getConnection(getHikariDataSource(hikariPerfWrapper));

server/api-service/openblocks-plugins/oraclePlugin/src/main/java/com/openblocks/plugin/oracle/OraclePlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ public Mono<Void> destroyConnection(HikariDataSource hikariDataSource) {
119119
}
120120

121121
@Override
122-
public Mono<DatasourceStructure> getStructure(HikariDataSource hikariDataSource) {
122+
public Mono<DatasourceStructure> getStructure(HikariDataSource hikariDataSource,
123+
OracleDatasourceConfig connectionConfig) {
123124
return Mono.fromSupplier(() -> getStructure0(hikariDataSource))
124125
.subscribeOn(querySharedScheduler());
125126
}

server/api-service/openblocks-plugins/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,6 @@
9494
<module>oraclePlugin</module>
9595
<module>graphqlPlugin</module>
9696
<module>sqlBasedPlugin</module>
97+
<module>snowflakePlugin</module>
9798
</modules>
9899
</project>

server/api-service/openblocks-plugins/postgresPlugin/src/main/java/com/openblocks/plugin/postgres/PostgresExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ private List<LocaleMessage> populateHintMessages(List<String> columnNames) {
349349

350350
@Nonnull
351351
@Override
352-
public DatasourceStructure blockingGetStructure(HikariDataSource hikariDataSource) {
352+
public DatasourceStructure blockingGetStructure(HikariDataSource hikariDataSource,
353+
PostgresDatasourceConfig connectionConfig) {
353354

354355
DatasourceStructure structure = new DatasourceStructure();
355356
Map<String, DatasourceStructure.Table> tablesByName = new LinkedHashMap<>();
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
plugin.id=snowflake-plugin
2+
plugin.class=com.openblocks.plugin.snowflake.SnowflakePlugin
3+
plugin.version=1.0-SNAPSHOT
4+
plugin.provider=dev@openblocks.dev
5+
plugin.dependencies=
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>com.openblocks</groupId>
8+
<artifactId>openblocks-plugins</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
</parent>
11+
12+
<artifactId>snowflakePlugin</artifactId>
13+
14+
<properties>
15+
<maven.compiler.source>17</maven.compiler.source>
16+
<maven.compiler.target>17</maven.compiler.target>
17+
<java.version>17</java.version>
18+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
19+
20+
<plugin.id>snowflake-plugin</plugin.id>
21+
<plugin.class>com.openblocks.plugin.snowflake.SnowflakePlugin</plugin.class>
22+
<plugin.version>1.0-SNAPSHOT</plugin.version>
23+
<plugin.provider>dev@openblocks.dev</plugin.provider>
24+
<plugin.dependencies/>
25+
</properties>
26+
27+
<dependencies>
28+
29+
<dependency>
30+
<groupId>net.snowflake</groupId>
31+
<artifactId>snowflake-jdbc</artifactId>
32+
<version>3.13.27</version>
33+
</dependency>
34+
<dependency>
35+
<groupId>com.openblocks</groupId>
36+
<artifactId>sqlBasedPlugin</artifactId>
37+
<version>1.0-SNAPSHOT</version>
38+
</dependency>
39+
40+
<dependency>
41+
<groupId>org.testcontainers</groupId>
42+
<artifactId>testcontainers</artifactId>
43+
<version>1.16.3</version>
44+
<scope>test</scope>
45+
</dependency>
46+
</dependencies>
47+
48+
<build>
49+
<plugins>
50+
<plugin>
51+
<groupId>org.apache.maven.plugins</groupId>
52+
<artifactId>maven-shade-plugin</artifactId>
53+
<version>3.2.4</version>
54+
<executions>
55+
<execution>
56+
<id>shade-plugin-jar</id>
57+
<phase>package</phase>
58+
<goals>
59+
<goal>shade</goal>
60+
</goals>
61+
<configuration>
62+
<minimizeJar>false</minimizeJar>
63+
<transformers>
64+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
65+
<manifestEntries>
66+
<Plugin-Id>${plugin.id}</Plugin-Id>
67+
<Plugin-Class>${plugin.class}</Plugin-Class>
68+
<Plugin-Version>${plugin.version}</Plugin-Version>
69+
<Plugin-Provider>${plugin.provider}</Plugin-Provider>
70+
</manifestEntries>
71+
</transformer>
72+
</transformers>
73+
</configuration>
74+
</execution>
75+
</executions>
76+
</plugin>
77+
<plugin>
78+
<artifactId>maven-dependency-plugin</artifactId>
79+
<executions>
80+
<execution>
81+
<id>copy-dependencies</id>
82+
<phase>package</phase>
83+
<goals>
84+
<goal>copy-dependencies</goal>
85+
</goals>
86+
<configuration>
87+
<includeScope>runtime</includeScope>
88+
<outputDirectory>${project.build.directory}/lib</outputDirectory>
89+
</configuration>
90+
</execution>
91+
</executions>
92+
</plugin>
93+
</plugins>
94+
</build>
95+
96+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.openblocks.plugin.snowflake;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.pf4j.Extension;
5+
6+
import com.openblocks.plugin.sql.SqlBasedConnector;
7+
import com.zaxxer.hikari.HikariConfig;
8+
9+
@Extension
10+
public class SnowflakeConnector extends SqlBasedConnector<SnowflakeDatasourceConfig> {
11+
12+
private static final String JDBC_DRIVER = "net.snowflake.client.jdbc.SnowflakeDriver";
13+
14+
public SnowflakeConnector() {
15+
super(50);
16+
}
17+
18+
@Override
19+
protected String getJdbcDriver() {
20+
return JDBC_DRIVER;
21+
}
22+
23+
@Override
24+
protected void setUpConfigs(SnowflakeDatasourceConfig datasourceConfig, HikariConfig config) {
25+
String host = datasourceConfig.getHost();
26+
String database = datasourceConfig.getDatabase();
27+
28+
String url = "jdbc:snowflake://" + host + ".snowflakecomputing.com/";
29+
config.setJdbcUrl(url);
30+
config.addDataSourceProperty("db", database);
31+
config.addDataSourceProperty("user", datasourceConfig.getUsername());
32+
config.addDataSourceProperty("password", datasourceConfig.getPassword());
33+
34+
datasourceConfig.getExtParams()
35+
.forEach((key, value) -> {
36+
if (StringUtils.isBlank(key) || value == null || StringUtils.isBlank(String.valueOf(value))) {
37+
return;
38+
}
39+
config.addDataSourceProperty(key, value);
40+
});
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.openblocks.plugin.snowflake;
2+
3+
import java.util.Map;
4+
5+
import com.openblocks.sdk.plugin.common.sql.SqlBasedDatasourceConnectionConfig;
6+
7+
import lombok.Builder;
8+
import lombok.ToString;
9+
import lombok.extern.slf4j.Slf4j;
10+
11+
@ToString
12+
@Slf4j
13+
public class SnowflakeDatasourceConfig extends SqlBasedDatasourceConnectionConfig {
14+
15+
@Builder
16+
public SnowflakeDatasourceConfig(String database, String username, String password, String host,
17+
Long port, boolean usingSsl, String serverTimezone,
18+
boolean isReadonly, boolean enableTurnOffPreparedStatement, Map<String, Object> extParams) {
19+
super(database, username, password, host, port, usingSsl, serverTimezone, isReadonly, enableTurnOffPreparedStatement, extParams);
20+
}
21+
22+
@Override
23+
protected long defaultPort() {
24+
return -1;
25+
}
26+
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.openblocks.plugin.snowflake;
2+
3+
import org.pf4j.Plugin;
4+
import org.pf4j.PluginWrapper;
5+
6+
public class SnowflakePlugin extends Plugin {
7+
8+
public SnowflakePlugin(PluginWrapper wrapper) {
9+
super(wrapper);
10+
}
11+
12+
}

0 commit comments

Comments
 (0)