Commit bb7e5833 authored by wenmo's avatar wenmo

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

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