From e7314a4dcc01d62823d1df3220fe2229167622bb Mon Sep 17 00:00:00 2001 From: chenbingxuan <3581044601@qq.com> Date: Sat, 9 Dec 2023 11:34:19 +0800 Subject: [PATCH] Changes --- .../service/impl/DataDatabaseServiceImpl.java | 19 +- .../main/java/net/srt/vo/DataDatabaseVO.java | 3 + .../dbswitch/common/type/ProductTypeEnum.java | 6 + .../core/database/DatabaseFactory.java | 23 +- .../core/database/impl/DatabaseEsImpl.java | 274 +++++++++++++++++ .../database/impl/DatabaseFMongodbmpl.java | 274 +++++++++++++++++ .../core/database/impl/DatabaseFTPImpl.java | 274 +++++++++++++++++ .../core/database/impl/DatabaseKafkaImpl.java | 274 +++++++++++++++++ .../core/database/impl/DatabaseRedisImpl.java | 284 ++++++++++++++++++ ...k-app-1.14-2.0.0-jar-with-dependencies.jar | Bin 19336809 -> 19336809 bytes ...k-app-1.16-2.0.0-jar-with-dependencies.jar | Bin 0 -> 19202810 bytes .../flink-catalog-mysql-1.14-2.0.0.jar | Bin 21532 -> 21532 bytes .../flink-catalog-mysql-1.16-2.0.0.jar | Bin 0 -> 21538 bytes .../build/extends/flink-client-1.14-2.0.0.jar | Bin 146944 -> 146944 bytes .../build/extends/flink-client-1.16-2.0.0.jar | Bin 0 -> 71083 bytes .../system/controller/SysAuthController.java | 1 - .../srt/system/service/impl/IsCaptcha.java | 14 + .../service/impl/SysAuthServiceImpl.java | 19 +- .../service/impl/SysCaptchaServiceImpl.java | 41 +-- .../net/srt/system/vo/SysAccountLoginVO.java | 5 + .../java/net/srt/system/vo/SysCaptchaVO.java | 4 + .../src/main/resources/bootstrap.yml | 3 + 22 files changed, 1470 insertions(+), 48 deletions(-) create mode 100644 srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseEsImpl.java create mode 100644 srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFMongodbmpl.java create mode 100644 srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFTPImpl.java create mode 100644 srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseKafkaImpl.java create mode 100644 srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseRedisImpl.java create mode 100644 srt-cloud-framework/srt-cloud-flink/build/app/flink-app-1.16-2.0.0-jar-with-dependencies.jar create mode 100644 srt-cloud-framework/srt-cloud-flink/build/extends/flink-catalog-mysql-1.16-2.0.0.jar create mode 100644 srt-cloud-framework/srt-cloud-flink/build/extends/flink-client-1.16-2.0.0.jar create mode 100644 srt-cloud-system/src/main/java/net/srt/system/service/impl/IsCaptcha.java diff --git a/srt-cloud-data-integrate/src/main/java/net/srt/service/impl/DataDatabaseServiceImpl.java b/srt-cloud-data-integrate/src/main/java/net/srt/service/impl/DataDatabaseServiceImpl.java index 4d10450..fd4efad 100644 --- a/srt-cloud-data-integrate/src/main/java/net/srt/service/impl/DataDatabaseServiceImpl.java +++ b/srt-cloud-data-integrate/src/main/java/net/srt/service/impl/DataDatabaseServiceImpl.java @@ -134,6 +134,7 @@ public class DataDatabaseServiceImpl extends BaseServiceImpl"); + entity.setName(project.getName() + "<>"); List nodeList = new ArrayList<>(1); TreeNodeVo dbNode = new TreeNodeVo(); nodeList.add(dbNode); diff --git a/srt-cloud-data-integrate/src/main/java/net/srt/vo/DataDatabaseVO.java b/srt-cloud-data-integrate/src/main/java/net/srt/vo/DataDatabaseVO.java index 414ea64..0d7dc3f 100644 --- a/srt-cloud-data-integrate/src/main/java/net/srt/vo/DataDatabaseVO.java +++ b/srt-cloud-data-integrate/src/main/java/net/srt/vo/DataDatabaseVO.java @@ -78,5 +78,8 @@ public class DataDatabaseVO implements Serializable { @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) private Date updateTime; + @Schema(description = "是否是关系型数据库") + private Integer isJdbc; + } diff --git a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/common/type/ProductTypeEnum.java b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/common/type/ProductTypeEnum.java index 8ef7e62..e311415 100644 --- a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/common/type/ProductTypeEnum.java +++ b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/common/type/ProductTypeEnum.java @@ -100,6 +100,12 @@ public enum ProductTypeEnum { * MySQL数据库类型 */ DORIS(16, "com.mysql.jdbc.Driver","/* ping */ SELECT 1", "jdbc:mysql://{host}:{port}/{database}?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true"), + + REDIS(16, "com.mysql.jdbc.Driver","/* ping */ SELECT 1", ""), + KAFKA(16, "com.mysql.jdbc.Driver","/* ping */ SELECT 1", ""), + ES(16, "com.mysql.jdbc.Driver","/* ping */ SELECT 1", ""), + FTP(16, "com.mysql.jdbc.Driver","/* ping */ SELECT 1", ""), + MONGODB(16, "com.mysql.jdbc.Driver","/* ping */ SELECT 1", ""), ; private Integer index; diff --git a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/DatabaseFactory.java b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/DatabaseFactory.java index 45b673f..c4564df 100644 --- a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/DatabaseFactory.java +++ b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/DatabaseFactory.java @@ -10,22 +10,7 @@ package srt.cloud.framework.dbswitch.core.database; import srt.cloud.framework.dbswitch.common.type.ProductTypeEnum; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseDB2Impl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseDmImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseDorisImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseGbase8aImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseGreenplumImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseHiveImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseKingbaseImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseMariaDBImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseMysqlImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseOracleImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseOscarImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabasePostgresImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseSqliteImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseSqlserver2000Impl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseSqlserverImpl; -import srt.cloud.framework.dbswitch.core.database.impl.DatabaseSybaseImpl; +import srt.cloud.framework.dbswitch.core.database.impl.*; import java.util.HashMap; import java.util.Map; @@ -60,6 +45,12 @@ public final class DatabaseFactory { put(ProductTypeEnum.HIVE, DatabaseHiveImpl::new); put(ProductTypeEnum.SQLITE3, DatabaseSqliteImpl::new); put(ProductTypeEnum.DORIS, DatabaseDorisImpl::new); + + put(ProductTypeEnum.REDIS, DatabaseRedisImpl::new); + put(ProductTypeEnum.KAFKA, DatabaseKafkaImpl::new); + put(ProductTypeEnum.ES, DatabaseEsImpl::new); + put(ProductTypeEnum.FTP, DatabaseEsImpl::new); + put(ProductTypeEnum.MONGODB, DatabaseFMongodbmpl::new); } }; diff --git a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseEsImpl.java b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseEsImpl.java new file mode 100644 index 0000000..ce28261 --- /dev/null +++ b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseEsImpl.java @@ -0,0 +1,274 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package srt.cloud.framework.dbswitch.core.database.impl; + +import org.apache.commons.lang3.StringUtils; +import srt.cloud.framework.dbswitch.common.constant.Const; +import srt.cloud.framework.dbswitch.common.type.ProductTypeEnum; +import srt.cloud.framework.dbswitch.core.database.IDatabaseInterface; +import srt.cloud.framework.dbswitch.core.model.ColumnDescription; +import srt.cloud.framework.dbswitch.core.model.ColumnMetaData; +import srt.cloud.framework.dbswitch.core.model.TableDescription; + +import java.sql.*; +import java.util.*; + +/** + * 支持MySQL数据库的元信息实现 + * + * @author jrl + */ +public class DatabaseEsImpl extends DatabaseMysqlImpl implements IDatabaseInterface { + + private static final String SHOW_CREATE_TABLE_SQL = "SHOW CREATE TABLE `%s`.`%s` "; + private static final String SHOW_CREATE_VIEW_SQL = "SHOW CREATE VIEW `%s`.`%s` "; + + public DatabaseEsImpl() { + super("com.mysql.jdbc.Driver"); + } + + public DatabaseEsImpl(String driverClassName) { + super(driverClassName); + } + + @Override + public ProductTypeEnum getDatabaseType() { + return ProductTypeEnum.DORIS; + } + + @Override + public List queryTableColumnMeta(Connection connection, String schemaName, + String tableName) { +// String sql = this.getTableFieldsQuerySQL(schemaName, tableName); +// List columnDescriptions = this.querySelectSqlColumnMeta(connection, sql); +// // 补充一下字段信息,获取的不准 +// String extraSql = "SELECT column_name,data_type,column_size,decimal_digits,column_comment FROM information_schema.COLUMNS WHERE table_schema='" + schemaName + "' AND table_name='" + tableName + "'"; +// try (PreparedStatement ps = connection.prepareStatement(extraSql); +// ResultSet rs = ps.executeQuery(); +// ) { +// while (rs.next()) { +// String columnName = rs.getString("column_name"); +// String dataType = rs.getString("data_type"); +// String columnSize = rs.getString("column_size"); +// String decimalDigits = rs.getString("decimal_digits"); +// String columnComment = rs.getString("column_comment"); +// if (columnName != null) { +// for (ColumnDescription cd : columnDescriptions) { +// if (columnName.equals(cd.getFieldName())) { +// cd.setFieldTypeName(dataType); +// int csize = columnSize != null ? Integer.parseInt(columnSize) : 0; +// cd.setDisplaySize(csize); +// cd.setPrecisionSize(csize); +// cd.setScaleSize(decimalDigits != null ? Integer.parseInt(decimalDigits) : 0); +// cd.setRemarks(columnComment); +// break; +// } +// } +// } +// } +// } catch (SQLException e) { +// throw new RuntimeException(schemaName + "." + tableName + " queryTableColumnMeta error!!", e); +// } +// +// return columnDescriptions; + return null; + } + + @Override + public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, + boolean addCr, boolean withRemarks) { + String fieldname = v.getName(); + int length = v.getLength(); + int precision = v.getPrecision(); + int type = v.getType(); + + String retval = " `" + fieldname + "` "; + boolean canHaveDefaultValue = true; + switch (type) { + case ColumnMetaData.TYPE_TIMESTAMP: + case ColumnMetaData.TYPE_TIME: + retval += "DATETIME"; + break; + case ColumnMetaData.TYPE_DATE: + retval += "DATE"; + break; + case ColumnMetaData.TYPE_BOOLEAN: + retval += "TINYINT"; + break; + case ColumnMetaData.TYPE_NUMBER: + case ColumnMetaData.TYPE_INTEGER: + case ColumnMetaData.TYPE_BIGNUMBER: + if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) { + retval += "BIGINT"; + } else { + // Integer values... + if (precision == 0) { + if (length > 9) { + if (length < 19) { + // can hold signed values between -9223372036854775808 and 9223372036854775807 + // 18 significant digits + retval += "BIGINT"; + } else { + retval += "DECIMAL(" + length + ")"; + } + } else { + retval += "INT"; + } + } else { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + // Floating point values... + /*if (length > 15) { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + } else { + // A double-precision floating-point number is accurate to approximately 15 + // decimal places. + // http://mysql.mirrors-r-us.net/doc/refman/5.1/en/numeric-type-overview.html + retval += "DOUBLE"; + }*/ + } + } + break; + case ColumnMetaData.TYPE_STRING: + if (length * 3 <= 65533) { + retval += "VARCHAR(" + length * 3 + ")"; + } else { + retval += "TEXT"; + canHaveDefaultValue = false; + } + break; + default: + retval += "TEXT"; + canHaveDefaultValue = false; + break; + } + + if (!v.isNullable()) { + retval += " NOT NULL"; + } + + if (canHaveDefaultValue && v.getDefaultValue() != null && !"null".equals(v.getDefaultValue()) && !"NULL".equals(v.getDefaultValue())) { + if (type != ColumnMetaData.TYPE_TIMESTAMP && type != ColumnMetaData.TYPE_TIME && type != ColumnMetaData.TYPE_DATE) { + if (v.getDefaultValue().startsWith("'")) { + retval += " DEFAULT " + v.getDefaultValue(); + } else { + retval += " DEFAULT '" + v.getDefaultValue() + "'"; + } + } else { + retval += " DEFAULT CURRENT_TIMESTAMP"; + } + } + + + if (withRemarks && StringUtils.isNotBlank(v.getRemarks())) { + retval += String.format(" COMMENT '%s' ", v.getRemarks().replace("'", "\\'")); + } + + if (addCr) { + retval += Const.CR; + } + + return retval; + } + + @Override + public boolean canCreateIndex(ColumnMetaData v) { + return false; + } + + @Override + public String getPrimaryKeyAsString(List pks) { + if (null != pks && !pks.isEmpty()) { + return "`" + + StringUtils.join(pks, "` , `") + + "`"; + } + + return ""; + } + + @Override + public void setColumnDefaultValue(Connection connection, String schemaName, String tableName, List columnDescriptions) { + String sql = this.getDefaultValueSql(schemaName, tableName); + try (Statement st = connection.createStatement()) { + try (ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + String columnName = rs.getString("Field"); + String columnDefault = rs.getString("Default"); + if (columnName != null) { + for (ColumnDescription cd : columnDescriptions) { + if (columnName.equals(cd.getFieldName())) { + cd.setDefaultValue(columnDefault); + break; + } + } + } + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + protected String getDefaultValueSql(String schemaName, String tableName) { + return String.format("desc `%s`.`%s`", schemaName, tableName); + } + + + @Override + public List queryTablePrimaryKeys(Connection connection, String schemaName, + String tableName) { + Set ret = new HashSet<>(); + String sql = String.format("desc `%s`.`%s`", schemaName, tableName); + try (PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + ) { + //看下是否又none的字段,如果有,说明key模式为DUPLICATE KEY 可重复 + boolean NoneExtra = false; + while (rs.next()) { + String field = rs.getString("Field"); + String key = rs.getString("Key"); + String extra = rs.getString("Extra"); + if ("true".equalsIgnoreCase(key)) { + ret.add(field); + } else { + if ("NONE".equalsIgnoreCase(extra)) { + NoneExtra = true; + } + } + } + if (NoneExtra) { + return new ArrayList<>(); + } + return new ArrayList<>(ret); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void setColumnIndexInfo(Connection connection, String schemaName, String tableName, List columnDescriptions) { + } + + @Override + public List getTableColumnCommentDefinition(TableDescription td, + List cds) { + return Collections.emptyList(); + } + +} diff --git a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFMongodbmpl.java b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFMongodbmpl.java new file mode 100644 index 0000000..616e59c --- /dev/null +++ b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFMongodbmpl.java @@ -0,0 +1,274 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package srt.cloud.framework.dbswitch.core.database.impl; + +import org.apache.commons.lang3.StringUtils; +import srt.cloud.framework.dbswitch.common.constant.Const; +import srt.cloud.framework.dbswitch.common.type.ProductTypeEnum; +import srt.cloud.framework.dbswitch.core.database.IDatabaseInterface; +import srt.cloud.framework.dbswitch.core.model.ColumnDescription; +import srt.cloud.framework.dbswitch.core.model.ColumnMetaData; +import srt.cloud.framework.dbswitch.core.model.TableDescription; + +import java.sql.*; +import java.util.*; + +/** + * 支持MySQL数据库的元信息实现 + * + * @author jrl + */ +public class DatabaseFMongodbmpl extends DatabaseMysqlImpl implements IDatabaseInterface { + + private static final String SHOW_CREATE_TABLE_SQL = "SHOW CREATE TABLE `%s`.`%s` "; + private static final String SHOW_CREATE_VIEW_SQL = "SHOW CREATE VIEW `%s`.`%s` "; + + public DatabaseFMongodbmpl() { + super("com.mysql.jdbc.Driver"); + } + + public DatabaseFMongodbmpl(String driverClassName) { + super(driverClassName); + } + + @Override + public ProductTypeEnum getDatabaseType() { + return ProductTypeEnum.DORIS; + } + + @Override + public List queryTableColumnMeta(Connection connection, String schemaName, + String tableName) { +// String sql = this.getTableFieldsQuerySQL(schemaName, tableName); +// List columnDescriptions = this.querySelectSqlColumnMeta(connection, sql); +// // 补充一下字段信息,获取的不准 +// String extraSql = "SELECT column_name,data_type,column_size,decimal_digits,column_comment FROM information_schema.COLUMNS WHERE table_schema='" + schemaName + "' AND table_name='" + tableName + "'"; +// try (PreparedStatement ps = connection.prepareStatement(extraSql); +// ResultSet rs = ps.executeQuery(); +// ) { +// while (rs.next()) { +// String columnName = rs.getString("column_name"); +// String dataType = rs.getString("data_type"); +// String columnSize = rs.getString("column_size"); +// String decimalDigits = rs.getString("decimal_digits"); +// String columnComment = rs.getString("column_comment"); +// if (columnName != null) { +// for (ColumnDescription cd : columnDescriptions) { +// if (columnName.equals(cd.getFieldName())) { +// cd.setFieldTypeName(dataType); +// int csize = columnSize != null ? Integer.parseInt(columnSize) : 0; +// cd.setDisplaySize(csize); +// cd.setPrecisionSize(csize); +// cd.setScaleSize(decimalDigits != null ? Integer.parseInt(decimalDigits) : 0); +// cd.setRemarks(columnComment); +// break; +// } +// } +// } +// } +// } catch (SQLException e) { +// throw new RuntimeException(schemaName + "." + tableName + " queryTableColumnMeta error!!", e); +// } +// +// return columnDescriptions; + return null; + } + + @Override + public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, + boolean addCr, boolean withRemarks) { + String fieldname = v.getName(); + int length = v.getLength(); + int precision = v.getPrecision(); + int type = v.getType(); + + String retval = " `" + fieldname + "` "; + boolean canHaveDefaultValue = true; + switch (type) { + case ColumnMetaData.TYPE_TIMESTAMP: + case ColumnMetaData.TYPE_TIME: + retval += "DATETIME"; + break; + case ColumnMetaData.TYPE_DATE: + retval += "DATE"; + break; + case ColumnMetaData.TYPE_BOOLEAN: + retval += "TINYINT"; + break; + case ColumnMetaData.TYPE_NUMBER: + case ColumnMetaData.TYPE_INTEGER: + case ColumnMetaData.TYPE_BIGNUMBER: + if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) { + retval += "BIGINT"; + } else { + // Integer values... + if (precision == 0) { + if (length > 9) { + if (length < 19) { + // can hold signed values between -9223372036854775808 and 9223372036854775807 + // 18 significant digits + retval += "BIGINT"; + } else { + retval += "DECIMAL(" + length + ")"; + } + } else { + retval += "INT"; + } + } else { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + // Floating point values... + /*if (length > 15) { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + } else { + // A double-precision floating-point number is accurate to approximately 15 + // decimal places. + // http://mysql.mirrors-r-us.net/doc/refman/5.1/en/numeric-type-overview.html + retval += "DOUBLE"; + }*/ + } + } + break; + case ColumnMetaData.TYPE_STRING: + if (length * 3 <= 65533) { + retval += "VARCHAR(" + length * 3 + ")"; + } else { + retval += "TEXT"; + canHaveDefaultValue = false; + } + break; + default: + retval += "TEXT"; + canHaveDefaultValue = false; + break; + } + + if (!v.isNullable()) { + retval += " NOT NULL"; + } + + if (canHaveDefaultValue && v.getDefaultValue() != null && !"null".equals(v.getDefaultValue()) && !"NULL".equals(v.getDefaultValue())) { + if (type != ColumnMetaData.TYPE_TIMESTAMP && type != ColumnMetaData.TYPE_TIME && type != ColumnMetaData.TYPE_DATE) { + if (v.getDefaultValue().startsWith("'")) { + retval += " DEFAULT " + v.getDefaultValue(); + } else { + retval += " DEFAULT '" + v.getDefaultValue() + "'"; + } + } else { + retval += " DEFAULT CURRENT_TIMESTAMP"; + } + } + + + if (withRemarks && StringUtils.isNotBlank(v.getRemarks())) { + retval += String.format(" COMMENT '%s' ", v.getRemarks().replace("'", "\\'")); + } + + if (addCr) { + retval += Const.CR; + } + + return retval; + } + + @Override + public boolean canCreateIndex(ColumnMetaData v) { + return false; + } + + @Override + public String getPrimaryKeyAsString(List pks) { + if (null != pks && !pks.isEmpty()) { + return "`" + + StringUtils.join(pks, "` , `") + + "`"; + } + + return ""; + } + + @Override + public void setColumnDefaultValue(Connection connection, String schemaName, String tableName, List columnDescriptions) { + String sql = this.getDefaultValueSql(schemaName, tableName); + try (Statement st = connection.createStatement()) { + try (ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + String columnName = rs.getString("Field"); + String columnDefault = rs.getString("Default"); + if (columnName != null) { + for (ColumnDescription cd : columnDescriptions) { + if (columnName.equals(cd.getFieldName())) { + cd.setDefaultValue(columnDefault); + break; + } + } + } + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + protected String getDefaultValueSql(String schemaName, String tableName) { + return String.format("desc `%s`.`%s`", schemaName, tableName); + } + + + @Override + public List queryTablePrimaryKeys(Connection connection, String schemaName, + String tableName) { + Set ret = new HashSet<>(); + String sql = String.format("desc `%s`.`%s`", schemaName, tableName); + try (PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + ) { + //看下是否又none的字段,如果有,说明key模式为DUPLICATE KEY 可重复 + boolean NoneExtra = false; + while (rs.next()) { + String field = rs.getString("Field"); + String key = rs.getString("Key"); + String extra = rs.getString("Extra"); + if ("true".equalsIgnoreCase(key)) { + ret.add(field); + } else { + if ("NONE".equalsIgnoreCase(extra)) { + NoneExtra = true; + } + } + } + if (NoneExtra) { + return new ArrayList<>(); + } + return new ArrayList<>(ret); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void setColumnIndexInfo(Connection connection, String schemaName, String tableName, List columnDescriptions) { + } + + @Override + public List getTableColumnCommentDefinition(TableDescription td, + List cds) { + return Collections.emptyList(); + } + +} diff --git a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFTPImpl.java b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFTPImpl.java new file mode 100644 index 0000000..7559a6c --- /dev/null +++ b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseFTPImpl.java @@ -0,0 +1,274 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package srt.cloud.framework.dbswitch.core.database.impl; + +import org.apache.commons.lang3.StringUtils; +import srt.cloud.framework.dbswitch.common.constant.Const; +import srt.cloud.framework.dbswitch.common.type.ProductTypeEnum; +import srt.cloud.framework.dbswitch.core.database.IDatabaseInterface; +import srt.cloud.framework.dbswitch.core.model.ColumnDescription; +import srt.cloud.framework.dbswitch.core.model.ColumnMetaData; +import srt.cloud.framework.dbswitch.core.model.TableDescription; + +import java.sql.*; +import java.util.*; + +/** + * 支持MySQL数据库的元信息实现 + * + * @author jrl + */ +public class DatabaseFTPImpl extends DatabaseMysqlImpl implements IDatabaseInterface { + + private static final String SHOW_CREATE_TABLE_SQL = "SHOW CREATE TABLE `%s`.`%s` "; + private static final String SHOW_CREATE_VIEW_SQL = "SHOW CREATE VIEW `%s`.`%s` "; + + public DatabaseFTPImpl() { + super("com.mysql.jdbc.Driver"); + } + + public DatabaseFTPImpl(String driverClassName) { + super(driverClassName); + } + + @Override + public ProductTypeEnum getDatabaseType() { + return ProductTypeEnum.DORIS; + } + + @Override + public List queryTableColumnMeta(Connection connection, String schemaName, + String tableName) { +// String sql = this.getTableFieldsQuerySQL(schemaName, tableName); +// List columnDescriptions = this.querySelectSqlColumnMeta(connection, sql); +// // 补充一下字段信息,获取的不准 +// String extraSql = "SELECT column_name,data_type,column_size,decimal_digits,column_comment FROM information_schema.COLUMNS WHERE table_schema='" + schemaName + "' AND table_name='" + tableName + "'"; +// try (PreparedStatement ps = connection.prepareStatement(extraSql); +// ResultSet rs = ps.executeQuery(); +// ) { +// while (rs.next()) { +// String columnName = rs.getString("column_name"); +// String dataType = rs.getString("data_type"); +// String columnSize = rs.getString("column_size"); +// String decimalDigits = rs.getString("decimal_digits"); +// String columnComment = rs.getString("column_comment"); +// if (columnName != null) { +// for (ColumnDescription cd : columnDescriptions) { +// if (columnName.equals(cd.getFieldName())) { +// cd.setFieldTypeName(dataType); +// int csize = columnSize != null ? Integer.parseInt(columnSize) : 0; +// cd.setDisplaySize(csize); +// cd.setPrecisionSize(csize); +// cd.setScaleSize(decimalDigits != null ? Integer.parseInt(decimalDigits) : 0); +// cd.setRemarks(columnComment); +// break; +// } +// } +// } +// } +// } catch (SQLException e) { +// throw new RuntimeException(schemaName + "." + tableName + " queryTableColumnMeta error!!", e); +// } +// +// return columnDescriptions; + return null; + } + + @Override + public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, + boolean addCr, boolean withRemarks) { + String fieldname = v.getName(); + int length = v.getLength(); + int precision = v.getPrecision(); + int type = v.getType(); + + String retval = " `" + fieldname + "` "; + boolean canHaveDefaultValue = true; + switch (type) { + case ColumnMetaData.TYPE_TIMESTAMP: + case ColumnMetaData.TYPE_TIME: + retval += "DATETIME"; + break; + case ColumnMetaData.TYPE_DATE: + retval += "DATE"; + break; + case ColumnMetaData.TYPE_BOOLEAN: + retval += "TINYINT"; + break; + case ColumnMetaData.TYPE_NUMBER: + case ColumnMetaData.TYPE_INTEGER: + case ColumnMetaData.TYPE_BIGNUMBER: + if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) { + retval += "BIGINT"; + } else { + // Integer values... + if (precision == 0) { + if (length > 9) { + if (length < 19) { + // can hold signed values between -9223372036854775808 and 9223372036854775807 + // 18 significant digits + retval += "BIGINT"; + } else { + retval += "DECIMAL(" + length + ")"; + } + } else { + retval += "INT"; + } + } else { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + // Floating point values... + /*if (length > 15) { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + } else { + // A double-precision floating-point number is accurate to approximately 15 + // decimal places. + // http://mysql.mirrors-r-us.net/doc/refman/5.1/en/numeric-type-overview.html + retval += "DOUBLE"; + }*/ + } + } + break; + case ColumnMetaData.TYPE_STRING: + if (length * 3 <= 65533) { + retval += "VARCHAR(" + length * 3 + ")"; + } else { + retval += "TEXT"; + canHaveDefaultValue = false; + } + break; + default: + retval += "TEXT"; + canHaveDefaultValue = false; + break; + } + + if (!v.isNullable()) { + retval += " NOT NULL"; + } + + if (canHaveDefaultValue && v.getDefaultValue() != null && !"null".equals(v.getDefaultValue()) && !"NULL".equals(v.getDefaultValue())) { + if (type != ColumnMetaData.TYPE_TIMESTAMP && type != ColumnMetaData.TYPE_TIME && type != ColumnMetaData.TYPE_DATE) { + if (v.getDefaultValue().startsWith("'")) { + retval += " DEFAULT " + v.getDefaultValue(); + } else { + retval += " DEFAULT '" + v.getDefaultValue() + "'"; + } + } else { + retval += " DEFAULT CURRENT_TIMESTAMP"; + } + } + + + if (withRemarks && StringUtils.isNotBlank(v.getRemarks())) { + retval += String.format(" COMMENT '%s' ", v.getRemarks().replace("'", "\\'")); + } + + if (addCr) { + retval += Const.CR; + } + + return retval; + } + + @Override + public boolean canCreateIndex(ColumnMetaData v) { + return false; + } + + @Override + public String getPrimaryKeyAsString(List pks) { + if (null != pks && !pks.isEmpty()) { + return "`" + + StringUtils.join(pks, "` , `") + + "`"; + } + + return ""; + } + + @Override + public void setColumnDefaultValue(Connection connection, String schemaName, String tableName, List columnDescriptions) { + String sql = this.getDefaultValueSql(schemaName, tableName); + try (Statement st = connection.createStatement()) { + try (ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + String columnName = rs.getString("Field"); + String columnDefault = rs.getString("Default"); + if (columnName != null) { + for (ColumnDescription cd : columnDescriptions) { + if (columnName.equals(cd.getFieldName())) { + cd.setDefaultValue(columnDefault); + break; + } + } + } + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + protected String getDefaultValueSql(String schemaName, String tableName) { + return String.format("desc `%s`.`%s`", schemaName, tableName); + } + + + @Override + public List queryTablePrimaryKeys(Connection connection, String schemaName, + String tableName) { + Set ret = new HashSet<>(); + String sql = String.format("desc `%s`.`%s`", schemaName, tableName); + try (PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + ) { + //看下是否又none的字段,如果有,说明key模式为DUPLICATE KEY 可重复 + boolean NoneExtra = false; + while (rs.next()) { + String field = rs.getString("Field"); + String key = rs.getString("Key"); + String extra = rs.getString("Extra"); + if ("true".equalsIgnoreCase(key)) { + ret.add(field); + } else { + if ("NONE".equalsIgnoreCase(extra)) { + NoneExtra = true; + } + } + } + if (NoneExtra) { + return new ArrayList<>(); + } + return new ArrayList<>(ret); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void setColumnIndexInfo(Connection connection, String schemaName, String tableName, List columnDescriptions) { + } + + @Override + public List getTableColumnCommentDefinition(TableDescription td, + List cds) { + return Collections.emptyList(); + } + +} diff --git a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseKafkaImpl.java b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseKafkaImpl.java new file mode 100644 index 0000000..b513d1b --- /dev/null +++ b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseKafkaImpl.java @@ -0,0 +1,274 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package srt.cloud.framework.dbswitch.core.database.impl; + +import org.apache.commons.lang3.StringUtils; +import srt.cloud.framework.dbswitch.common.constant.Const; +import srt.cloud.framework.dbswitch.common.type.ProductTypeEnum; +import srt.cloud.framework.dbswitch.core.database.IDatabaseInterface; +import srt.cloud.framework.dbswitch.core.model.ColumnDescription; +import srt.cloud.framework.dbswitch.core.model.ColumnMetaData; +import srt.cloud.framework.dbswitch.core.model.TableDescription; + +import java.sql.*; +import java.util.*; + +/** + * 支持MySQL数据库的元信息实现 + * + * @author jrl + */ +public class DatabaseKafkaImpl extends DatabaseMysqlImpl implements IDatabaseInterface { + + private static final String SHOW_CREATE_TABLE_SQL = "SHOW CREATE TABLE `%s`.`%s` "; + private static final String SHOW_CREATE_VIEW_SQL = "SHOW CREATE VIEW `%s`.`%s` "; + + public DatabaseKafkaImpl() { + super("com.mysql.jdbc.Driver"); + } + + public DatabaseKafkaImpl(String driverClassName) { + super(driverClassName); + } + + @Override + public ProductTypeEnum getDatabaseType() { + return ProductTypeEnum.DORIS; + } + + @Override + public List queryTableColumnMeta(Connection connection, String schemaName, + String tableName) { +// String sql = this.getTableFieldsQuerySQL(schemaName, tableName); +// List columnDescriptions = this.querySelectSqlColumnMeta(connection, sql); +// // 补充一下字段信息,获取的不准 +// String extraSql = "SELECT column_name,data_type,column_size,decimal_digits,column_comment FROM information_schema.COLUMNS WHERE table_schema='" + schemaName + "' AND table_name='" + tableName + "'"; +// try (PreparedStatement ps = connection.prepareStatement(extraSql); +// ResultSet rs = ps.executeQuery(); +// ) { +// while (rs.next()) { +// String columnName = rs.getString("column_name"); +// String dataType = rs.getString("data_type"); +// String columnSize = rs.getString("column_size"); +// String decimalDigits = rs.getString("decimal_digits"); +// String columnComment = rs.getString("column_comment"); +// if (columnName != null) { +// for (ColumnDescription cd : columnDescriptions) { +// if (columnName.equals(cd.getFieldName())) { +// cd.setFieldTypeName(dataType); +// int csize = columnSize != null ? Integer.parseInt(columnSize) : 0; +// cd.setDisplaySize(csize); +// cd.setPrecisionSize(csize); +// cd.setScaleSize(decimalDigits != null ? Integer.parseInt(decimalDigits) : 0); +// cd.setRemarks(columnComment); +// break; +// } +// } +// } +// } +// } catch (SQLException e) { +// throw new RuntimeException(schemaName + "." + tableName + " queryTableColumnMeta error!!", e); +// } +// +// return columnDescriptions; + return null; + } + + @Override + public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, + boolean addCr, boolean withRemarks) { + String fieldname = v.getName(); + int length = v.getLength(); + int precision = v.getPrecision(); + int type = v.getType(); + + String retval = " `" + fieldname + "` "; + boolean canHaveDefaultValue = true; + switch (type) { + case ColumnMetaData.TYPE_TIMESTAMP: + case ColumnMetaData.TYPE_TIME: + retval += "DATETIME"; + break; + case ColumnMetaData.TYPE_DATE: + retval += "DATE"; + break; + case ColumnMetaData.TYPE_BOOLEAN: + retval += "TINYINT"; + break; + case ColumnMetaData.TYPE_NUMBER: + case ColumnMetaData.TYPE_INTEGER: + case ColumnMetaData.TYPE_BIGNUMBER: + if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) { + retval += "BIGINT"; + } else { + // Integer values... + if (precision == 0) { + if (length > 9) { + if (length < 19) { + // can hold signed values between -9223372036854775808 and 9223372036854775807 + // 18 significant digits + retval += "BIGINT"; + } else { + retval += "DECIMAL(" + length + ")"; + } + } else { + retval += "INT"; + } + } else { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + // Floating point values... + /*if (length > 15) { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + } else { + // A double-precision floating-point number is accurate to approximately 15 + // decimal places. + // http://mysql.mirrors-r-us.net/doc/refman/5.1/en/numeric-type-overview.html + retval += "DOUBLE"; + }*/ + } + } + break; + case ColumnMetaData.TYPE_STRING: + if (length * 3 <= 65533) { + retval += "VARCHAR(" + length * 3 + ")"; + } else { + retval += "TEXT"; + canHaveDefaultValue = false; + } + break; + default: + retval += "TEXT"; + canHaveDefaultValue = false; + break; + } + + if (!v.isNullable()) { + retval += " NOT NULL"; + } + + if (canHaveDefaultValue && v.getDefaultValue() != null && !"null".equals(v.getDefaultValue()) && !"NULL".equals(v.getDefaultValue())) { + if (type != ColumnMetaData.TYPE_TIMESTAMP && type != ColumnMetaData.TYPE_TIME && type != ColumnMetaData.TYPE_DATE) { + if (v.getDefaultValue().startsWith("'")) { + retval += " DEFAULT " + v.getDefaultValue(); + } else { + retval += " DEFAULT '" + v.getDefaultValue() + "'"; + } + } else { + retval += " DEFAULT CURRENT_TIMESTAMP"; + } + } + + + if (withRemarks && StringUtils.isNotBlank(v.getRemarks())) { + retval += String.format(" COMMENT '%s' ", v.getRemarks().replace("'", "\\'")); + } + + if (addCr) { + retval += Const.CR; + } + + return retval; + } + + @Override + public boolean canCreateIndex(ColumnMetaData v) { + return false; + } + + @Override + public String getPrimaryKeyAsString(List pks) { + if (null != pks && !pks.isEmpty()) { + return "`" + + StringUtils.join(pks, "` , `") + + "`"; + } + + return ""; + } + + @Override + public void setColumnDefaultValue(Connection connection, String schemaName, String tableName, List columnDescriptions) { + String sql = this.getDefaultValueSql(schemaName, tableName); + try (Statement st = connection.createStatement()) { + try (ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + String columnName = rs.getString("Field"); + String columnDefault = rs.getString("Default"); + if (columnName != null) { + for (ColumnDescription cd : columnDescriptions) { + if (columnName.equals(cd.getFieldName())) { + cd.setDefaultValue(columnDefault); + break; + } + } + } + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + protected String getDefaultValueSql(String schemaName, String tableName) { + return String.format("desc `%s`.`%s`", schemaName, tableName); + } + + + @Override + public List queryTablePrimaryKeys(Connection connection, String schemaName, + String tableName) { + Set ret = new HashSet<>(); + String sql = String.format("desc `%s`.`%s`", schemaName, tableName); + try (PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + ) { + //看下是否又none的字段,如果有,说明key模式为DUPLICATE KEY 可重复 + boolean NoneExtra = false; + while (rs.next()) { + String field = rs.getString("Field"); + String key = rs.getString("Key"); + String extra = rs.getString("Extra"); + if ("true".equalsIgnoreCase(key)) { + ret.add(field); + } else { + if ("NONE".equalsIgnoreCase(extra)) { + NoneExtra = true; + } + } + } + if (NoneExtra) { + return new ArrayList<>(); + } + return new ArrayList<>(ret); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void setColumnIndexInfo(Connection connection, String schemaName, String tableName, List columnDescriptions) { + } + + @Override + public List getTableColumnCommentDefinition(TableDescription td, + List cds) { + return Collections.emptyList(); + } + +} diff --git a/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseRedisImpl.java b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseRedisImpl.java new file mode 100644 index 0000000..8d65bd8 --- /dev/null +++ b/srt-cloud-framework/srt-cloud-dbswitch/src/main/java/srt/cloud/framework/dbswitch/core/database/impl/DatabaseRedisImpl.java @@ -0,0 +1,284 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package srt.cloud.framework.dbswitch.core.database.impl; + +import org.apache.commons.lang3.StringUtils; +import srt.cloud.framework.dbswitch.common.constant.Const; +import srt.cloud.framework.dbswitch.common.type.ProductTypeEnum; +import srt.cloud.framework.dbswitch.core.database.IDatabaseInterface; +import srt.cloud.framework.dbswitch.core.model.ColumnDescription; +import srt.cloud.framework.dbswitch.core.model.ColumnMetaData; +import srt.cloud.framework.dbswitch.core.model.TableDescription; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +/** + * 支持MySQL数据库的元信息实现 + * + * @author jrl + */ +public class DatabaseRedisImpl extends DatabaseMysqlImpl implements IDatabaseInterface { + + private static final String SHOW_CREATE_TABLE_SQL = "SHOW CREATE TABLE `%s`.`%s` "; + private static final String SHOW_CREATE_VIEW_SQL = "SHOW CREATE VIEW `%s`.`%s` "; + + public DatabaseRedisImpl() { + super("com.mysql.jdbc.Driver"); + } + + public DatabaseRedisImpl(String driverClassName) { + super(driverClassName); + } + + @Override + public ProductTypeEnum getDatabaseType() { + return ProductTypeEnum.DORIS; + } + + @Override + public List queryTableColumnMeta(Connection connection, String schemaName, + String tableName) { +// String sql = this.getTableFieldsQuerySQL(schemaName, tableName); +// List columnDescriptions = this.querySelectSqlColumnMeta(connection, sql); +// // 补充一下字段信息,获取的不准 +// String extraSql = "SELECT column_name,data_type,column_size,decimal_digits,column_comment FROM information_schema.COLUMNS WHERE table_schema='" + schemaName + "' AND table_name='" + tableName + "'"; +// try (PreparedStatement ps = connection.prepareStatement(extraSql); +// ResultSet rs = ps.executeQuery(); +// ) { +// while (rs.next()) { +// String columnName = rs.getString("column_name"); +// String dataType = rs.getString("data_type"); +// String columnSize = rs.getString("column_size"); +// String decimalDigits = rs.getString("decimal_digits"); +// String columnComment = rs.getString("column_comment"); +// if (columnName != null) { +// for (ColumnDescription cd : columnDescriptions) { +// if (columnName.equals(cd.getFieldName())) { +// cd.setFieldTypeName(dataType); +// int csize = columnSize != null ? Integer.parseInt(columnSize) : 0; +// cd.setDisplaySize(csize); +// cd.setPrecisionSize(csize); +// cd.setScaleSize(decimalDigits != null ? Integer.parseInt(decimalDigits) : 0); +// cd.setRemarks(columnComment); +// break; +// } +// } +// } +// } +// } catch (SQLException e) { +// throw new RuntimeException(schemaName + "." + tableName + " queryTableColumnMeta error!!", e); +// } +// +// return columnDescriptions; + return null; + } + + @Override + public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, + boolean addCr, boolean withRemarks) { + String fieldname = v.getName(); + int length = v.getLength(); + int precision = v.getPrecision(); + int type = v.getType(); + + String retval = " `" + fieldname + "` "; + boolean canHaveDefaultValue = true; + switch (type) { + case ColumnMetaData.TYPE_TIMESTAMP: + case ColumnMetaData.TYPE_TIME: + retval += "DATETIME"; + break; + case ColumnMetaData.TYPE_DATE: + retval += "DATE"; + break; + case ColumnMetaData.TYPE_BOOLEAN: + retval += "TINYINT"; + break; + case ColumnMetaData.TYPE_NUMBER: + case ColumnMetaData.TYPE_INTEGER: + case ColumnMetaData.TYPE_BIGNUMBER: + if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) { + retval += "BIGINT"; + } else { + // Integer values... + if (precision == 0) { + if (length > 9) { + if (length < 19) { + // can hold signed values between -9223372036854775808 and 9223372036854775807 + // 18 significant digits + retval += "BIGINT"; + } else { + retval += "DECIMAL(" + length + ")"; + } + } else { + retval += "INT"; + } + } else { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + // Floating point values... + /*if (length > 15) { + retval += "DECIMAL(" + length; + if (precision > 0) { + retval += ", " + precision; + } + retval += ")"; + } else { + // A double-precision floating-point number is accurate to approximately 15 + // decimal places. + // http://mysql.mirrors-r-us.net/doc/refman/5.1/en/numeric-type-overview.html + retval += "DOUBLE"; + }*/ + } + } + break; + case ColumnMetaData.TYPE_STRING: + if (length * 3 <= 65533) { + retval += "VARCHAR(" + length * 3 + ")"; + } else { + retval += "TEXT"; + canHaveDefaultValue = false; + } + break; + default: + retval += "TEXT"; + canHaveDefaultValue = false; + break; + } + + if (!v.isNullable()) { + retval += " NOT NULL"; + } + + if (canHaveDefaultValue && v.getDefaultValue() != null && !"null".equals(v.getDefaultValue()) && !"NULL".equals(v.getDefaultValue())) { + if (type != ColumnMetaData.TYPE_TIMESTAMP && type != ColumnMetaData.TYPE_TIME && type != ColumnMetaData.TYPE_DATE) { + if (v.getDefaultValue().startsWith("'")) { + retval += " DEFAULT " + v.getDefaultValue(); + } else { + retval += " DEFAULT '" + v.getDefaultValue() + "'"; + } + } else { + retval += " DEFAULT CURRENT_TIMESTAMP"; + } + } + + + if (withRemarks && StringUtils.isNotBlank(v.getRemarks())) { + retval += String.format(" COMMENT '%s' ", v.getRemarks().replace("'", "\\'")); + } + + if (addCr) { + retval += Const.CR; + } + + return retval; + } + + @Override + public boolean canCreateIndex(ColumnMetaData v) { + return false; + } + + @Override + public String getPrimaryKeyAsString(List pks) { + if (null != pks && !pks.isEmpty()) { + return "`" + + StringUtils.join(pks, "` , `") + + "`"; + } + + return ""; + } + + @Override + public void setColumnDefaultValue(Connection connection, String schemaName, String tableName, List columnDescriptions) { + String sql = this.getDefaultValueSql(schemaName, tableName); + try (Statement st = connection.createStatement()) { + try (ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + String columnName = rs.getString("Field"); + String columnDefault = rs.getString("Default"); + if (columnName != null) { + for (ColumnDescription cd : columnDescriptions) { + if (columnName.equals(cd.getFieldName())) { + cd.setDefaultValue(columnDefault); + break; + } + } + } + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + protected String getDefaultValueSql(String schemaName, String tableName) { + return String.format("desc `%s`.`%s`", schemaName, tableName); + } + + + @Override + public List queryTablePrimaryKeys(Connection connection, String schemaName, + String tableName) { + Set ret = new HashSet<>(); + String sql = String.format("desc `%s`.`%s`", schemaName, tableName); + try (PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + ) { + //看下是否又none的字段,如果有,说明key模式为DUPLICATE KEY 可重复 + boolean NoneExtra = false; + while (rs.next()) { + String field = rs.getString("Field"); + String key = rs.getString("Key"); + String extra = rs.getString("Extra"); + if ("true".equalsIgnoreCase(key)) { + ret.add(field); + } else { + if ("NONE".equalsIgnoreCase(extra)) { + NoneExtra = true; + } + } + } + if (NoneExtra) { + return new ArrayList<>(); + } + return new ArrayList<>(ret); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void setColumnIndexInfo(Connection connection, String schemaName, String tableName, List columnDescriptions) { + } + + @Override + public List getTableColumnCommentDefinition(TableDescription td, + List cds) { + return Collections.emptyList(); + } + +} diff --git a/srt-cloud-framework/srt-cloud-flink/build/app/flink-app-1.14-2.0.0-jar-with-dependencies.jar b/srt-cloud-framework/srt-cloud-flink/build/app/flink-app-1.14-2.0.0-jar-with-dependencies.jar index 7550800fff77d5025734a2d3f77357e495575c25..6163b1747e573b9ac5063dba86f04cb61ed79e40 100644 GIT binary patch delta 405342 zcmY&=bwCwc*Z$ozbNU<(-EnA8Q7p=X@BylnSLYnr&rf#`4fI+Oe>rZohv zZ|!MDTNGGhciFR3wlvQJhm7{czjBE7o3%zCrq0__XhxTx6R+MFVx|W%irYIGcvp4$ zj)cbh;7S6V;%bIh+-vlQ=5w6!Aou*)`jt_s4!Ztr8j{Y=jwE6A6d0|PZ9SG%%MZe!lf2+V_u z%ov(@T6|hO-w9kBXZag|UefJU790%{-Wq|$v?84Z$_8cg1Oi^XiDp6CJ}5&@_xj^t zf=gmiI|fRpn!jOaNpEqDM?}6c<~`rP(ZcTit5>Sn@c3oWm>0d7)$13(EF#bKb#K73}FH2gN^kq!KzOjKlZZ ztV-+zeV2`x&jG8SXrswi#OBDL#~N;*3@(@pD;XLeg7ZcB_bhRzX(3L;kdF!DWMH~; zM5qBAJjngcfgjD;&cM{i7Bg@HZ`^T_f_=1rBeM8#4z+{Q+d0Jy{9Vh1bCCCGjR$U+ z&hPdzkTgBfnSg6`&O!nOCwkeiuu{_2nT2KlCYmbwOSMJD{J4-}OI|1C6g2CRDUtDi zlQg9e6w8qa6+G7NUBWhx8-M!lY&jooy2gsnGL>-rq~-6Fuq((?&jYr3q_t+Du;^W- z9F8~j($j-^qhi{!LT)xkE=g!cC5|m0sR*&;>jKkk=m$JDgEN!&Rx{w&G5C~**2J3N z;6W5;N6Sxf#EANgG$96XXQJe9mKMAamj-Wh_s@qCJ}><)m-*6^7{TNtmWw!H`FW1S z5$MtJ{a_Y`8qI#qK)TQS&Jv;XRgO$&_>*1VuchZ7q1_bR$~p3of$L7QFG*l{iKU?# z?^Dy(7^W4c9pj*#PjNLPd}kzN7X$YiETs(nHN}>g^WN{?neuhT5+&_1)t2a>-Q%=a z11OZ_zO@JMAS*i#q<*=+O8C3K)hNQ>?tIUfPukVSmM@;zPQqX7e9!XF7{`pw)u%-> zB}5NSo|&y;VCY1v@$8@TizJ*a?^!n678IUqIR)SFOVS5?`^L(R!E|r&c>*pqv;A3` zQe%N574-YPBQ3+GCFJ>rBrs4?H+v2Xb0XH>A&{^4p+QE?r-+8G*G{P^EpD_XYCg?IUH{nvXVg3Eo++PvZjOp?ntDbB{dR=Z6R;otAwdEw z@5Y{!LZXTFc@4b364IT4oIz)P5!n4bm*HUUybrUO{P=Y&1GDAphH?;*H>Vc^E42IC z8N%yvXQV8Q^KT!lg1np$fpTHmQYq;og_F)Bzi^;%x!*}4Y|fIB0v1|~Sl5%|H(e+* z=8ICSTkx~|M%p&FXtGL2q-4sbC{O@y+~%m+m?T@TpPeZHOFNJ~Cp#=Zf(W{82D z*TuK*{@+ja_{V0w<-CvINaO!rsvR6pXpde`p19705po241vRXU9vP^Fdpp{%BB0!F zUBbef?lL_>zv?;ST*xQyx29=LQesQPw2njuU)J77^Kien?7Iq*#?DPuz}|{|r!?T6 zH1`Ap!-v%E{u?fQv~EWVHr07Cu=#2Gi+XVX@Z3lYa*BJOkVE-_x&spEJAVB?92``2 znA8T6WfjW_wEWgPN&?;X$Xp0a)QpOe!dU7xUhsqox5J#Z=fRH~-Z z0x?83Q+QcIU6G=mf%uQ3an^mMb{J|z7%vEA=xabv0B+Ta?s{YwzBgG9$ih|{jMswl`%#Ffi;I78N;gg87~Np9A$=+BRitIjc>fU z-cbfE4|rQ}FzCUfIF4?*Dz5skuSOY)_c5Rk@K^)(2kPfbVEP&Fwx-nhp_m;&^haD` zCqte1r-=)tz$BF3F^0y=p|4oz^z~5yfs3t^tq8xleX=qC@Ih!-sLUumK%o4fs*vRs z2TG0kr`?l%q16lBT|$?=5Z8-Yfod79Q|aS#1iVkG9uwNDL3B@-pVYU4a!)><@RKX+ zq>!5OAJq14Kt8EVlz-e=*}UXV{P6k7a#� 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

L*TP! zh%VFlM|!a2=6oIOU(Mg2>mn8G2Xv7J`d#P8Sp#Lx8Fe4=%6IsU2me=p7JtE8P>K)Q zBtD{q4Wss}*zp3>{Pn1DHSu8DC>7IOcf#msKeBrc?8?O}y=83sIX>D0-t}e{g|IT0 ze!R4RFos+vbazrx$JNik8yK+P@-?J?zZz%AHQY>$qoLxj-^f-eNbhIP())U$$)JUK zs@4RaJ{XgjEjQlzVEBHt2+w&^{l-0;a zUqw(TMV^3Txt8$3x*PYHsBsWAz^MA@k)I|68but*wTG>D=(DkBlXbG8)M=|I0|%#key@P{DoMSu%kn=$%^8TAW&-asaq=UNK40FjSkJrp!zf|a#`HGYKz zbnJv`V4Y1e>6E^5DOMYTbj^gw)g{XE^^FRxL1Lq{`g4n zZbtLRIr6!`3wfkpovLLeEv>+lKQrqmoSo~fwn9}sW9d&!&ASKS0;Kr#uw^B9r4zrE z9f#FKlP2*h)@mp}TrOi=^NQKh=$z3C6ta7x-wSO17gPDR5WlY=gjpd}dm$XCzHVV* zuoHZ|Fi0Wxxi&q7nlvAwli6NF0 z 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