Commit bb7e5833 authored by wenmo's avatar wenmo

解决sql非查询语句的无法正确校验的问题

parent 831c025f
package com.dlink.service.impl;
import com.dlink.api.FlinkAPI;
import com.dlink.assertion.Assert;
import com.dlink.assertion.Asserts;
import com.dlink.config.Dialect;
import com.dlink.dto.SessionDTO;
......@@ -17,18 +16,14 @@ import com.dlink.job.JobConfig;
import com.dlink.job.JobManager;
import com.dlink.job.JobResult;
import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.model.Cluster;
import com.dlink.model.DataBase;
import com.dlink.model.Savepoints;
import com.dlink.model.SystemConfiguration;
import com.dlink.result.IResult;
import com.dlink.result.SelectResult;
import com.dlink.result.SqlExplainResult;
import com.dlink.service.ClusterConfigurationService;
import com.dlink.service.ClusterService;
import com.dlink.service.DataBaseService;
import com.dlink.service.SavepointsService;
import com.dlink.service.StudioService;
import com.dlink.service.*;
import com.dlink.session.SessionConfig;
import com.dlink.session.SessionInfo;
import com.dlink.session.SessionPool;
......@@ -105,13 +100,15 @@ public class StudioServiceImpl implements StudioService {
result.setEndTime(LocalDateTime.now());
return result;
}
try {
com.dlink.metadata.result.SelectResult selectResult = Driver.build(dataBase.getDriverConfig()).connect().query(studioExecuteDTO.getStatement(),studioExecuteDTO.getMaxRowNum());
result.setResult(selectResult);
Driver driver = Driver.build(dataBase.getDriverConfig()).connect();
JdbcSelectResult selectResult = driver.query(studioExecuteDTO.getStatement(),studioExecuteDTO.getMaxRowNum());
driver.close();
result.setResult(selectResult);
if(selectResult.isSuccess()){
result.setSuccess(true);
}catch (Exception e){
}else{
result.setSuccess(false);
result.setError(e.getMessage());
result.setError(selectResult.getError());
}
result.setEndTime(LocalDateTime.now());
return result;
......@@ -158,7 +155,9 @@ public class StudioServiceImpl implements StudioService {
add(SqlExplainResult.fail(studioExecuteDTO.getStatement(),"数据源不存在"));
}};
}
SqlExplainResult explainResult = Driver.build(dataBase.getDriverConfig()).connect().explain(studioExecuteDTO.getStatement());
Driver driver = Driver.build(dataBase.getDriverConfig()).connect();
SqlExplainResult explainResult = driver.explain(studioExecuteDTO.getStatement());
driver.close();
return new ArrayList<SqlExplainResult>(){{
add(explainResult);
}};
......
......@@ -13,8 +13,37 @@ public class AbstractResult {
protected boolean success;
protected LocalDateTime startTime;
protected LocalDateTime endTime;
protected String error;
public void setStartTime(LocalDateTime startTime){
this.startTime = startTime;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public LocalDateTime getStartTime() {
return startTime;
}
public LocalDateTime getEndTime() {
return endTime;
}
public void setEndTime(LocalDateTime endTime) {
this.endTime = endTime;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
}
......@@ -28,6 +28,11 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.dlink.metadata.driver;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.clickhouse.parser.ClickhouseStatementParser;
import com.dlink.assertion.Asserts;
import com.dlink.constant.CommonConstant;
import com.dlink.metadata.result.SelectResult;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import com.dlink.model.Table;
......@@ -10,13 +13,7 @@ import com.dlink.result.SqlExplainResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
......@@ -242,8 +239,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
}
@Override
public SelectResult query(String sql,Integer limit) {
SelectResult result = new SelectResult();
public JdbcSelectResult query(String sql, Integer limit) {
JdbcSelectResult result = new JdbcSelectResult();
List<HashMap<String, Object>> datas = new ArrayList<>();
List<Column> columns = new ArrayList<>();
List<String> columnNameList = new ArrayList<>();
......@@ -253,6 +250,11 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
try {
preparedStatement = conn.prepareStatement(sql);
results = preparedStatement.executeQuery();
if(Asserts.isNull(results)){
result.setSuccess(true);
close(preparedStatement, results);
return result;
}
ResultSetMetaData metaData = results.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
columnNameList.add(metaData.getColumnLabel(i));
......@@ -274,29 +276,37 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
break;
}
}
} catch (SQLException e) {
e.printStackTrace();
result.setSuccess(true);
} catch (Exception e) {
result.setError(e.getMessage());
result.setSuccess(false);
} finally {
close(preparedStatement, results);
result.setRowData(datas);
return result;
}
result.setRowData(datas);
return result;
}
@Override
public SqlExplainResult explain(String sql){
boolean correct = true;
String error = null;
String type = "Sql";
PreparedStatement preparedStatement = null;
ResultSet results = null;
try {
ClickhouseStatementParser parser = new ClickhouseStatementParser(sql);
SQLStatement sqlStatement = parser.parseStatement();
type = sqlStatement.getClass().getName();
if(!(sqlStatement instanceof SQLSelectStatement)){
return SqlExplainResult.success(type, sql, "");
}
preparedStatement = conn.prepareStatement("explain "+sql);
results = preparedStatement.executeQuery();
if(!results.next()){
correct = false;
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
correct = false;
error = e.getMessage();
} finally {
......
......@@ -2,12 +2,11 @@ package com.dlink.metadata.driver;
import com.dlink.assertion.Asserts;
import com.dlink.exception.MetaDataException;
import com.dlink.metadata.result.SelectResult;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import com.dlink.model.Table;
import com.dlink.result.SqlExplainResult;
import com.fasterxml.jackson.databind.JsonNode;
import sun.misc.Service;
import java.util.Iterator;
......@@ -90,7 +89,7 @@ public interface Driver {
boolean execute(String sql);
SelectResult query(String sql,Integer limit);
JdbcSelectResult query(String sql, Integer limit);
SqlExplainResult explain(String sql);
......
......@@ -16,7 +16,7 @@ import java.util.List;
*/
@Setter
@Getter
public class SelectResult extends AbstractResult implements IResult {
public class JdbcSelectResult extends AbstractResult implements IResult {
private List<String> columns;
private List<HashMap<String,Object>> rowData;
private Integer total;
......
package com.dlink.metadata.driver;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.clickhouse.parser.ClickhouseStatementParser;
import com.dlink.metadata.convert.ClickHouseTypeConvert;
import com.dlink.metadata.convert.ITypeConvert;
import com.dlink.metadata.query.ClickHouseQuery;
......@@ -52,10 +55,17 @@ public class ClickHouseDriver extends AbstractJdbcDriver {
public SqlExplainResult explain(String sql){
boolean correct = true;
String error = null;
String type = "ClickHouseSql";
StringBuilder explain = new StringBuilder();
PreparedStatement preparedStatement = null;
ResultSet results = null;
try {
ClickhouseStatementParser parser = new ClickhouseStatementParser(sql);
SQLStatement sqlStatement = parser.parseStatement();
type = sqlStatement.getClass().getSimpleName();
if(!(sqlStatement instanceof SQLSelectStatement)){
return SqlExplainResult.success(type, sql, explain.toString());
}
preparedStatement = conn.prepareStatement("explain "+sql);
results = preparedStatement.executeQuery();
while(results.next()){
......@@ -68,7 +78,7 @@ public class ClickHouseDriver extends AbstractJdbcDriver {
close(preparedStatement, results);
}
if(correct) {
return SqlExplainResult.success("ClickHouseSql", sql, explain.toString());
return SqlExplainResult.success(type, sql, explain.toString());
}else {
return SqlExplainResult.fail(sql,error);
}
......
......@@ -5,10 +5,8 @@ import com.dlink.metadata.convert.ITypeConvert;
import com.dlink.metadata.convert.MySqlTypeConvert;
import com.dlink.metadata.query.IDBQuery;
import com.dlink.metadata.query.MySqlQuery;
import com.dlink.metadata.result.SelectResult;
import com.dlink.model.Column;
import com.dlink.model.Table;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.ArrayList;
import java.util.List;
......
......@@ -2,7 +2,7 @@ package com.dlink.metadata;
import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.driver.DriverConfig;
import com.dlink.metadata.result.SelectResult;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import org.junit.Test;
......@@ -60,7 +60,7 @@ public class MysqlTest {
@Test
public void queryTest(){
Driver driver = getDriver();
SelectResult query = driver.query("select * from MENU",10);
JdbcSelectResult query = driver.query("select * from MENU",10);
System.out.println("end...");
}
}
......@@ -2,6 +2,7 @@ package com.dlink.metadata;
import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.driver.DriverConfig;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import org.junit.Test;
......@@ -16,14 +17,16 @@ import java.util.List;
**/
public class OracleTest {
private static final String IP = "127.0.0.1";
public Driver getDriver(){
DriverConfig config = new DriverConfig();
config.setType("Oracle");
config.setIp("10.1.51.25");
config.setIp(IP);
config.setPort(1521);
config.setUsername("cdr");
config.setPassword("cdr");
config.setUrl("jdbc:oracle:thin:@10.1.51.25:1521:orcl");
config.setUrl("jdbc:oracle:thin:@"+IP+":1521:orcl");
return Driver.build(config).connect();
}
......@@ -31,11 +34,11 @@ public class OracleTest {
public void connectTest(){
DriverConfig config = new DriverConfig();
config.setType("Oracle");
config.setIp("10.1.51.25");
config.setIp(IP);
config.setPort(1521);
config.setUsername("cdr");
config.setPassword("cdr");
config.setUrl("jdbc:oracle:thin:@10.1.51.25:1521:orcl");
config.setUrl("jdbc:oracle:thin:@"+IP+":1521:orcl");
String test = Driver.build(config).test();
System.out.println(test);
System.out.println("end...");
......@@ -58,7 +61,7 @@ public class OracleTest {
@Test
public void queryTest(){
Driver driver = getDriver();
List query = driver.query("select * from CDR.PAT_INFO where ROWNUM<10");
JdbcSelectResult selectResult = driver.query("select * from CDR.PAT_INFO where ROWNUM<10", 10);
System.out.println("end...");
}
}
......@@ -56,7 +56,7 @@ const StudioMsg = (props:any) => {
return (
<Typography>
{current.console.result.success?(current.task.dialect === DIALECT.SQL ? renderCommonSqlContent():
{current.console.result.startTime?(current.task.dialect === DIALECT.SQL ? renderCommonSqlContent():
renderFlinkSqlContent() ):<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
}
</Typography>
......
......@@ -33,7 +33,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot-dependencies.version>2.3.8.RELEASE</spring-boot-dependencies.version>
<hutool.version>5.1.4</hutool.version>
<druid-starter>1.1.22</druid-starter>
<druid-starter>1.2.8</druid-starter>
<mybatis-plus-boot-starter.version>3.4.0</mybatis-plus-boot-starter.version>
<lombok.version>1.18.16</lombok.version>
<jackjson.version>2.11.4</jackjson.version>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment