From 3268385b2a9075931730df738f220eb07f6c0783 Mon Sep 17 00:00:00 2001 From: inrgihc Date: Tue, 8 Mar 2022 22:36:33 +0800 Subject: [PATCH] =?UTF-8?q?fix=20bug:=20oracle=E4=B8=BB=E9=94=AE=E4=B8=8EP?= =?UTF-8?q?ostgreSQL=E8=A1=A8=E7=9A=84DDL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/DbConnectionCreateRequest.java | 6 +-- .../request/DbConnectionUpdateRequest.java | 6 +-- .../database/impl/DatabaseGreenplumImpl.java | 29 +++++++++-- .../database/impl/DatabaseOracleImpl.java | 8 +-- .../database/impl/DatabasePostgresImpl.java | 49 ++++++++++++++++--- 5 files changed, 77 insertions(+), 21 deletions(-) diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionCreateRequest.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionCreateRequest.java index 5c60b0a6..54fc5fd6 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionCreateRequest.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionCreateRequest.java @@ -28,10 +28,10 @@ public class DbConnectionCreateRequest { public DatabaseConnectionEntity toDatabaseConnection() { DatabaseConnectionEntity databaseConnectionEntity = new DatabaseConnectionEntity(); databaseConnectionEntity.setId(null); - databaseConnectionEntity.setName(name); + databaseConnectionEntity.setName(name.trim()); databaseConnectionEntity.setType(type); - databaseConnectionEntity.setDriver(driver); - databaseConnectionEntity.setUrl(url); + databaseConnectionEntity.setDriver(driver.trim()); + databaseConnectionEntity.setUrl(url.trim()); databaseConnectionEntity.setUsername(username); databaseConnectionEntity.setPassword(password); diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionUpdateRequest.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionUpdateRequest.java index f6309091..c0a66da8 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionUpdateRequest.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/DbConnectionUpdateRequest.java @@ -29,10 +29,10 @@ public class DbConnectionUpdateRequest { public DatabaseConnectionEntity toDatabaseConnection() { DatabaseConnectionEntity databaseConnectionEntity = new DatabaseConnectionEntity(); databaseConnectionEntity.setId(id); - databaseConnectionEntity.setName(name); + databaseConnectionEntity.setName(name.trim()); databaseConnectionEntity.setType(type); - databaseConnectionEntity.setDriver(driver); - databaseConnectionEntity.setUrl(url); + databaseConnectionEntity.setDriver(driver.trim()); + databaseConnectionEntity.setUrl(url.trim()); databaseConnectionEntity.setUsername(username); databaseConnectionEntity.setPassword(password); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java index 8823dd63..4005dc6b 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java @@ -19,7 +19,10 @@ import com.gitee.dbswitch.core.model.ColumnMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 支持Greenplum数据库的元信息实现 @@ -28,10 +31,18 @@ import java.util.List; */ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabaseInterface { + private static Set systemSchemas = new HashSet<>(); + private static final String SHOW_CREATE_VIEW_SQL = - "SELECT pg_get_viewdef((select pg_class.relfilenode from pg_catalog.pg_class \n" - + "join pg_catalog.pg_namespace on pg_class.relnamespace = pg_namespace.oid \n" - + "where pg_namespace.nspname='%s' and pg_class.relname ='%s'),true) "; + "select pg_get_viewdef('\"%s\".\"%s\"', true)"; + + static { + systemSchemas.add("gp_toolkit"); + systemSchemas.add("pg_aoseg"); + systemSchemas.add("information_schema"); + systemSchemas.add("pg_catalog"); + systemSchemas.add("pg_bitmapindex"); + } public DatabaseGreenplumImpl() { super("com.pivotal.jdbc.GreenplumDriver"); @@ -42,6 +53,14 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase return DatabaseTypeEnum.GREENPLUM; } + @Override + public List querySchemaList() { + List schemas = super.querySchemaList(); + return schemas.stream() + .filter(s -> !systemSchemas.contains(s)) + .collect(Collectors.toList()); + } + @Override public String getTableDDL(String schemaName, String tableName) { String sql = PostgresqlConst.CREATE_TABLE_SQL_TPL @@ -56,7 +75,9 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase } } } catch (SQLException e) { - throw new RuntimeException(e); + //throw new RuntimeException(e); + // TODO: Greenplum的表的DDL获取方法 + return e.getMessage(); } return null; diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java index 64d19697..bd9ce973 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java @@ -128,10 +128,10 @@ public class DatabaseOracleImpl extends AbstractDatabase implements IDatabaseInt // 使主键失效:alter table tableName disable primary key; // 使主键恢复:alter table tableName enable primary key; Set ret = new HashSet<>(); - String sql = String.format("SELECT COLUMN_NAME FROM user_cons_columns " - + "WHERE owner='%s' and constraint_name = " - + "(SELECT constraint_name FROM user_constraints WHERE table_name = '%s' " - + "AND constraint_type = 'P' and STATUS='ENABLED') ", + String sql = String.format( + "SELECT col.COLUMN_NAME FROM all_cons_columns col INNER JOIN all_constraints con \n" + + "ON col.constraint_name=con.constraint_name AND col.OWNER =con.OWNER AND col.TABLE_NAME =con.TABLE_NAME \n" + + "WHERE con.constraint_type = 'P' and con.STATUS='ENABLED' and con.owner='%s' AND con.table_name='%s'", schemaName, tableName); try (PreparedStatement ps = this.connection.prepareStatement(sql); ResultSet rs = ps.executeQuery(); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java index 640624fa..bdda46bc 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java @@ -20,7 +20,10 @@ import com.gitee.dbswitch.core.util.DDLFormatterUtils; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 支持PostgreSQL数据库的元信息实现 @@ -29,10 +32,21 @@ import java.util.List; */ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseInterface { - private static final String SHOW_CREATE_VIEW_SQL = + private static Set systemSchemas = new HashSet<>(); + + private static final String SHOW_CREATE_VIEW_SQL_1 = "SELECT pg_get_viewdef((select pg_class.relfilenode from pg_catalog.pg_class \n" + "join pg_catalog.pg_namespace on pg_class.relnamespace = pg_namespace.oid \n" + "where pg_namespace.nspname='%s' and pg_class.relname ='%s'),true) "; + private static final String SHOW_CREATE_VIEW_SQL_2 = + "select pg_get_viewdef('\"%s\".\"%s\"', true)"; + + static { + systemSchemas.add("pg_aoseg"); + systemSchemas.add("information_schema"); + systemSchemas.add("pg_catalog"); + systemSchemas.add("pg_bitmapindex"); + } public DatabasePostgresImpl() { super("org.postgresql.Driver"); @@ -43,6 +57,14 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI return DatabaseTypeEnum.POSTGRESQL; } + @Override + public List querySchemaList() { + List schemas = super.querySchemaList(); + return schemas.stream() + .filter(s -> !systemSchemas.contains(s)) + .collect(Collectors.toList()); + } + @Override public String getTableDDL(String schemaName, String tableName) { String sql = PostgresqlConst.CREATE_TABLE_SQL_TPL @@ -57,7 +79,9 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI } } } catch (SQLException e) { - throw new RuntimeException(e); + //throw new RuntimeException(e); + // 低版本的PostgreSQL的表的DDL获取方法 + return e.getMessage(); } return null; @@ -65,12 +89,23 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI @Override public String getViewDDL(String schemaName, String tableName) { - String sql = String.format(SHOW_CREATE_VIEW_SQL, schemaName, tableName); + String sql = String.format(SHOW_CREATE_VIEW_SQL_1, schemaName, tableName); try (Statement st = connection.createStatement()) { - if (st.execute(sql)) { - try (ResultSet rs = st.getResultSet()) { - if (rs != null && rs.next()) { - return rs.getString(1); + try { + if (st.execute(sql)) { + try (ResultSet rs = st.getResultSet()) { + if (rs != null && rs.next()) { + return rs.getString(1); + } + } + } + } catch (SQLException se) { + String.format(SHOW_CREATE_VIEW_SQL_2, schemaName, tableName); + if (st.execute(sql)) { + try (ResultSet rs = st.getResultSet()) { + if (rs != null && rs.next()) { + return rs.getString(1); + } } } }