Commit 9aac98c6 authored by wenmo's avatar wenmo

优化元数据类型转换和连接管理

parent 2408187c
...@@ -18,6 +18,10 @@ Dinky(原 Dlink): ...@@ -18,6 +18,10 @@ Dinky(原 Dlink):
3.从 Dlink 改名为 Dinky 过渡平滑,更加形象的阐明了开源项目的目标,始终指引参与者们 “不忘初心,方得始终 ”。 3.从 Dlink 改名为 Dinky 过渡平滑,更加形象的阐明了开源项目的目标,始终指引参与者们 “不忘初心,方得始终 ”。
## 发展
[![Stargazers over time](https://starchart.cc/DataLinkDC/dlink.svg)](https://starchart.cc/DataLinkDC/dlink)
## 原理 ## 原理
![](https://gitee.com/DataLinkDC/dlink/raw/main/dlink-doc/images/main/dinky_principle.png) ![](https://gitee.com/DataLinkDC/dlink/raw/main/dlink-doc/images/main/dinky_principle.png)
......
...@@ -101,6 +101,10 @@ ...@@ -101,6 +101,10 @@
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.dlink</groupId> <groupId>com.dlink</groupId>
<artifactId>dlink-core</artifactId> <artifactId>dlink-core</artifactId>
...@@ -129,6 +133,11 @@ ...@@ -129,6 +133,11 @@
<groupId>com.dlink</groupId> <groupId>com.dlink</groupId>
<artifactId>dlink-metadata-mysql</artifactId> <artifactId>dlink-metadata-mysql</artifactId>
<version>0.6.0-SNAPSHOT</version> <version>0.6.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-doris</artifactId>
<version>0.6.0-SNAPSHOT</version>
</dependency>--> </dependency>-->
<!--<dependency> <!--<dependency>
<groupId>org.apache.flink</groupId> <groupId>org.apache.flink</groupId>
......
...@@ -48,7 +48,7 @@ public class DataBase extends SuperEntity { ...@@ -48,7 +48,7 @@ public class DataBase extends SuperEntity {
private LocalDateTime heartbeatTime; private LocalDateTime heartbeatTime;
public DriverConfig getDriverConfig(){ public DriverConfig getDriverConfig() {
return new DriverConfig(type,url,username,password); return new DriverConfig(getName(), type, url, username, password);
} }
} }
...@@ -35,4 +35,8 @@ public interface DataBaseService extends ISuperService<DataBase> { ...@@ -35,4 +35,8 @@ public interface DataBaseService extends ISuperService<DataBase> {
String getSqlCreate(Integer id, String schemaName, String tableName); String getSqlCreate(Integer id, String schemaName, String tableName);
SqlGeneration getSqlGeneration(Integer id, String schemaName, String tableName); SqlGeneration getSqlGeneration(Integer id, String schemaName, String tableName);
List<String> listEnabledFlinkWith();
String getEnabledFlinkWithSql();
} }
...@@ -6,13 +6,13 @@ import com.dlink.constant.CommonConstant; ...@@ -6,13 +6,13 @@ import com.dlink.constant.CommonConstant;
import com.dlink.db.service.impl.SuperServiceImpl; import com.dlink.db.service.impl.SuperServiceImpl;
import com.dlink.mapper.DataBaseMapper; import com.dlink.mapper.DataBaseMapper;
import com.dlink.metadata.driver.Driver; import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.driver.DriverConfig;
import com.dlink.model.*; import com.dlink.model.*;
import com.dlink.service.DataBaseService; import com.dlink.service.DataBaseService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -31,10 +31,10 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa ...@@ -31,10 +31,10 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
@Override @Override
public boolean checkHeartBeat(DataBase dataBase) { public boolean checkHeartBeat(DataBase dataBase) {
boolean isHealthy = Asserts.isEquals(CommonConstant.HEALTHY,Driver.build(dataBase.getDriverConfig()).test()); boolean isHealthy = Asserts.isEquals(CommonConstant.HEALTHY, Driver.build(dataBase.getDriverConfig()).test());
dataBase.setStatus(isHealthy); dataBase.setStatus(isHealthy);
dataBase.setHeartbeatTime(LocalDateTime.now()); dataBase.setHeartbeatTime(LocalDateTime.now());
if(isHealthy){ if (isHealthy) {
dataBase.setHealthTime(LocalDateTime.now()); dataBase.setHealthTime(LocalDateTime.now());
} }
return isHealthy; return isHealthy;
...@@ -42,21 +42,21 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa ...@@ -42,21 +42,21 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
@Override @Override
public boolean saveOrUpdateDataBase(DataBase dataBase) { public boolean saveOrUpdateDataBase(DataBase dataBase) {
if(Asserts.isNull(dataBase)){ if (Asserts.isNull(dataBase)) {
return false; return false;
} }
if(Asserts.isNull(dataBase.getId())){ if (Asserts.isNull(dataBase.getId())) {
checkHeartBeat(dataBase); checkHeartBeat(dataBase);
return save(dataBase); return save(dataBase);
}else{ } else {
DataBase dataBaseInfo = getById(dataBase.getId()); DataBase dataBaseInfo = getById(dataBase.getId());
if(Asserts.isNull(dataBase.getUrl())){ if (Asserts.isNull(dataBase.getUrl())) {
dataBase.setUrl(dataBaseInfo.getUrl()); dataBase.setUrl(dataBaseInfo.getUrl());
} }
if(Asserts.isNull(dataBase.getUsername())){ if (Asserts.isNull(dataBase.getUsername())) {
dataBase.setUsername(dataBaseInfo.getUsername()); dataBase.setUsername(dataBaseInfo.getUsername());
} }
if(Asserts.isNull(dataBase.getPassword())){ if (Asserts.isNull(dataBase.getPassword())) {
dataBase.setPassword(dataBaseInfo.getPassword()); dataBase.setPassword(dataBaseInfo.getPassword());
} }
checkHeartBeat(dataBase); checkHeartBeat(dataBase);
...@@ -66,14 +66,14 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa ...@@ -66,14 +66,14 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
@Override @Override
public List<DataBase> listEnabledAll() { public List<DataBase> listEnabledAll() {
return this.list(new QueryWrapper<DataBase>().eq("enabled",1)); return this.list(new QueryWrapper<DataBase>().eq("enabled", 1));
} }
@Override @Override
public List<Schema> getSchemasAndTables(Integer id) { public List<Schema> getSchemasAndTables(Integer id) {
DataBase dataBase = getById(id); DataBase dataBase = getById(id);
Asserts.checkNotNull(dataBase,"该数据源不存在!"); Asserts.checkNotNull(dataBase, "该数据源不存在!");
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
List<Schema> schemasAndTables = driver.getSchemasAndTables(); List<Schema> schemasAndTables = driver.getSchemasAndTables();
driver.close(); driver.close();
return schemasAndTables; return schemasAndTables;
...@@ -82,8 +82,8 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa ...@@ -82,8 +82,8 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
@Override @Override
public List<Column> listColumns(Integer id, String schemaName, String tableName) { public List<Column> listColumns(Integer id, String schemaName, String tableName) {
DataBase dataBase = getById(id); DataBase dataBase = getById(id);
Asserts.checkNotNull(dataBase,"该数据源不存在!"); Asserts.checkNotNull(dataBase, "该数据源不存在!");
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
List<Column> columns = driver.listColumns(schemaName, tableName); List<Column> columns = driver.listColumns(schemaName, tableName);
driver.close(); driver.close();
return columns; return columns;
...@@ -92,18 +92,18 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa ...@@ -92,18 +92,18 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
@Override @Override
public String getFlinkTableSql(Integer id, String schemaName, String tableName) { public String getFlinkTableSql(Integer id, String schemaName, String tableName) {
DataBase dataBase = getById(id); DataBase dataBase = getById(id);
Asserts.checkNotNull(dataBase,"该数据源不存在!"); Asserts.checkNotNull(dataBase, "该数据源不存在!");
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
List<Column> columns = driver.listColumns(schemaName, tableName); List<Column> columns = driver.listColumns(schemaName, tableName);
Table table = Table.build(tableName, schemaName, columns); Table table = Table.build(tableName, schemaName, columns);
return table.getFlinkTableSql(dataBase.getName(),driver.getFlinkColumnTypeConversion(),dataBase.getFlinkConfig()); return table.getFlinkTableSql(dataBase.getName(), dataBase.getFlinkConfig());
} }
@Override @Override
public String getSqlSelect(Integer id, String schemaName, String tableName) { public String getSqlSelect(Integer id, String schemaName, String tableName) {
DataBase dataBase = getById(id); DataBase dataBase = getById(id);
Asserts.checkNotNull(dataBase,"该数据源不存在!"); Asserts.checkNotNull(dataBase, "该数据源不存在!");
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
List<Column> columns = driver.listColumns(schemaName, tableName); List<Column> columns = driver.listColumns(schemaName, tableName);
Table table = Table.build(tableName, schemaName, columns); Table table = Table.build(tableName, schemaName, columns);
return table.getSqlSelect(dataBase.getName()); return table.getSqlSelect(dataBase.getName());
...@@ -112,8 +112,8 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa ...@@ -112,8 +112,8 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
@Override @Override
public String getSqlCreate(Integer id, String schemaName, String tableName) { public String getSqlCreate(Integer id, String schemaName, String tableName) {
DataBase dataBase = getById(id); DataBase dataBase = getById(id);
Asserts.checkNotNull(dataBase,"该数据源不存在!"); Asserts.checkNotNull(dataBase, "该数据源不存在!");
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
List<Column> columns = driver.listColumns(schemaName, tableName); List<Column> columns = driver.listColumns(schemaName, tableName);
Table table = Table.build(tableName, schemaName, columns); Table table = Table.build(tableName, schemaName, columns);
return driver.getCreateTableSql(table); return driver.getCreateTableSql(table);
...@@ -122,13 +122,31 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa ...@@ -122,13 +122,31 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
@Override @Override
public SqlGeneration getSqlGeneration(Integer id, String schemaName, String tableName) { public SqlGeneration getSqlGeneration(Integer id, String schemaName, String tableName) {
DataBase dataBase = getById(id); DataBase dataBase = getById(id);
Asserts.checkNotNull(dataBase,"该数据源不存在!"); Asserts.checkNotNull(dataBase, "该数据源不存在!");
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
Table table = driver.getTable(schemaName, tableName); Table table = driver.getTable(schemaName, tableName);
SqlGeneration sqlGeneration = new SqlGeneration(); SqlGeneration sqlGeneration = new SqlGeneration();
sqlGeneration.setFlinkSqlCreate(table.getFlinkTableSql(dataBase.getName(),driver.getFlinkColumnTypeConversion(),dataBase.getFlinkConfig())); sqlGeneration.setFlinkSqlCreate(table.getFlinkTableSql(dataBase.getName(), dataBase.getFlinkConfig()));
sqlGeneration.setSqlSelect(table.getSqlSelect(dataBase.getName())); sqlGeneration.setSqlSelect(table.getSqlSelect(dataBase.getName()));
sqlGeneration.setSqlCreate(driver.getCreateTableSql(table)); sqlGeneration.setSqlCreate(driver.getCreateTableSql(table));
return sqlGeneration; return sqlGeneration;
} }
@Override
public List<String> listEnabledFlinkWith() {
List<DataBase> dataBases = listEnabledAll();
List<String> list = new ArrayList<>();
for (DataBase dataBase : dataBases) {
if (Asserts.isNotNullString(dataBase.getFlinkConfig())) {
list.add(dataBase.getName() + ":=" + dataBase.getFlinkConfig() + ";\n");
}
}
return list;
}
@Override
public String getEnabledFlinkWithSql() {
List<String> list = listEnabledFlinkWith();
return StringUtils.join(list, "");
}
} }
...@@ -116,7 +116,7 @@ public class StudioServiceImpl implements StudioService { ...@@ -116,7 +116,7 @@ public class StudioServiceImpl implements StudioService {
result.setEndTime(LocalDateTime.now()); result.setEndTime(LocalDateTime.now());
return result; return result;
} }
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
JdbcSelectResult selectResult = driver.executeSql(sqlDTO.getStatement(),sqlDTO.getMaxRowNum()); JdbcSelectResult selectResult = driver.executeSql(sqlDTO.getStatement(),sqlDTO.getMaxRowNum());
driver.close(); driver.close();
result.setResult(selectResult); result.setResult(selectResult);
...@@ -174,7 +174,7 @@ public class StudioServiceImpl implements StudioService { ...@@ -174,7 +174,7 @@ public class StudioServiceImpl implements StudioService {
add(SqlExplainResult.fail(studioExecuteDTO.getStatement(),"数据源不存在")); add(SqlExplainResult.fail(studioExecuteDTO.getStatement(),"数据源不存在"));
}}; }};
} }
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
List<SqlExplainResult> sqlExplainResults = driver.explain(studioExecuteDTO.getStatement()); List<SqlExplainResult> sqlExplainResults = driver.explain(studioExecuteDTO.getStatement());
driver.close(); driver.close();
return sqlExplainResults; return sqlExplainResults;
......
...@@ -96,7 +96,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen ...@@ -96,7 +96,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
result.setEndTime(LocalDateTime.now()); result.setEndTime(LocalDateTime.now());
return result; return result;
} }
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig());
JdbcSelectResult selectResult = driver.executeSql(sqlDTO.getStatement(), sqlDTO.getMaxRowNum()); JdbcSelectResult selectResult = driver.executeSql(sqlDTO.getStatement(), sqlDTO.getMaxRowNum());
driver.close(); driver.close();
result.setResult(selectResult); result.setResult(selectResult);
......
...@@ -24,7 +24,7 @@ public class Column implements Serializable { ...@@ -24,7 +24,7 @@ public class Column implements Serializable {
private boolean autoIncrement; private boolean autoIncrement;
private String defaultValue; private String defaultValue;
private boolean isNullable; private boolean isNullable;
private String javaType; private ColumnType javaType;
private String columnFamily; private String columnFamily;
private Integer position; private Integer position;
private Integer precision; private Integer precision;
......
package com.dlink.model;
/**
* ColumnType
*
* @author wenmo
* @since 2022/2/17 10:59
**/
public enum ColumnType {
STRING("java.lang.String", "STRING"),
JAVA_LANG_BOOLEAN("java.lang.Boolean", "BOOLEAN"),
BOOLEAN("Boolean", "BOOLEAN NOT NULL"),
JAVA_LANG_BYTE("java.lang.Byte", "TINYINT"),
BYTE("byte", "TINYINT NOT NULL"),
JAVA_LANG_SHORT("java.lang.Short", "SMALLINT"),
SHORT("short", "SMALLINT NOT NULL"),
INTEGER("java.lang.Integer", "INT"),
INT("int", "INT NOT NULL"),
JAVA_LANG_LONG("java.lang.Long", "BIGINT"),
LONG("long", "BIGINT NOT NULL"),
JAVA_LANG_FLOAT("java.lang.Float", "FLOAT"),
FLOAT("float", "FLOAT NOT NULL"),
JAVA_LANG_DOUBLE("java.lang.Double", "DOUBLE"),
DOUBLE("double", "DOUBLE NOT NULL"),
DATE("java.sql.Date", "DATE"),
LOCALDATE("java.time.LocalDate", "DATE"),
TIME("java.sql.Time", "TIME(0)"),
LOCALTIME("java.time.LocalTime", "TIME(9)"),
TIMESTAMP("java.sql.Timestamp", "TIMESTAMP(9)"),
LOCALDATETIME("java.time.LocalDateTime", "TIMESTAMP(9)"),
OFFSETDATETIME("java.time.OffsetDateTime", "TIMESTAMP(9) WITH TIME ZONE"),
INSTANT("java.time.Instant", "TIMESTAMP_LTZ(9)"),
DURATION("java.time.Duration", "INVERVAL SECOND(9)"),
PERIOD("java.time.Period", "INTERVAL YEAR(4) TO MONTH"),
DECIMAL("java.math.BigDecimal", "DECIMAL"),
BYTES("byte[]", "BYTES"),
T("T[]", "ARRAY<T>"),
MAP("java.util.Map<K, V>", "MAP<K, V>");
private String javaType;
private String flinkType;
ColumnType(String javaType, String flinkType) {
this.javaType = javaType;
this.flinkType = flinkType;
}
public String getJavaType() {
return javaType;
}
public String getFlinkType() {
return flinkType;
}
}
...@@ -71,13 +71,12 @@ public class Table implements Serializable, Comparable<Table> { ...@@ -71,13 +71,12 @@ public class Table implements Serializable, Comparable<Table> {
return tableWithSql; return tableWithSql;
} }
public String getFlinkTableSql(String catalogName, Map<String, String> typeConversion, String flinkConfig) { public String getFlinkTableSql(String catalogName, String flinkConfig) {
StringBuilder sb = new StringBuilder("CREATE TABLE "); StringBuilder sb = new StringBuilder("CREATE TABLE ");
sb.append(catalogName + "." + schema + "." + name + " (\n"); sb.append(catalogName + "." + schema + "." + name + " (\n");
List<String> pks = new ArrayList<>(); List<String> pks = new ArrayList<>();
for (int i = 0; i < columns.size(); i++) { for (int i = 0; i < columns.size(); i++) {
String type = typeConversion.containsKey(columns.get(i).getType()) ? String type = columns.get(i).getJavaType().getFlinkType();
typeConversion.get(columns.get(i).getType()) : "STRING";
sb.append(" "); sb.append(" ");
if (i > 0) { if (i > 0) {
sb.append(","); sb.append(",");
......
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.rules.IColumnType;
import com.dlink.model.Column; import com.dlink.model.Column;
import com.dlink.model.ColumnType;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -14,17 +14,13 @@ import java.sql.SQLException; ...@@ -14,17 +14,13 @@ import java.sql.SQLException;
**/ **/
public interface ITypeConvert { public interface ITypeConvert {
default IColumnType convert(Column column) {
return convert(column.getType());
}
default String convertToDB(Column column) { default String convertToDB(Column column) {
return convertToDB(column.getJavaType()); return convertToDB(column.getJavaType());
} }
IColumnType convert(String columnType); ColumnType convert(Column column);
String convertToDB(String columnType); String convertToDB(ColumnType columnType);
default Object convertValue(ResultSet results, String columnName, String javaType) throws SQLException { default Object convertValue(ResultSet results, String columnName, String javaType) throws SQLException {
switch (javaType.toLowerCase()) { switch (javaType.toLowerCase()) {
......
...@@ -17,8 +17,6 @@ import java.util.stream.Collectors; ...@@ -17,8 +17,6 @@ import java.util.stream.Collectors;
*/ */
public abstract class AbstractDriver implements Driver { public abstract class AbstractDriver implements Driver {
// public Logger logger = LoggerFactory.getLogger(this.getClass());
protected DriverConfig config; protected DriverConfig config;
public abstract IDBQuery getDBQuery(); public abstract IDBQuery getDBQuery();
...@@ -34,6 +32,10 @@ public abstract class AbstractDriver implements Driver { ...@@ -34,6 +32,10 @@ public abstract class AbstractDriver implements Driver {
return this; return this;
} }
public boolean isHealth(){
return false;
}
public List<Schema> getSchemasAndTables(){ public List<Schema> getSchemasAndTables(){
return listSchemas().stream().peek(schema -> schema.setTables(listTables(schema.getName()))).sorted().collect(Collectors.toList()); return listSchemas().stream().peek(schema -> schema.setTables(listTables(schema.getName()))).sorted().collect(Collectors.toList());
} }
......
...@@ -64,6 +64,19 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -64,6 +64,19 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
return this; return this;
} }
@Override
public boolean isHealth(){
try {
if(Asserts.isNotNull(conn)){
return !conn.isClosed();
}
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override @Override
public void close() { public void close() {
try { try {
...@@ -165,7 +178,6 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -165,7 +178,6 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
field.setKeyFlag(Asserts.isNotNullString(key) && Asserts.isEqualsIgnoreCase("PRI",key)); field.setKeyFlag(Asserts.isNotNullString(key) && Asserts.isEqualsIgnoreCase("PRI",key));
field.setName(columnName); field.setName(columnName);
field.setType(results.getString(dbQuery.columnType())); field.setType(results.getString(dbQuery.columnType()));
field.setJavaType(getTypeConvert().convert(field.getType()).getType());
String columnComment=results.getString(dbQuery.columnComment()).replaceAll("\"|'",""); String columnComment=results.getString(dbQuery.columnComment()).replaceAll("\"|'","");
field.setComment(columnComment); field.setComment(columnComment);
...@@ -177,6 +189,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -177,6 +189,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
field.setPrecision(results.getInt(dbQuery.precision())); field.setPrecision(results.getInt(dbQuery.precision()));
field.setScale(results.getInt(dbQuery.scale())); field.setScale(results.getInt(dbQuery.scale()));
field.setAutoIncrement(Asserts.isEqualsIgnoreCase(results.getString(dbQuery.autoIncrement()),"auto_increment")); field.setAutoIncrement(Asserts.isEqualsIgnoreCase(results.getString(dbQuery.autoIncrement()),"auto_increment"));
field.setJavaType(getTypeConvert().convert(field));
columns.add(field); columns.add(field);
} }
} catch (SQLException e) { } catch (SQLException e) {
...@@ -262,11 +275,10 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -262,11 +275,10 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
@Override @Override
public boolean execute(String sql) throws Exception { public boolean execute(String sql) throws Exception {
Asserts.checkNullString(sql, "Sql 语句为空"); Asserts.checkNullString(sql, "Sql 语句为空");
boolean res = false;
try (Statement statement = conn.createStatement()) { try (Statement statement = conn.createStatement()) {
res = statement.execute(sql); statement.execute(sql);
} }
return res; return true;
} }
@Override @Override
...@@ -305,7 +317,9 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -305,7 +317,9 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
Column column = new Column(); Column column = new Column();
column.setName(metaData.getColumnLabel(i)); column.setName(metaData.getColumnLabel(i));
column.setType(metaData.getColumnTypeName(i)); column.setType(metaData.getColumnTypeName(i));
column.setJavaType(getTypeConvert().convert(metaData.getColumnTypeName(i)).getType()); column.setAutoIncrement(metaData.isAutoIncrement(i));
column.setNullable(metaData.isNullable(i)==0?false:true);
column.setJavaType(getTypeConvert().convert(column));
columns.add(column); columns.add(column);
} }
result.setColumns(columnNameList); result.setColumns(columnNameList);
...@@ -351,9 +365,10 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -351,9 +365,10 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
}else { }else {
try { try {
resList.add(execute(item.toString())); execute(item.toString());
resList.add(1);
} catch (Exception e) { } catch (Exception e) {
resList.add(false); resList.add(0);
result.setStatusList(resList); result.setStatusList(resList);
result.error(LogUtil.getError(e)); result.error(LogUtil.getError(e));
return result; return result;
......
...@@ -9,7 +9,6 @@ import com.dlink.model.Table; ...@@ -9,7 +9,6 @@ import com.dlink.model.Table;
import com.dlink.result.SqlExplainResult; import com.dlink.result.SqlExplainResult;
import sun.misc.Service; import sun.misc.Service;
import java.sql.SQLException;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -36,11 +35,20 @@ public interface Driver { ...@@ -36,11 +35,20 @@ public interface Driver {
} }
static Driver build(DriverConfig config) { static Driver build(DriverConfig config) {
String key = config.getName();
if (DriverPool.exist(key)) {
Driver driver = DriverPool.get(key);
if (driver.isHealth()) {
return driver;
}
}
Optional<Driver> optionalDriver = Driver.get(config); Optional<Driver> optionalDriver = Driver.get(config);
if (!optionalDriver.isPresent()) { if (!optionalDriver.isPresent()) {
throw new MetaDataException("不支持数据源类型【" + config.getType() + "】"); throw new MetaDataException("不支持数据源类型【" + config.getType() + "】,请在 lib 下添加扩展依赖");
} }
return optionalDriver.get(); Driver driver = optionalDriver.get().connect();
DriverPool.push(key, driver);
return driver;
} }
Driver setDriverConfig(DriverConfig config); Driver setDriverConfig(DriverConfig config);
...@@ -53,6 +61,8 @@ public interface Driver { ...@@ -53,6 +61,8 @@ public interface Driver {
String test(); String test();
boolean isHealth();
Driver connect(); Driver connect();
void close(); void close();
...@@ -101,5 +111,5 @@ public interface Driver { ...@@ -101,5 +111,5 @@ public interface Driver {
List<SqlExplainResult> explain(String sql); List<SqlExplainResult> explain(String sql);
Map<String,String> getFlinkColumnTypeConversion(); Map<String, String> getFlinkColumnTypeConversion();
} }
...@@ -14,6 +14,7 @@ import lombok.Setter; ...@@ -14,6 +14,7 @@ import lombok.Setter;
@Setter @Setter
public class DriverConfig { public class DriverConfig {
private String name;
private String type; private String type;
private String driverClassName; private String driverClassName;
private String ip; private String ip;
...@@ -25,7 +26,8 @@ public class DriverConfig { ...@@ -25,7 +26,8 @@ public class DriverConfig {
public DriverConfig() { public DriverConfig() {
} }
public DriverConfig(String type, String url, String username, String password) { public DriverConfig(String name, String type, String url, String username, String password) {
this.name = name;
this.type = type; this.type = type;
this.url = url; this.url = url;
this.username = username; this.username = username;
......
package com.dlink.metadata.driver;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* DriverPool
*
* @author wenmo
* @since 2022/2/17 15:29
**/
public class DriverPool {
private static volatile Map<String, Driver> driverMap = new ConcurrentHashMap<>();
public static boolean exist(String key) {
if (driverMap.containsKey(key)) {
return true;
}
return false;
}
public static Integer push(String key, Driver gainer) {
driverMap.put(key, gainer);
return driverMap.size();
}
public static Integer remove(String key) {
driverMap.remove(key);
return driverMap.size();
}
public static Driver get(String key) {
return driverMap.get(key);
}
}
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.rules.IColumnType; import com.dlink.assertion.Asserts;
import com.dlink.model.Column;
import com.dlink.model.ColumnType;
/** /**
* ClickHouseTypeConvert * ClickHouseTypeConvert
...@@ -9,13 +11,75 @@ import com.dlink.metadata.rules.IColumnType; ...@@ -9,13 +11,75 @@ import com.dlink.metadata.rules.IColumnType;
* @since 2021/7/21 17:15 * @since 2021/7/21 17:15
**/ **/
public class ClickHouseTypeConvert implements ITypeConvert { public class ClickHouseTypeConvert implements ITypeConvert {
// Use mysql now,and welcome to fix it.
@Override @Override
public IColumnType convert(String columnType) { public ColumnType convert(Column column) {
return null; if (Asserts.isNull(column)) {
return ColumnType.STRING;
}
String t = column.getType().toLowerCase();
if (t.contains("tinyint")) {
return ColumnType.BYTE;
} else if (t.contains("smallint") || t.contains("tinyint unsigned")) {
return ColumnType.SHORT;
} else if (t.contains("bigint unsigned") || t.contains("numeric") || t.contains("decimal")) {
return ColumnType.DECIMAL;
} else if (t.contains("bigint") || t.contains("int unsigned")) {
return ColumnType.LONG;
} else if (t.contains("float")) {
return ColumnType.FLOAT;
} else if (t.contains("double")) {
return ColumnType.DOUBLE;
} else if (t.contains("boolean") || t.contains("tinyint(1)")) {
return ColumnType.BOOLEAN;
} else if (t.contains("datetime")) {
return ColumnType.TIMESTAMP;
} else if (t.contains("date")) {
return ColumnType.DATE;
} else if (t.contains("time")) {
return ColumnType.TIME;
} else if (t.contains("char") || t.contains("text")) {
return ColumnType.STRING;
} else if (t.contains("binary") || t.contains("blob")) {
return ColumnType.BYTES;
} else if (t.contains("int") || t.contains("mediumint") || t.contains("smallint unsigned")) {
return ColumnType.INTEGER;
}
return ColumnType.STRING;
} }
@Override @Override
public String convertToDB(String columnType) { public String convertToDB(ColumnType columnType) {
return null; switch (columnType) {
case STRING:
return "varchar";
case BYTE:
return "tinyint";
case SHORT:
return "smallint";
case DECIMAL:
return "decimal";
case LONG:
return "bigint";
case FLOAT:
return "float";
case DOUBLE:
return "double";
case BOOLEAN:
return "boolean";
case TIMESTAMP:
return "datetime";
case DATE:
return "date";
case TIME:
return "time";
case BYTES:
return "binary";
case INTEGER:
return "int";
default:
return "varchar";
}
} }
} }
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType; import com.dlink.assertion.Asserts;
import com.dlink.metadata.rules.IColumnType; import com.dlink.model.Column;
import com.dlink.model.ColumnType;
public class DorisTypeConvert implements ITypeConvert{ public class DorisTypeConvert implements ITypeConvert {
@Override @Override
public IColumnType convert(String columnType) { public ColumnType convert(Column column) {
String t = columnType.toLowerCase(); if (Asserts.isNull(column)) {
return ColumnType.STRING;
}
String t = column.getType().toLowerCase();
if (t.contains("char")) { if (t.contains("char")) {
return DbColumnType.STRING; return ColumnType.STRING;
} else if (t.contains("boolean")) {
if (column.isNullable()) {
return ColumnType.JAVA_LANG_BOOLEAN;
}
return ColumnType.BOOLEAN;
} else if (t.contains("tinyint")) {
if (column.isNullable()) {
return ColumnType.JAVA_LANG_BYTE;
}
return ColumnType.BYTE;
} else if (t.contains("smallint")) {
if (column.isNullable()) {
return ColumnType.JAVA_LANG_SHORT;
}
return ColumnType.SHORT;
} else if (t.contains("bigint")) { } else if (t.contains("bigint")) {
return DbColumnType.LONG; if (column.isNullable()) {
} else if (t.contains("tinyint(1)")) { return ColumnType.JAVA_LANG_LONG;
return DbColumnType.BOOLEAN; }
return ColumnType.LONG;
} else if (t.contains("largeint")) {
return ColumnType.STRING;
} else if (t.contains("int")) { } else if (t.contains("int")) {
return DbColumnType.INTEGER; if (column.isNullable()) {
} else if (t.contains("text")) { return ColumnType.INTEGER;
return DbColumnType.STRING; }
} else if (t.contains("bit")) { return ColumnType.INT;
return DbColumnType.BOOLEAN;
} else if (t.contains("decimal")) {
return DbColumnType.BIG_DECIMAL;
} else if (t.contains("clob")) {
return DbColumnType.CLOB;
} else if (t.contains("blob")) {
return DbColumnType.BLOB;
} else if (t.contains("binary")) {
return DbColumnType.BYTE_ARRAY;
} else if (t.contains("float")) { } else if (t.contains("float")) {
return DbColumnType.FLOAT; if (column.isNullable()) {
return ColumnType.JAVA_LANG_FLOAT;
}
return ColumnType.FLOAT;
} else if (t.contains("double")) { } else if (t.contains("double")) {
return DbColumnType.DOUBLE; if (column.isNullable()) {
} else if (t.contains("json") || t.contains("enum")) { return ColumnType.JAVA_LANG_DOUBLE;
return DbColumnType.STRING; }
} else if (t.contains("date") || t.contains("time") || t.contains("year")) { return ColumnType.DOUBLE;
return DbColumnType.DATE; } else if (t.contains("date")) {
return ColumnType.STRING;
} else if (t.contains("datetime")) {
return ColumnType.STRING;
} else if (t.contains("decimal")) {
return ColumnType.DECIMAL;
} else if (t.contains("time")) {
return ColumnType.DOUBLE;
} }
return DbColumnType.STRING; return ColumnType.STRING;
} }
@Override @Override
public String convertToDB(String columnType) { public String convertToDB(ColumnType columnType) {
switch (columnType.toLowerCase()){ switch (columnType) {
case "string": case STRING:
return "varchar(255)"; return "varchar";
case "boolean": case BOOLEAN:
return "tinyint(1)"; case JAVA_LANG_BOOLEAN:
case "int": return "boolean";
case "integer": case BYTE:
return "int"; case JAVA_LANG_BYTE:
case "double": return "tinyint";
return "double"; case SHORT:
case "float": case JAVA_LANG_SHORT:
return "smallint";
case LONG:
case JAVA_LANG_LONG:
return "bigint";
case FLOAT:
case JAVA_LANG_FLOAT:
return "float"; return "float";
case "date": case DOUBLE:
return "datetime(0)"; case JAVA_LANG_DOUBLE:
return "double";
case DECIMAL:
return "decimal";
case INT:
case INTEGER:
return "int";
default: default:
return "varchar(255)"; return "varchar";
} }
} }
} }
...@@ -8,7 +8,7 @@ import com.dlink.metadata.query.IDBQuery; ...@@ -8,7 +8,7 @@ import com.dlink.metadata.query.IDBQuery;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class DorisDriver extends AbstractJdbcDriver{ public class DorisDriver extends AbstractJdbcDriver {
@Override @Override
public IDBQuery getDBQuery() { public IDBQuery getDBQuery() {
return new DorisQuery(); return new DorisQuery();
...@@ -35,7 +35,16 @@ public class DorisDriver extends AbstractJdbcDriver{ ...@@ -35,7 +35,16 @@ public class DorisDriver extends AbstractJdbcDriver{
} }
@Override @Override
public Map<String,String> getFlinkColumnTypeConversion(){ public Map<String, String> getFlinkColumnTypeConversion() {
return new HashMap<>(); HashMap<String, String> map = new HashMap<>();
map.put("BOOLEAN", "BOOLEAN");
map.put("TINYINT", "TINYINT");
map.put("SMALLINT", "SMALLINT");
map.put("INT", "INT");
map.put("VARCHAR", "STRING");
map.put("TEXY", "STRING");
map.put("INT", "INT");
map.put("DATETIME", "TIMESTAMP");
return map;
} }
} }
...@@ -15,8 +15,9 @@ import java.util.List; ...@@ -15,8 +15,9 @@ import java.util.List;
public class DorisTest { public class DorisTest {
private Driver driver; private Driver driver;
@Before @Before
public void init(){ public void init() {
DriverConfig config = new DriverConfig(); DriverConfig config = new DriverConfig();
config.setType("Doris"); config.setType("Doris");
config.setIp("192.168.68.133"); config.setIp("192.168.68.133");
...@@ -25,8 +26,8 @@ public class DorisTest { ...@@ -25,8 +26,8 @@ public class DorisTest {
config.setPassword("123456"); config.setPassword("123456");
config.setUrl("jdbc:mysql://192.168.68.133:9030/test"); config.setUrl("jdbc:mysql://192.168.68.133:9030/test");
try { try {
driver = Driver.build(config).connect(); driver = Driver.build(config);
}catch (Exception e){ } catch (Exception e) {
System.err.println("连接创建失败"); System.err.println("连接创建失败");
e.printStackTrace(); e.printStackTrace();
} }
...@@ -46,7 +47,7 @@ public class DorisTest { ...@@ -46,7 +47,7 @@ public class DorisTest {
} }
@Test @Test
public void testSchema(){ public void testSchema() {
//schema && table //schema && table
List<Schema> schemasAndTables = driver.getSchemasAndTables(); List<Schema> schemasAndTables = driver.getSchemasAndTables();
for (Schema schemasAndTable : schemasAndTables) { for (Schema schemasAndTable : schemasAndTables) {
...@@ -58,15 +59,16 @@ public class DorisTest { ...@@ -58,15 +59,16 @@ public class DorisTest {
} }
@Test @Test
public void testColumns(){ public void testColumns() {
// columns // columns
List<Column> columns = driver.listColumns("test", "scoreinfo"); List<Column> columns = driver.listColumns("test", "scoreinfo");
for (Column column : columns) { for (Column column : columns) {
System.out.println(column.getName() + " " + column.getType() + column.getComment() ); System.out.println(column.getName() + " " + column.getType() + column.getComment());
} }
} }
@Test @Test
public void query(){ public void query() {
JdbcSelectResult selectResult = driver.query("select * from scoreinfo ", 10); JdbcSelectResult selectResult = driver.query("select * from scoreinfo ", 10);
List<LinkedHashMap<String, Object>> rowData = selectResult.getRowData(); List<LinkedHashMap<String, Object>> rowData = selectResult.getRowData();
for (LinkedHashMap<String, Object> rowDatum : rowData) { for (LinkedHashMap<String, Object> rowDatum : rowData) {
......
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType; import com.dlink.assertion.Asserts;
import com.dlink.metadata.rules.IColumnType; import com.dlink.model.Column;
import com.dlink.model.ColumnType;
/** /**
* MySqlTypeConvert * MySqlTypeConvert
...@@ -9,60 +10,74 @@ import com.dlink.metadata.rules.IColumnType; ...@@ -9,60 +10,74 @@ import com.dlink.metadata.rules.IColumnType;
* @author wenmo * @author wenmo
* @since 2021/7/20 15:21 * @since 2021/7/20 15:21
**/ **/
public class MySqlTypeConvert implements ITypeConvert{ public class MySqlTypeConvert implements ITypeConvert {
@Override @Override
public IColumnType convert(String columnType) { public ColumnType convert(Column column) {
String t = columnType.toLowerCase(); if (Asserts.isNull(column)) {
if (t.contains("char")) { return ColumnType.STRING;
return DbColumnType.STRING; }
} else if (t.contains("bigint")) { String t = column.getType().toLowerCase();
return DbColumnType.LONG; if (t.contains("tinyint")) {
} else if (t.contains("tinyint(1)")) { return ColumnType.BYTE;
return DbColumnType.BOOLEAN; } else if (t.contains("smallint") || t.contains("tinyint unsigned")) {
} else if (t.contains("int")) { return ColumnType.SHORT;
return DbColumnType.INTEGER; } else if (t.contains("bigint unsigned") || t.contains("numeric") || t.contains("decimal")) {
} else if (t.contains("text")) { return ColumnType.DECIMAL;
return DbColumnType.STRING; } else if (t.contains("bigint") || t.contains("int unsigned")) {
} else if (t.contains("bit")) { return ColumnType.LONG;
return DbColumnType.BOOLEAN;
} else if (t.contains("decimal")) {
return DbColumnType.BIG_DECIMAL;
} else if (t.contains("clob")) {
return DbColumnType.CLOB;
} else if (t.contains("blob")) {
return DbColumnType.BLOB;
} else if (t.contains("binary")) {
return DbColumnType.BYTE_ARRAY;
} else if (t.contains("float")) { } else if (t.contains("float")) {
return DbColumnType.FLOAT; return ColumnType.FLOAT;
} else if (t.contains("double")) { } else if (t.contains("double")) {
return DbColumnType.DOUBLE; return ColumnType.DOUBLE;
} else if (t.contains("json") || t.contains("enum")) { } else if (t.contains("boolean") || t.contains("tinyint(1)")) {
return DbColumnType.STRING; return ColumnType.BOOLEAN;
} else if (t.contains("date") || t.contains("time") || t.contains("year")) { } else if (t.contains("datetime")) {
return DbColumnType.DATE; return ColumnType.TIMESTAMP;
} else if (t.contains("date")) {
return ColumnType.DATE;
} else if (t.contains("time")) {
return ColumnType.TIME;
} else if (t.contains("char") || t.contains("text")) {
return ColumnType.STRING;
} else if (t.contains("binary") || t.contains("blob")) {
return ColumnType.BYTES;
} else if (t.contains("int") || t.contains("mediumint") || t.contains("smallint unsigned")) {
return ColumnType.INTEGER;
} }
return DbColumnType.STRING; return ColumnType.STRING;
} }
@Override @Override
public String convertToDB(String columnType) { public String convertToDB(ColumnType columnType) {
switch (columnType.toLowerCase()){ switch (columnType) {
case "string": case STRING:
return "varchar(255)"; return "varchar";
case "boolean": case BYTE:
return "tinyint(1)"; return "tinyint";
case "int": case SHORT:
case "integer": return "smallint";
return "int"; case DECIMAL:
case "double": return "decimal";
return "double"; case LONG:
case "float": return "bigint";
case FLOAT:
return "float"; return "float";
case "date": case DOUBLE:
return "datetime(0)"; return "double";
case BOOLEAN:
return "boolean";
case TIMESTAMP:
return "datetime";
case DATE:
return "date";
case TIME:
return "time";
case BYTES:
return "binary";
case INTEGER:
return "int";
default: default:
return "varchar(255)"; return "varchar";
} }
} }
} }
...@@ -42,12 +42,12 @@ public class MySqlDriver extends AbstractJdbcDriver { ...@@ -42,12 +42,12 @@ public class MySqlDriver extends AbstractJdbcDriver {
} }
@Override @Override
public Map<String,String> getFlinkColumnTypeConversion(){ public Map<String, String> getFlinkColumnTypeConversion() {
HashMap<String,String> map = new HashMap<>(); HashMap<String, String> map = new HashMap<>();
map.put("varchar","STRING"); map.put("VARCHAR", "STRING");
map.put("text","STRING"); map.put("TEXY", "STRING");
map.put("int","INT"); map.put("INT", "INT");
map.put("datetime","TIMESTAMP"); map.put("DATETIME", "TIMESTAMP");
return map; return map;
} }
} }
...@@ -18,49 +18,50 @@ import java.util.List; ...@@ -18,49 +18,50 @@ import java.util.List;
public class MysqlTest { public class MysqlTest {
private static final String IP = "127.0.0.1"; 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("Mysql"); config.setType("Mysql");
config.setIp(IP); config.setIp(IP);
config.setPort(3306); config.setPort(3306);
config.setUsername("dca"); config.setUsername("dca");
config.setPassword("dca"); config.setPassword("dca");
config.setUrl("jdbc:mysql://"+IP+":3306/dca?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true"); config.setUrl("jdbc:mysql://" + IP + ":3306/dca?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true");
return Driver.build(config).connect(); return Driver.build(config);
} }
@Test @Test
public void connectTest(){ public void connectTest() {
DriverConfig config = new DriverConfig(); DriverConfig config = new DriverConfig();
config.setType("Mysql"); config.setType("Mysql");
config.setIp(IP); config.setIp(IP);
config.setPort(3306); config.setPort(3306);
config.setUsername("dca"); config.setUsername("dca");
config.setPassword("dca"); config.setPassword("dca");
config.setUrl("jdbc:mysql://"+IP+":3306/dca?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true"); config.setUrl("jdbc:mysql://" + IP + ":3306/dca?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true");
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...");
} }
@Test @Test
public void schemaTest(){ public void schemaTest() {
Driver driver = getDriver(); Driver driver = getDriver();
List<Schema> schemasAndTables = driver.getSchemasAndTables(); List<Schema> schemasAndTables = driver.getSchemasAndTables();
System.out.println("end..."); System.out.println("end...");
} }
@Test @Test
public void columnTest(){ public void columnTest() {
Driver driver = getDriver(); Driver driver = getDriver();
List<Column> columns = driver.listColumns("dca", "MENU"); List<Column> columns = driver.listColumns("dca", "MENU");
System.out.println("end..."); System.out.println("end...");
} }
@Test @Test
public void queryTest(){ public void queryTest() {
Driver driver = getDriver(); Driver driver = getDriver();
JdbcSelectResult query = driver.query("select * from MENU",10); JdbcSelectResult query = driver.query("select * from MENU", 10);
System.out.println("end..."); System.out.println("end...");
} }
} }
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType; import com.dlink.assertion.Asserts;
import com.dlink.metadata.rules.IColumnType; import com.dlink.model.Column;
import com.dlink.model.ColumnType;
/** /**
* OracleTypeConvert * OracleTypeConvert
...@@ -11,48 +12,53 @@ import com.dlink.metadata.rules.IColumnType; ...@@ -11,48 +12,53 @@ import com.dlink.metadata.rules.IColumnType;
**/ **/
public class OracleTypeConvert implements ITypeConvert { public class OracleTypeConvert implements ITypeConvert {
@Override @Override
public IColumnType convert(String columnType) { public ColumnType convert(Column column) {
String t = columnType.toLowerCase(); if (Asserts.isNull(column)) {
return ColumnType.STRING;
}
String t = column.getType().toLowerCase();
if (t.contains("char")) { if (t.contains("char")) {
return DbColumnType.STRING; return ColumnType.STRING;
} else if (t.contains("date") || t.contains("timestamp")) { } else if (t.contains("date")) {
return DbColumnType.DATE; return ColumnType.DATE;
} else if (t.contains("timestamp")) {
return ColumnType.TIMESTAMP;
} else if (t.contains("number")) { } else if (t.contains("number")) {
if (t.matches("number\\(+\\d\\)")) { if (t.matches("number\\(+\\d\\)")) {
return DbColumnType.INTEGER; return ColumnType.INTEGER;
} else if (t.matches("number\\(+\\d{2}+\\)")) { } else if (t.matches("number\\(+\\d{2}+\\)")) {
return DbColumnType.LONG; return ColumnType.LONG;
} }
return DbColumnType.BIG_DECIMAL; return ColumnType.DECIMAL;
} else if (t.contains("float")) { } else if (t.contains("float")) {
return DbColumnType.FLOAT; return ColumnType.FLOAT;
} else if (t.contains("clob")) { } else if (t.contains("clob")) {
return DbColumnType.STRING; return ColumnType.STRING;
} else if (t.contains("blob")) { } else if (t.contains("blob")) {
return DbColumnType.BLOB; return ColumnType.BYTES;
} else if (t.contains("binary")) {
return DbColumnType.BYTE_ARRAY;
} else if (t.contains("raw")) {
return DbColumnType.BYTE_ARRAY;
} }
return DbColumnType.STRING; return ColumnType.STRING;
} }
@Override @Override
public String convertToDB(String columnType) { public String convertToDB(ColumnType columnType) {
switch (columnType.toLowerCase()){ switch (columnType) {
case "string": case STRING:
return "varchar(255)"; return "varchar";
case "boolean": case DATE:
case "int":
case "integer":
case "double":
case "float":
return "number";
case "date":
return "date"; return "date";
case TIMESTAMP:
return "timestamp";
case INTEGER:
case LONG:
case DECIMAL:
return "number";
case FLOAT:
return "float";
case BYTES:
return "blob";
default: default:
return "varchar(255)"; return "varchar";
} }
} }
} }
...@@ -56,7 +56,7 @@ public class OracleDriver extends AbstractJdbcDriver { ...@@ -56,7 +56,7 @@ public class OracleDriver extends AbstractJdbcDriver {
if(i>0){ if(i>0){
sb.append(","); sb.append(",");
} }
sb.append(columns.get(i).getName() + " " + getTypeConvert().convertToDB(columns.get(i).getType())); sb.append(columns.get(i).getName() + " " + getTypeConvert().convertToDB(columns.get(i)));
if(columns.get(i).isNullable()){ if(columns.get(i).isNullable()){
sb.append(" NOT NULL"); sb.append(" NOT NULL");
} }
......
...@@ -19,47 +19,47 @@ public class OracleTest { ...@@ -19,47 +19,47 @@ public class OracleTest {
private static final String IP = "127.0.0.1"; 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(IP); 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:@"+IP+":1521:orcl"); config.setUrl("jdbc:oracle:thin:@" + IP + ":1521:orcl");
return Driver.build(config).connect(); return Driver.build(config);
} }
@Test @Test
public void connectTest(){ public void connectTest() {
DriverConfig config = new DriverConfig(); DriverConfig config = new DriverConfig();
config.setType("Oracle"); config.setType("Oracle");
config.setIp(IP); 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:@"+IP+":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...");
} }
@Test @Test
public void schemaTest(){ public void schemaTest() {
Driver driver = getDriver(); Driver driver = getDriver();
List<Schema> schemasAndTables = driver.getSchemasAndTables(); List<Schema> schemasAndTables = driver.getSchemasAndTables();
System.out.println("end..."); System.out.println("end...");
} }
@Test @Test
public void columnTest(){ public void columnTest() {
Driver driver = getDriver(); Driver driver = getDriver();
List<Column> columns = driver.listColumns("CDR", "PAT_INFO"); List<Column> columns = driver.listColumns("CDR", "PAT_INFO");
System.out.println("end..."); System.out.println("end...");
} }
@Test @Test
public void queryTest(){ public void queryTest() {
Driver driver = getDriver(); Driver driver = getDriver();
JdbcSelectResult selectResult = driver.query("select * from CDR.PAT_INFO where ROWNUM<10", 10); JdbcSelectResult selectResult = driver.query("select * from CDR.PAT_INFO where ROWNUM<10", 10);
System.out.println("end..."); System.out.println("end...");
......
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.constant.PhoenixEnum; import com.dlink.assertion.Asserts;
import com.dlink.metadata.rules.DbColumnType; import com.dlink.model.Column;
import com.dlink.metadata.rules.IColumnType; import com.dlink.model.ColumnType;
public class PhoenixTypeConvert implements ITypeConvert { public class PhoenixTypeConvert implements ITypeConvert {
@Override @Override
public IColumnType convert(String columnType) { public ColumnType convert(Column column) {
String t = columnType.toLowerCase(); if (Asserts.isNull(column)) {
return ColumnType.STRING;
}
String t = column.getType().toLowerCase();
if (t.contains("char") || t.contains("varchar") || t.contains("text") || if (t.contains("char") || t.contains("varchar") || t.contains("text") ||
t.contains("nchar") || t.contains("nvarchar") || t.contains("ntext") t.contains("nchar") || t.contains("nvarchar") || t.contains("ntext")
|| t.contains("uniqueidentifier") || t.contains("sql_variant")) { || t.contains("uniqueidentifier") || t.contains("sql_variant")) {
return DbColumnType.STRING; return ColumnType.STRING;
} else if (t.contains("int") || t.contains("tinyint") || t.contains("smallint") || t.contains("integer")) {
return DbColumnType.INTEGER;
} else if (t.contains("bigint")) { } else if (t.contains("bigint")) {
return DbColumnType.LONG; return ColumnType.LONG;
} else if (t.contains("int") || t.contains("tinyint") || t.contains("smallint") || t.contains("integer")) {
return ColumnType.INTEGER;
} else if (t.contains("float")) { } else if (t.contains("float")) {
return DbColumnType.FLOAT; return ColumnType.FLOAT;
} else if (t.contains("decimal") || t.contains("money") || t.contains("smallmoney") } else if (t.contains("decimal") || t.contains("money") || t.contains("smallmoney")
|| t.contains("numeric")) { || t.contains("numeric")) {
return DbColumnType.BIG_DECIMAL; return ColumnType.DECIMAL;
} else if (t.contains("double")) { } else if (t.contains("double")) {
return DbColumnType.DOUBLE; return ColumnType.DOUBLE;
} else if (t.contains("boolean")) { } else if (t.contains("boolean")) {
return DbColumnType.BOOLEAN; return ColumnType.BOOLEAN;
} else if (t.contains("time")) {
return DbColumnType.TIME;
} else if (t.contains("date")) {
return DbColumnType.DATE;
} else if (t.contains("smalldatetime") || t.contains("datetime")) { } else if (t.contains("smalldatetime") || t.contains("datetime")) {
return DbColumnType.TIMESTAMP; return ColumnType.TIMESTAMP;
} else if (t.contains("timestamp") || t.contains("binary") || t.contains("varbinary") || t.contains("image")) { } else if (t.contains("timestamp") || t.contains("binary") || t.contains("varbinary") || t.contains("image")) {
return DbColumnType.BYTE_ARRAY; return ColumnType.BYTES;
} else if (t.contains("time")) {
return ColumnType.TIME;
} else if (t.contains("date")) {
return ColumnType.DATE;
} }
return DbColumnType.STRING; return ColumnType.STRING;
} }
@Override @Override
public String convertToDB(String columnType) { public String convertToDB(ColumnType columnType) {
try { switch (columnType) {
Integer typeNum = Integer.valueOf(columnType); case INTEGER:
return PhoenixEnum.getDataTypeEnum(typeNum).toString(); return "integer";
} catch (Exception e) { case DOUBLE:
switch (columnType.toUpperCase()) {
case "UNSIGNED_INT":
return "UNSIGNED_INT";
case "INT":
case "INTEGER":
return "INTEGER";
case "TINYINT":
return "TINYINT";
case "double":
return "double"; return "double";
case "BIGINT": case LONG:
return "BIGINT"; return "bigint";
case "UNSIGNED_TINYINT": case FLOAT:
return "UNSIGNED_TINYINT"; return "float";
case "UNSIGNED_SMALLINT": case DECIMAL:
return "UNSIGNED_SMALLINT"; return "decimal";
case "FLOAT": case BOOLEAN:
return "FLOAT"; return "boolean";
case "UNSIGNED_FLOAT": case TIME:
return "UNSIGNED_FLOAT"; return "time";
case "DOUBLE": case DATE:
return "DOUBLE"; return "date";
case "UNSIGNED_DOUBLE": case TIMESTAMP:
return "UNSIGNED_DOUBLE"; return "timestamp";
case "DECIMAL": case STRING:
return "DECIMAL"; return "varchar";
case "BOOLEAN": case BYTES:
return "BOOLEAN"; return "binary";
case "TIME ":
return "TIME ";
case "DATE":
return "DATE";
case "TIMESTAMP":
return "TIMESTAMP";
case "UNSIGNED_TIME":
return "UNSIGNED_TIME";
case "UNSIGNED_DATE":
return "UNSIGNED_DATE";
case "UNSIGNED_TIMESTAMP":
return "UNSIGNED_TIMESTAMP";
case "VARCHAR":
return "VARCHAR";
case "CHAR":
return "VARCHAR";
case "BINARY":
return "BINARY";
case "VARBINARY":
return "VARBINARY";
default: default:
return "VARCHAR"; return "varchar";
}
} }
} }
} }
...@@ -51,7 +51,7 @@ public class PhoenixDriver extends AbstractJdbcDriver { ...@@ -51,7 +51,7 @@ public class PhoenixDriver extends AbstractJdbcDriver {
PhoenixTypeConvert phoenixTypeConvert = new PhoenixTypeConvert(); PhoenixTypeConvert phoenixTypeConvert = new PhoenixTypeConvert();
if (columns != null) { if (columns != null) {
for (Column column : columns) { for (Column column : columns) {
sql.append(", \"" + column.getColumnFamily() + "\".\"" + column.getName() + "\" " + phoenixTypeConvert.convertToDB(column.getType())); sql.append(", \"" + column.getColumnFamily() + "\".\"" + column.getName() + "\" " + phoenixTypeConvert.convertToDB(column));
} }
} }
sql.append(" ) "); sql.append(" ) ");
......
...@@ -8,6 +8,7 @@ import com.dlink.model.Schema; ...@@ -8,6 +8,7 @@ import com.dlink.model.Schema;
import com.dlink.model.Table; import com.dlink.model.Table;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
...@@ -21,7 +22,7 @@ public class PhoenixTest { ...@@ -21,7 +22,7 @@ public class PhoenixTest {
config.setType("Phoenix"); config.setType("Phoenix");
config.setUrl("jdbc:phoenix:xxx"); config.setUrl("jdbc:phoenix:xxx");
try { try {
driver = Driver.build(config).connect(); driver = Driver.build(config);
} catch (Exception e) { } catch (Exception e) {
System.err.println("连接创建失败:" + e.getMessage()); System.err.println("连接创建失败:" + e.getMessage());
} }
...@@ -39,6 +40,7 @@ public class PhoenixTest { ...@@ -39,6 +40,7 @@ public class PhoenixTest {
} }
} }
} }
@Test @Test
public void testListTables() { public void testListTables() {
List<Table> tables = driver.listTables(""); List<Table> tables = driver.listTables("");
......
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType; import com.dlink.assertion.Asserts;
import com.dlink.metadata.rules.IColumnType; import com.dlink.model.Column;
import com.dlink.model.ColumnType;
/** /**
* PostgreSqlTypeConvert * PostgreSqlTypeConvert
...@@ -11,60 +12,70 @@ import com.dlink.metadata.rules.IColumnType; ...@@ -11,60 +12,70 @@ import com.dlink.metadata.rules.IColumnType;
**/ **/
public class PostgreSqlTypeConvert implements ITypeConvert { public class PostgreSqlTypeConvert implements ITypeConvert {
@Override @Override
public IColumnType convert(String columnType) { public ColumnType convert(Column column) {
String t = columnType.toLowerCase(); if (Asserts.isNull(column)) {
if (t.contains("char")) { return ColumnType.STRING;
return DbColumnType.STRING; }
} else if (t.contains("bigint")) { String t = column.getType().toLowerCase();
return DbColumnType.LONG; if (t.contains("smallint") || t.contains("int2") || t.contains("smallserial") || t.contains("serial2")) {
} else if (t.contains("int")) { return ColumnType.SHORT;
return DbColumnType.INTEGER; } else if (t.contains("integer") || t.contains("serial")) {
} else if (t.contains("date") || t.contains("time")) { return ColumnType.INTEGER;
return DbColumnType.DATE; } else if (t.contains("bigint") || t.contains("bigserial")) {
} else if (t.contains("text")) { return ColumnType.LONG;
return DbColumnType.STRING; } else if (t.contains("real") || t.contains("float4")) {
} else if (t.contains("bit")) { return ColumnType.FLOAT;
return DbColumnType.BOOLEAN; } else if (t.contains("float8") || t.contains("double precision")) {
} else if (t.contains("decimal")) { return ColumnType.DOUBLE;
return DbColumnType.BIG_DECIMAL; } else if (t.contains("numeric") || t.contains("decimal")) {
} else if (t.contains("clob")) { return ColumnType.DECIMAL;
return DbColumnType.CLOB;
} else if (t.contains("blob")) {
return DbColumnType.BYTE_ARRAY;
} else if (t.contains("float")) {
return DbColumnType.FLOAT;
} else if (t.contains("double")) {
return DbColumnType.DOUBLE;
} else if (t.contains("json") || t.contains("enum")) {
return DbColumnType.STRING;
} else if (t.contains("boolean")) { } else if (t.contains("boolean")) {
return DbColumnType.BOOLEAN; return ColumnType.BOOLEAN;
} else if (t.contains("numeric")) { } else if (t.contains("timestamp")) {
return DbColumnType.BIG_DECIMAL; return ColumnType.TIMESTAMP;
} else if (t.contains("date")) {
return ColumnType.DATE;
} else if (t.contains("time")) {
return ColumnType.TIME;
} else if (t.contains("char") || t.contains("text")) {
return ColumnType.STRING;
} else if (t.contains("bytea")) {
return ColumnType.BYTES;
} else if (t.contains("array")) {
return ColumnType.T;
} }
return DbColumnType.STRING; return ColumnType.STRING;
} }
@Override @Override
public String convertToDB(String columnType) { public String convertToDB(ColumnType columnType) {
switch (columnType.toLowerCase()){ switch (columnType) {
case "string": case SHORT:
return "varchar(255)"; return "int2";
case "boolean": case INTEGER:
return "tinyint(1)"; return "integer";
case "int": case LONG:
case "integer":
return "int";
case "double":
return "double";
case "float":
return "float";
case "long":
return "bigint"; return "bigint";
case "date": case FLOAT:
return "datetime(0)"; return "float4";
case DOUBLE:
return "float8";
case DECIMAL:
return "decimal";
case BOOLEAN:
return "boolean";
case TIMESTAMP:
return "timestamp";
case DATE:
return "date";
case TIME:
return "time";
case BYTES:
return "bytea";
case T:
return "array";
default: default:
return "varchar(255)"; return "varchar";
} }
} }
} }
package com.dlink.metadata.convert; package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType; import com.dlink.assertion.Asserts;
import com.dlink.metadata.rules.IColumnType; import com.dlink.model.Column;
import com.dlink.model.ColumnType;
/** /**
*
* @operate * @operate
* @date 2022/1/26 14:23 * @date 2022/1/26 14:23
* @return * @return
*/ */
public class SqlServerTypeConvert implements ITypeConvert { public class SqlServerTypeConvert implements ITypeConvert {
@Override @Override
public IColumnType convert(String columnType) { public ColumnType convert(Column column) {
String t = columnType.toLowerCase(); if (Asserts.isNull(column)) {
return ColumnType.STRING;
}
String t = column.getType().toLowerCase();
if (t.contains("char") || t.contains("varchar") || t.contains("text") || if (t.contains("char") || t.contains("varchar") || t.contains("text") ||
t.contains("nchar") || t.contains("nvarchar") || t.contains("ntext") t.contains("nchar") || t.contains("nvarchar") || t.contains("ntext")
|| t.contains("uniqueidentifier") || t.contains("sql_variant")) { || t.contains("uniqueidentifier") || t.contains("sql_variant")) {
return DbColumnType.STRING; return ColumnType.STRING;
} else if(t.contains("bit")){ } else if (t.contains("bigint")) {
return DbColumnType.BOOLEAN; return ColumnType.LONG;
}else if(t.contains("int") || t.contains("tinyint") || t.contains("smallint")){ } else if (t.contains("bit")) {
return DbColumnType.INTEGER; return ColumnType.BOOLEAN;
}else if(t.contains("bigint")){ } else if (t.contains("int") || t.contains("tinyint") || t.contains("smallint")) {
return DbColumnType.LONG; return ColumnType.INTEGER;
}else if(t.contains("float") ){ } else if (t.contains("float")) {
return DbColumnType.DOUBLE; return ColumnType.DOUBLE;
}else if(t.contains("decimal") || t.contains("money") || t.contains("smallmoney") } else if (t.contains("decimal") || t.contains("money") || t.contains("smallmoney")
|| t.contains("numeric")){ || t.contains("numeric")) {
return DbColumnType.BIG_DECIMAL; return ColumnType.DECIMAL;
}else if(t.contains("real")){ } else if (t.contains("real")) {
return DbColumnType.FLOAT; return ColumnType.FLOAT;
}else if(t.contains("smalldatetime") || t.contains("datetime")){ } else if (t.contains("smalldatetime") || t.contains("datetime")) {
return DbColumnType.TIMESTAMP; return ColumnType.TIMESTAMP;
}else if(t.contains("timestamp") || t.contains("binary") || t.contains("varbinary") || t.contains("image")){ } else if (t.contains("timestamp") || t.contains("binary") || t.contains("varbinary") || t.contains("image")) {
return DbColumnType.BYTE_ARRAY; return ColumnType.BYTES;
} }
return DbColumnType.STRING; return ColumnType.STRING;
} }
@Override @Override
public String convertToDB(String columnType) { public String convertToDB(ColumnType columnType) {
switch (columnType.toLowerCase()) { switch (columnType) {
case "string": case STRING:
return "varchar(255)"; return "varchar";
case "boolean": case BOOLEAN:
return "tinyint(1)"; return "bit";
case "int": case LONG:
case "integer": return "bigint";
case INTEGER:
return "int"; return "int";
case "double": case DOUBLE:
return "double"; return "double";
case "float": case FLOAT:
return "float"; return "float";
case "date": case TIMESTAMP:
return "datetime(0)"; return "datetime(0)";
default: default:
return "varchar(255)"; return "varchar";
} }
} }
} }
...@@ -27,7 +27,7 @@ public class SqlServerTest { ...@@ -27,7 +27,7 @@ public class SqlServerTest {
config.setPassword("OcP2020123"); config.setPassword("OcP2020123");
config.setUrl("jdbc:sqlserver://192.168.68.133:1433;DatabaseName=test"); config.setUrl("jdbc:sqlserver://192.168.68.133:1433;DatabaseName=test");
try { try {
driver = Driver.build(config).connect(); driver = Driver.build(config);
} catch (Exception e) { } catch (Exception e) {
System.err.println("连接创建失败:" + e.getMessage()); System.err.println("连接创建失败:" + e.getMessage());
} }
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
<hibernate-validator.version>6.2.0.Final</hibernate-validator.version> <hibernate-validator.version>6.2.0.Final</hibernate-validator.version>
<!--<flyway.version>6.4.4</flyway.version>--> <!--<flyway.version>6.4.4</flyway.version>-->
<sa-token.version>1.28.0</sa-token.version> <sa-token.version>1.28.0</sa-token.version>
<commons.version>3.12.0</commons.version>
<maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
<maven-assembly-plugin.version>3.2.0</maven-assembly-plugin.version> <maven-assembly-plugin.version>3.2.0</maven-assembly-plugin.version>
<maven.resource.version>3.2.0</maven.resource.version> <maven.resource.version>3.2.0</maven.resource.version>
...@@ -102,6 +103,11 @@ ...@@ -102,6 +103,11 @@
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>${guava.version}</version> <version>${guava.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.version}</version>
</dependency>
<!--<dependency> <!--<dependency>
<groupId>org.apache.logging.log4j</groupId> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId> <artifactId>log4j-api</artifactId>
......
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