fix(X-Pack): 修复数据填报建表时包含大写字母时可能会导致查询数据页面报错的问题

This commit is contained in:
ulleo 2024-04-02 14:37:15 +08:00
parent fb936ac977
commit ca5650ed65
6 changed files with 53 additions and 13 deletions

View File

@ -103,8 +103,12 @@ public class JdbcProvider extends DefaultJdbcProvider {
@Override
public List<TableField> getTableFields(DatasourceRequest datasourceRequest) throws Exception {
String requestTableName = datasourceRequest.getTable();
if (datasourceRequest.isLowerCaseTaleNames()) {
requestTableName = requestTableName.toLowerCase();
}
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase("mongo")) {
datasourceRequest.setQuery("select * from " + datasourceRequest.getTable());
datasourceRequest.setQuery("select * from " + requestTableName);
return fetchResultField(datasourceRequest);
}
List<TableField> list = new LinkedList<>();
@ -117,7 +121,7 @@ public class JdbcProvider extends DefaultJdbcProvider {
}
}
DatabaseMetaData databaseMetaData = connection.getMetaData();
String tableNamePattern = datasourceRequest.getTable();
String tableNamePattern = requestTableName;
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.mysql.name())) {
if (databaseMetaData.getDriverMajorVersion() < 8) {
tableNamePattern = String.format(MySQLConstants.KEYWORD_TABLE, tableNamePattern);
@ -146,22 +150,25 @@ public class JdbcProvider extends DefaultJdbcProvider {
} else {
database = primaryKeys.getString("TABLE_CAT");
}
if (datasourceRequest.isLowerCaseTaleNames()) {
tableName = tableName.toLowerCase();
}
//获取主键的名称
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.pg.name())) {
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
if (tableName.equals(requestTableName) && database.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
primaryKeySet.add(primaryKeys.getString("COLUMN_NAME"));
}
} else if (datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.sqlServer.name())) {
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest)) && schema.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
if (tableName.equals(requestTableName) && database.equalsIgnoreCase(getDatabase(datasourceRequest)) && schema.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
primaryKeySet.add(primaryKeys.getString("COLUMN_NAME"));
}
} else {
if (database != null) {
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))) {
if (tableName.equals(requestTableName) && database.equalsIgnoreCase(getDatabase(datasourceRequest))) {
primaryKeySet.add(primaryKeys.getString("COLUMN_NAME"));
}
} else {
if (tableName.equals(datasourceRequest.getTable())) {
if (tableName.equals(requestTableName)) {
primaryKeySet.add(primaryKeys.getString("COLUMN_NAME"));
}
}
@ -179,24 +186,27 @@ public class JdbcProvider extends DefaultJdbcProvider {
} else {
database = resultSet.getString("TABLE_CAT");
}
if (datasourceRequest.isLowerCaseTaleNames()) {
tableName = tableName.toLowerCase();
}
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.pg.name())) {
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
if (tableName.equals(requestTableName) && database.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
TableField tableField = getTableFiled(resultSet, datasourceRequest, primaryKeySet);
list.add(tableField);
}
} else if (datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.sqlServer.name())) {
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest)) && schema.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
if (tableName.equals(requestTableName) && database.equalsIgnoreCase(getDatabase(datasourceRequest)) && schema.equalsIgnoreCase(getDsSchema(datasourceRequest))) {
TableField tableField = getTableFiled(resultSet, datasourceRequest, primaryKeySet);
list.add(tableField);
}
} else {
if (database != null) {
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))) {
if (tableName.equals(requestTableName) && database.equalsIgnoreCase(getDatabase(datasourceRequest))) {
TableField tableField = getTableFiled(resultSet, datasourceRequest, primaryKeySet);
list.add(tableField);
}
} else {
if (tableName.equals(datasourceRequest.getTable())) {
if (tableName.equals(requestTableName)) {
TableField tableField = getTableFiled(resultSet, datasourceRequest, primaryKeySet);
list.add(tableField);
}
@ -209,7 +219,7 @@ public class JdbcProvider extends DefaultJdbcProvider {
DataEaseException.throwException(e);
} catch (Exception e) {
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase("ds_doris") || datasourceRequest.getDatasource().getType().equalsIgnoreCase("StarRocks")) {
datasourceRequest.setQuery("select * from " + datasourceRequest.getTable());
datasourceRequest.setQuery("select * from " + requestTableName);
return fetchResultField(datasourceRequest);
} else {
DataEaseException.throwException(Translator.get("i18n_datasource_connect_error") + e.getMessage());

View File

@ -26,6 +26,11 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider {
private static final String dropTableSql = "DROP TABLE IF EXISTS `TABLE_NAME`";
@Override
public String getLowerCaseTaleNames() {
return "SHOW VARIABLES LIKE 'lower_case_table_names'";
}
@Override
public String dropTableSql(String table) {
return dropTableSql.replace("TABLE_NAME", table);

View File

@ -11,6 +11,7 @@ import io.dataease.ext.ExtDataFillFormMapper;
import io.dataease.plugins.common.base.domain.DataFillFormWithBLOBs;
import io.dataease.plugins.common.base.domain.Datasource;
import io.dataease.plugins.common.base.mapper.DataFillFormMapper;
import io.dataease.plugins.common.constants.DatasourceTypes;
import io.dataease.plugins.common.dto.datafill.ExtTableField;
import io.dataease.plugins.common.dto.datasource.TableField;
import io.dataease.plugins.common.exception.DataEaseException;
@ -76,6 +77,23 @@ public class DataFillDataService {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(ds);
datasourceRequest.setTable(dataFillForm.getTableName());
ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType());
DatasourceTypes datasourceType = DatasourceTypes.valueOf(ds.getType());
switch (datasourceType) {
case mysql:
case mariadb:
String checkLowerCaseSql = extDDLProvider.getLowerCaseTaleNames();
datasourceRequest.setQuery(checkLowerCaseSql);
List<String[]> checkLowerCaseData = datasourceProvider.getData(datasourceRequest);
long lowCase = NumberUtils.toLong(checkLowerCaseData.get(0)[1]);
datasourceRequest.setLowerCaseTaleNames(lowCase > 0);
break;
default:
datasourceRequest.setLowerCaseTaleNames(true);
}
List<TableField> tableFields = datasourceProvider.getTableFields(datasourceRequest);
Map<String, ExtTableField.BaseType> extTableFieldTypeMap = new HashMap<>();
Map<String, TableField> tableFieldMap = new HashMap<>();
@ -125,7 +143,6 @@ public class DataFillDataService {
}
}
ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType());
String whereSql = "";
if (StringUtils.isNoneBlank(searchRequest.getPrimaryKeyValue())) {

View File

@ -17,7 +17,7 @@ import java.util.regex.Pattern;
@Setter
public class DatasourceRequest {
private final String REG_WITH_SQL_FRAGMENT = "((?i)WITH[\\s\\S]+(?i)AS?\\s*\\([\\s\\S]+\\))\\s*(?i)SELECT";
private Pattern WITH_SQL_FRAGMENT = Pattern.compile(REG_WITH_SQL_FRAGMENT);
private Pattern WITH_SQL_FRAGMENT = Pattern.compile(REG_WITH_SQL_FRAGMENT);
protected String query;
@ -43,6 +43,7 @@ public class DatasourceRequest {
private boolean totalPageFlag;
private List<TableFieldWithValue> tableFieldWithValues;
private boolean lowerCaseTaleNames;
@Getter
@Setter

View File

@ -66,4 +66,9 @@ public class DefaultExtDDLProvider extends ExtDDLProvider {
public String whereSql(String tableName, List<TableField> searchFields) {
return null;
}
@Override
public String getLowerCaseTaleNames() {
return null;
}
}

View File

@ -32,4 +32,6 @@ public abstract class ExtDDLProvider {
public abstract String checkUniqueValueSql(String tableName, DatasourceRequest.TableFieldWithValue field, DatasourceRequest.TableFieldWithValue pk);
public abstract String whereSql(String tableName, List<TableField> searchFields);
public abstract String getLowerCaseTaleNames();
}