diff --git a/chat2db-client/src/components/ConnectionEdit/config/dataSource.ts b/chat2db-client/src/components/ConnectionEdit/config/dataSource.ts index f14c8651..72d71ba8 100644 --- a/chat2db-client/src/components/ConnectionEdit/config/dataSource.ts +++ b/chat2db-client/src/components/ConnectionEdit/config/dataSource.ts @@ -254,6 +254,10 @@ export const dataSourceFormConfigs: IConnectionConfig[] = [ { "key": "useInformationSchema", "value": "true" + }, + { + "key": "tinyInt1isBit", + "value": "false" } ], type: DatabaseTypeCode.MYSQL, diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java index 626a60b4..50e7322f 100644 --- a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java @@ -31,6 +31,35 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData { } + private static String TABLES_SQL + = "SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, VERSION, TABLE_ROWS, DATA_LENGTH, AUTO_INCREMENT, CREATE_TIME, UPDATE_TIME, TABLE_COLLATION, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = '%s'"; + @Override + public List tables(Connection connection, @NotEmpty String databaseName, String schemaName, String tableName) { + String sql = String.format(TABLES_SQL, databaseName); + if(StringUtils.isNotBlank(tableName)){ + sql += " AND TABLE_NAME = '" + tableName + "'"; + } + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + List
tables = new ArrayList<>(); + while (resultSet.next()) { + Table table = new Table(); + table.setDatabaseName(databaseName); + table.setSchemaName(schemaName); + table.setName(resultSet.getString("TABLE_NAME")); + table.setEngine(resultSet.getString("ENGINE")); + table.setRows(resultSet.getLong("TABLE_ROWS")); + table.setDataLength(resultSet.getLong("DATA_LENGTH")); + table.setCreateTime(resultSet.getString("CREATE_TIME")); + table.setUpdateTime(resultSet.getString("UPDATE_TIME")); + table.setCollate(resultSet.getString("TABLE_COLLATION")); + table.setComment(resultSet.getString("TABLE_COMMENT")); + tables.add(table); + } + return tables; + }); + } + + @Override public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName, @NotEmpty String tableName) { @@ -70,12 +99,12 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData { } return f; }); - String functionDDlSql =String.format("SHOW CREATE FUNCTION %s", functionName); - SQLExecutor.getInstance().execute(connection,functionDDlSql, resultSet -> { + String functionDDlSql = String.format("SHOW CREATE FUNCTION %s", functionName); + SQLExecutor.getInstance().execute(connection, functionDDlSql, resultSet -> { if (resultSet.next()) { function.setFunctionBody(resultSet.getString("Create Function")); } - } ); + }); return function; } @@ -103,6 +132,7 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData { }); } + @Override public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName, String triggerName) { @@ -123,15 +153,15 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData { @Override public List procedures(Connection connection, String databaseName, String schemaName) { String sql = "SHOW PROCEDURE STATUS WHERE Db = DATABASE()"; - return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { - ArrayList procedures = new ArrayList<>(); - while (resultSet.next()){ - Procedure procedure = new Procedure(); - procedure.setProcedureName(resultSet.getString("Name")); - procedures.add(procedure); - } - return procedures; - }); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + ArrayList procedures = new ArrayList<>(); + while (resultSet.next()) { + Procedure procedure = new Procedure(); + procedure.setProcedureName(resultSet.getString("Name")); + procedures.add(procedure); + } + return procedures; + }); } @Override @@ -214,7 +244,7 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData { } } - private static String VIEW_DDL_SQL="show create view %s"; + private static String VIEW_DDL_SQL = "show create view %s"; @Override public Table view(Connection connection, String databaseName, String schemaName, String viewName) { diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlValueHandler.java b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlValueHandler.java index 417ed5fc..ed70d6f4 100644 --- a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlValueHandler.java +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlValueHandler.java @@ -17,24 +17,28 @@ public class MysqlValueHandler extends DefaultValueHandler { @Override public String getString(ResultSet rs, int index, boolean limitSize) throws SQLException { - Object obj = rs.getObject(index); - if (obj == null) { - return null; - } - String columnTypeName = rs.getMetaData().getColumnTypeName(index); - if (MysqlColumnTypeEnum.GEOMETRY.name().equalsIgnoreCase(columnTypeName) - || MysqlColumnTypeEnum.POINT.name().equalsIgnoreCase(columnTypeName) - || MysqlColumnTypeEnum.LINESTRING.name().equalsIgnoreCase(columnTypeName) - || MysqlColumnTypeEnum.POLYGON.name().equalsIgnoreCase(columnTypeName) - || MysqlColumnTypeEnum.MULTIPOINT.name().equalsIgnoreCase(columnTypeName) - || MysqlColumnTypeEnum.MULTILINESTRING.name().equalsIgnoreCase(columnTypeName) - || MysqlColumnTypeEnum.MULTIPOLYGON.name().equalsIgnoreCase(columnTypeName) - || MysqlColumnTypeEnum.GEOMETRYCOLLECTION.name().equalsIgnoreCase(columnTypeName) - ) { - ValueHandler handler = VALUE_HANDLER_MAP.get(MysqlColumnTypeEnum.GEOMETRY.name()); - return handler.getString(rs, index, limitSize); - } else { - return super.getString(rs, index, limitSize); + try { + Object obj = rs.getObject(index); + if (obj == null) { + return null; + } + String columnTypeName = rs.getMetaData().getColumnTypeName(index); + if (MysqlColumnTypeEnum.GEOMETRY.name().equalsIgnoreCase(columnTypeName) + || MysqlColumnTypeEnum.POINT.name().equalsIgnoreCase(columnTypeName) + || MysqlColumnTypeEnum.LINESTRING.name().equalsIgnoreCase(columnTypeName) + || MysqlColumnTypeEnum.POLYGON.name().equalsIgnoreCase(columnTypeName) + || MysqlColumnTypeEnum.MULTIPOINT.name().equalsIgnoreCase(columnTypeName) + || MysqlColumnTypeEnum.MULTILINESTRING.name().equalsIgnoreCase(columnTypeName) + || MysqlColumnTypeEnum.MULTIPOLYGON.name().equalsIgnoreCase(columnTypeName) + || MysqlColumnTypeEnum.GEOMETRYCOLLECTION.name().equalsIgnoreCase(columnTypeName) + ) { + ValueHandler handler = VALUE_HANDLER_MAP.get(MysqlColumnTypeEnum.GEOMETRY.name()); + return handler.getString(rs, index, limitSize); + } else { + return super.getString(rs, index, limitSize); + } + }catch (Exception e){ + return rs.getString(index); } } diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/mysql.json b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/mysql.json index 93ed97ba..ff869c55 100644 --- a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/mysql.json +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/mysql.json @@ -17,6 +17,11 @@ "key": "zeroDateTimeBehavior", "value": "convertToNull", "required": false + }, + { + "key": "tinyInt1isBit", + "value": "false", + "required": false } ] }, @@ -34,6 +39,11 @@ "key": "characterEncoding", "value": "UTF-8", "required": false + }, + { + "key": "tinyInt1isBit", + "value": "false", + "required": false } ] } diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlColumnTypeEnum.java b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlColumnTypeEnum.java index a26b73b0..636ccd6a 100644 --- a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlColumnTypeEnum.java +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlColumnTypeEnum.java @@ -15,9 +15,9 @@ public enum MysqlColumnTypeEnum implements ColumnBuilder { BIT("BIT", true, false, true, false, false, false, true, true, false, false), - TINYINT("TINYINT", true, false, true, true, false, false, true, true, false, false), + TINYINT("TINYINT", false, false, true, true, false, false, true, true, false, false), - TINYINT_UNSIGNED("TINYINT UNSIGNED", true, false, true, true, false, false, true, true, false, false), + TINYINT_UNSIGNED("TINYINT UNSIGNED", false, false, true, true, false, false, true, true, false, false), SMALLINT("SMALLINT", false, false, true, true, false, false, true, true, false, false), @@ -284,7 +284,7 @@ public enum MysqlColumnTypeEnum implements ColumnBuilder { } - if (Arrays.asList(DECIMAL, FLOAT, DOUBLE,TINYINT).contains(type)) { + if (Arrays.asList(DECIMAL, FLOAT, DOUBLE).contains(type)) { if (column.getColumnSize() == null || column.getDecimalDigits() == null) { return columnType; } @@ -296,7 +296,7 @@ public enum MysqlColumnTypeEnum implements ColumnBuilder { } } - if (Arrays.asList(DECIMAL_UNSIGNED, FLOAT_UNSIGNED, DECIMAL_UNSIGNED,TINYINT_UNSIGNED).contains(type)) { + if (Arrays.asList(DECIMAL_UNSIGNED, FLOAT_UNSIGNED, DECIMAL_UNSIGNED).contains(type)) { if (column.getColumnSize() == null || column.getDecimalDigits() == null) { return columnType; } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultValueHandler.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultValueHandler.java index 5c7d1015..d05a7826 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultValueHandler.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultValueHandler.java @@ -18,11 +18,11 @@ public class DefaultValueHandler implements ValueHandler { @Override public String getString(ResultSet rs, int index, boolean limitSize) throws SQLException { - Object obj = rs.getObject(index); - if (obj == null) { - return null; - } try { + Object obj = rs.getObject(index); + if (obj == null) { + return null; + } if (obj instanceof BigDecimal bigDecimal) { return bigDecimal.toPlainString(); } else if (obj instanceof Double d) { @@ -41,8 +41,8 @@ public class DefaultValueHandler implements ValueHandler { return obj.toString(); } } catch (Exception e) { - log.warn("Failed to parse number:{},{}", index, obj, e); - return obj.toString(); + log.warn("Failed to parse number:{},", index, e); + return rs.getString(index); } } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java index a75e87cd..ac080f75 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/Table.java @@ -98,5 +98,13 @@ public class Table implements Serializable { private String tablespace; + + private Long rows; + + private Long dataLength; + + private String createTime; + + private String updateTime; } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java index de724852..05f248ff 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java @@ -412,28 +412,28 @@ public class SQLExecutor implements CommandExecutor { DatabaseMetaData metadata = connection.getMetaData(); ResultSet resultSet = metadata.getTables(databaseName, schemaName, tableName, types); - // If connection is mysql - if ("MySQL".equalsIgnoreCase(metadata.getDatabaseProductName())) { - // Get the comment of mysql table - List
tables = ResultSetUtils.toObjectList(resultSet, Table.class); - if (CollectionUtils.isNotEmpty(tables)) { - for (Table table : tables) { - String sql = "show table status where name = '" + table.getName() + "'"; - try (Statement stmt = connection.createStatement()) { - boolean query = stmt.execute(sql); - if (query) { - try (ResultSet rs = stmt.getResultSet();) { - while (rs.next()) { - table.setComment(rs.getString("Comment")); - } - } - } - } - } - - return tables; - } - } +// // If connection is mysql +// if ("MySQL".equalsIgnoreCase(metadata.getDatabaseProductName())) { +// // Get the comment of mysql table +// List
tables = ResultSetUtils.toObjectList(resultSet, Table.class); +// if (CollectionUtils.isNotEmpty(tables)) { +// for (Table table : tables) { +// String sql = "show table status where name = '" + table.getName() + "'"; +// try (Statement stmt = connection.createStatement()) { +// boolean query = stmt.execute(sql); +// if (query) { +// try (ResultSet rs = stmt.getResultSet();) { +// while (rs.next()) { +// table.setComment(rs.getString("Comment")); +// } +// } +// } +// } +// } +// +// return tables; +// } +// } return ResultSetUtils.toObjectList(resultSet, Table.class); } catch (SQLException e) { throw new RuntimeException(e);