diff --git a/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java b/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java index 93d17034fe..c85b827c81 100644 --- a/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java +++ b/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java @@ -9,6 +9,7 @@ public enum DatasourceTypes { sqlServer("sqlServer", "sqlServer", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""), de_doris("de_doris", "de_doris", "com.mysql.jdbc.Driver", "`", "`", "", ""), oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""), + mongo("mongo", "mongodb", "com.mongodb.jdbc.MongoDriver", "`", "`", "'", "'"), ck("ch", "ch", "ru.yandex.clickhouse.ClickHouseDriver", "`", "`", "'", "'"), es("es", "es", "", "\"", "\"", "\"", "\""); diff --git a/backend/src/main/java/io/dataease/datasource/dto/MongodbConfiguration.java b/backend/src/main/java/io/dataease/datasource/dto/MongodbConfiguration.java new file mode 100644 index 0000000000..cf7ffae616 --- /dev/null +++ b/backend/src/main/java/io/dataease/datasource/dto/MongodbConfiguration.java @@ -0,0 +1,19 @@ +package io.dataease.datasource.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MongodbConfiguration extends JdbcConfiguration { + + private String driver = "mongodb.jdbc.MongoDriver"; + private String connectionType; + + public String getJdbc() { + return "jdbc:mongodb://HOSTNAME:PORT/DATABASE" + .replace("HOSTNAME", getHost().trim()) + .replace("PORT", getPort().toString().trim()) + .replace("DATABASE", getDataBase().trim()); + } +} diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index 54ef94a908..0ae3f56d60 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -1,6 +1,8 @@ package io.dataease.datasource.provider; +import com.alibaba.druid.filter.Filter; import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.wall.WallFilter; import com.google.gson.Gson; import io.dataease.datasource.constants.DatasourceTypes; import io.dataease.datasource.dto.*; @@ -9,9 +11,11 @@ import io.dataease.exception.DataEaseException; import io.dataease.i18n.Translator; import io.dataease.provider.QueryProvider; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; +import javax.annotation.Resource; import java.beans.PropertyVetoException; import java.io.File; import java.io.IOException; @@ -25,6 +29,9 @@ public class JdbcProvider extends DatasourceProvider { public ExtendedJdbcClassLoader extendedJdbcClassLoader; static private String FILE_PATH = "/opt/dataease/drivers"; +// @Resource +// private WallFilter wallFilter; + @PostConstruct public void init() throws Exception{ ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); @@ -63,7 +70,9 @@ public class JdbcProvider extends DatasourceProvider { public List getData(DatasourceRequest dsr) throws Exception { List list = new LinkedList<>(); try (Connection connection = getConnectionFromPool(dsr); Statement stat = connection.createStatement(); ResultSet rs = stat.executeQuery(dsr.getQuery())){ + list = fetchResult(rs); + if(dsr.isPageable() && dsr.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.sqlServer.name())){ Integer realSize = dsr.getPage() * dsr.getPageSize() < list.size() ? dsr.getPage() * dsr.getPageSize(): list.size(); list = list.subList((dsr.getPage() - 1) * dsr.getPageSize(), realSize); @@ -318,6 +327,13 @@ public class JdbcProvider extends DatasourceProvider { driver = chConfiguration.getDriver(); jdbcurl = chConfiguration.getJdbc(); break; + case mongo: + MongodbConfiguration mongodbConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MongodbConfiguration.class); + username = mongodbConfiguration.getUsername(); + password = mongodbConfiguration.getPassword(); + driver = mongodbConfiguration.getDriver(); + jdbcurl = mongodbConfiguration.getJdbc(); + break; default: break; } @@ -332,13 +348,19 @@ public class JdbcProvider extends DatasourceProvider { return conn; } - private void addToPool(DatasourceRequest datasourceRequest) throws PropertyVetoException { - DruidDataSource dataSource = new DruidDataSource(); - JdbcConfiguration jdbcConfiguration = setCredential(datasourceRequest, dataSource); - dataSource.setInitialSize(jdbcConfiguration.getInitialPoolSize());// 初始连接数 - dataSource.setMinIdle(jdbcConfiguration.getMinPoolSize()); // 最小连接数 - dataSource.setMaxActive(jdbcConfiguration.getMaxPoolSize()); // 最大连接数 - jdbcConnection.put(datasourceRequest.getDatasource().getId(), dataSource); + private void addToPool(DatasourceRequest datasourceRequest) throws PropertyVetoException, SQLException { + DruidDataSource druidDataSource = new DruidDataSource(); + JdbcConfiguration jdbcConfiguration = setCredential(datasourceRequest, druidDataSource); + druidDataSource.setInitialSize(jdbcConfiguration.getInitialPoolSize());// 初始连接数 + druidDataSource.setMinIdle(jdbcConfiguration.getMinPoolSize()); // 最小连接数 + druidDataSource.setMaxActive(jdbcConfiguration.getMaxPoolSize()); // 最大连接数 + if(datasourceRequest.getDatasource().getType().equals(DatasourceTypes.mongo.name())){ + WallFilter wallFilter = new WallFilter(); + wallFilter.setDbType(DatasourceTypes.mysql.name()); + druidDataSource.setProxyFilters(Arrays.asList(new Filter[]{wallFilter})); + } + druidDataSource.init(); + jdbcConnection.put(datasourceRequest.getDatasource().getId(), druidDataSource); } @@ -351,47 +373,47 @@ public class JdbcProvider extends DatasourceProvider { case de_doris: case ds_doris: MysqlConfiguration mysqlConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MysqlConfiguration.class); - dataSource.setUsername(mysqlConfiguration.getUsername()); - dataSource.setDriverClassLoader(extendedJdbcClassLoader); - dataSource.setPassword(mysqlConfiguration.getPassword()); dataSource.setUrl(mysqlConfiguration.getJdbc()); + dataSource.setDriverClassName(mysqlConfiguration.getDriver()); jdbcConfiguration = mysqlConfiguration; break; case sqlServer: SqlServerConfiguration sqlServerConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfiguration.class); - dataSource.setUsername(sqlServerConfiguration.getUsername()); - dataSource.setDriverClassLoader(extendedJdbcClassLoader); - dataSource.setPassword(sqlServerConfiguration.getPassword()); + dataSource.setDriverClassName(sqlServerConfiguration.getDriver()); dataSource.setUrl(sqlServerConfiguration.getJdbc()); jdbcConfiguration = sqlServerConfiguration; break; case oracle: OracleConfiguration oracleConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), OracleConfiguration.class); - dataSource.setUsername(oracleConfiguration.getUsername()); - dataSource.setDriverClassLoader(extendedJdbcClassLoader); - dataSource.setPassword(oracleConfiguration.getPassword()); + dataSource.setDriverClassName(oracleConfiguration.getDriver()); dataSource.setUrl(oracleConfiguration.getJdbc()); jdbcConfiguration = oracleConfiguration; break; case pg: PgConfiguration pgConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfiguration.class); - dataSource.setUsername(pgConfiguration.getUsername()); - dataSource.setDriverClassLoader(extendedJdbcClassLoader); - dataSource.setPassword(pgConfiguration.getPassword()); + dataSource.setDriverClassName(pgConfiguration.getDriver()); dataSource.setUrl(pgConfiguration.getJdbc()); jdbcConfiguration = pgConfiguration; break; case ck: CHConfiguration chConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), CHConfiguration.class); - dataSource.setUsername(chConfiguration.getUsername()); - dataSource.setDriverClassLoader(extendedJdbcClassLoader); - dataSource.setPassword(chConfiguration.getPassword()); + dataSource.setDriverClassName(chConfiguration.getDriver()); dataSource.setUrl(chConfiguration.getJdbc()); jdbcConfiguration = chConfiguration; break; + case mongo: + MongodbConfiguration mongodbConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MongodbConfiguration.class); + dataSource.setDriverClassName(mongodbConfiguration.getDriver()); + dataSource.setUrl(mongodbConfiguration.getJdbc()); + jdbcConfiguration = mongodbConfiguration; + break; default: break; } + dataSource.setUsername(jdbcConfiguration.getUsername()); + dataSource.setDriverClassLoader(extendedJdbcClassLoader); + dataSource.setPassword(jdbcConfiguration.getPassword()); + return jdbcConfiguration; }