소스 검색

优化读取表列信息

Signed-off-by: AE86 <836391306@qq.com>
AE86 2 년 전
부모
커밋
18b3dd6f55

+ 2 - 2
dbsyncer-connector/src/main/java/org/dbsyncer/connector/Connector.java

@@ -62,10 +62,10 @@ public interface Connector<M, C> {
      * 获取表元信息
      *
      * @param connectorMapper
-     * @param tableName
+     * @param tableNamePattern
      * @return
      */
-    MetaInfo getMetaInfo(M connectorMapper, String tableName);
+    MetaInfo getMetaInfo(M connectorMapper, String tableNamePattern);
 
     /**
      * 获取总数

+ 20 - 7
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java

@@ -67,13 +67,26 @@ public abstract class AbstractDatabaseConnector extends AbstractConnector implem
     }
 
     @Override
-    public MetaInfo getMetaInfo(DatabaseConnectorMapper connectorMapper, String tableName) {
-        String quotation = buildSqlWithQuotation();
-        DatabaseConfig config = connectorMapper.getConfig();
-        String queryMetaSql = new StringBuilder("SELECT * FROM ").append(getSchema(config, quotation)).append(quotation).append(tableName)
-                .append(quotation).append(" WHERE 1!=1").toString();
-
-        return connectorMapper.execute(databaseTemplate -> getMetaInfo(databaseTemplate, queryMetaSql, config.getSchema(), tableName));
+    public MetaInfo getMetaInfo(DatabaseConnectorMapper connectorMapper, String tableNamePattern) {
+        List<Field> fields = new ArrayList<>();
+        final String schema = getSchema(connectorMapper.getConfig());
+        connectorMapper.execute(databaseTemplate -> {
+            SimpleConnection connection = (SimpleConnection) databaseTemplate.getConnection();
+            Connection conn = connection.getConnection();
+            String catalog = conn.getCatalog();
+            String schemaNamePattern = null == schema ? conn.getSchema() : schema;
+            DatabaseMetaData metaData = conn.getMetaData();
+            List<String> primaryKeys = findTablePrimaryKeys(metaData, catalog, schemaNamePattern, tableNamePattern);
+            ResultSet columnMetadata = metaData.getColumns(catalog, schemaNamePattern, tableNamePattern, null);
+            while (columnMetadata.next()) {
+                String columnName = columnMetadata.getString(4);
+                int columnType = columnMetadata.getInt(5);
+                String typeName = columnMetadata.getString(6);
+                fields.add(new Field(columnName, typeName, columnType, primaryKeys.contains(columnName)));
+            }
+            return fields;
+        });
+        return new MetaInfo().setColumn(fields);
     }
 
     @Override

+ 1 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/AbstractDQLConnector.java

@@ -41,7 +41,7 @@ public abstract class AbstractDQLConnector extends AbstractDatabaseConnector {
         sql = sql.replace("\r", " ");
         sql = sql.replace("\n", " ");
         String queryMetaSql = StringUtil.contains(sql, " WHERE ") ? cfg.getSql() + " AND 1!=1 " : cfg.getSql() + " WHERE 1!=1 ";
-        return connectorMapper.execute(databaseTemplate -> super.getMetaInfo(databaseTemplate, queryMetaSql, cfg.getSchema(), cfg.getTable()));
+        return connectorMapper.execute(databaseTemplate -> super.getMetaInfo(databaseTemplate, queryMetaSql, getSchema(cfg), cfg.getTable()));
     }
 
     /**

+ 24 - 0
dbsyncer-connector/src/main/test/ConnectionTest.java

@@ -3,6 +3,7 @@ import org.dbsyncer.connector.config.DatabaseConfig;
 import org.dbsyncer.connector.database.DatabaseConnectorMapper;
 import org.dbsyncer.connector.database.ds.SimpleConnection;
 import org.dbsyncer.connector.enums.TableTypeEnum;
+import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.Table;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -117,6 +118,29 @@ public class ConnectionTest {
         getTables(createPostgresConfig(), "postgres", "public", null);
     }
 
+    @Test
+    public void testGetColumnsDetails() {
+        final String schema = "root";
+        final String tableNamePattern = "sw_test";
+        final DatabaseConnectorMapper connectorMapper = new DatabaseConnectorMapper(createMysqlConfig());
+        connectorMapper.execute(databaseTemplate -> {
+            SimpleConnection connection = (SimpleConnection) databaseTemplate.getConnection();
+            Connection conn = connection.getConnection();
+            String databaseCatalog = conn.getCatalog();
+            String schemaNamePattern = null == schema ? conn.getSchema() : schema;
+            List<Field> fields = new ArrayList<>();
+            DatabaseMetaData metaData = conn.getMetaData();
+            ResultSet columnMetadata = metaData.getColumns(databaseCatalog, schemaNamePattern, tableNamePattern, null);
+            while (columnMetadata.next()) {
+                String columnName = columnMetadata.getString(4);
+                int columnType = columnMetadata.getInt(5);
+                String typeName = columnMetadata.getString(6);
+                fields.add(new Field(columnName, typeName, columnType));
+            }
+            return fields;
+        });
+    }
+
     private List<Table> getTables(DatabaseConfig config, final String catalog, final String schema, final String tableNamePattern) {
         final DatabaseConnectorMapper connectorMapper = new DatabaseConnectorMapper(config);
         List<Table> tables = new ArrayList<>();

+ 5 - 5
dbsyncer-web/src/main/resources/public/index/index.html

@@ -106,7 +106,7 @@
                                 <div class="row mappingList">
                                     <!-- 驱动__开始 -->
                                     <div class="col-md-4" th:each="m,state : ${mappings}">
-                                        <div th:id="${m?.id}" th:class="${m?.meta?.model eq '全量'} ? 'jumbotron dbsyncer_block dbsyncer_block_full' : 'jumbotron dbsyncer_block dbsyncer_block_increment'">
+                                        <div th:id="${m?.id}" th:class="${m?.model eq 'full'} ? 'jumbotron dbsyncer_block dbsyncer_block_full' : 'jumbotron dbsyncer_block dbsyncer_block_increment'">
                                             <!--驱动标题信息 -->
                                             <div class="row text-center dbsyncer_driver_name" th:text="${m?.name}" th:title="${m?.name}"></div>
 
@@ -154,11 +154,11 @@
 
                                             <div class="row">
                                                 <table class="table table-hover">
-                                                    <tbody th:with="model=${m?.meta?.model},total=${m?.meta?.total},success=${m?.meta?.success},fail=${m?.meta?.fail},beginTime=${m?.meta?.beginTime},endTime=${m?.meta?.endTime}">
+                                                    <tbody th:with="model=${m?.model},total=${m?.meta?.total},success=${m?.meta?.success},fail=${m?.meta?.fail},beginTime=${m?.meta?.beginTime},endTime=${m?.meta?.endTime}">
                                                     <tr>
                                                         <td class="text-left">
-                                                            [[${model}]]同步>
-                                                            <span th:if="${model eq '全量'}">
+                                                            [[${m?.meta?.model}]]同步>
+                                                            <span th:if="${model eq 'full'}">
                                                                 总数:[[${total}]]
                                                                 <span th:if="${total gt 0 and (success + fail) gt 0}">,进度:[[${#numbers.formatPercent(((success + fail) / total), 2, 2)}]]</span>
                                                                 ,耗时:
@@ -167,7 +167,7 @@
                                                                     <span th:if="${seconds ge 60}" th:with="minutes=${seconds / 60}" th:text="${minutes + '分' + (seconds - minutes * 60) + '秒'}" />
                                                                 </span>
                                                             </span>
-                                                            <span th:if="${model eq '增量'}">
+                                                            <span th:if="${model eq 'increment'}">
                                                                 总数:[[${#numbers.formatDecimal((success + fail),0 ,0)}]]
                                                             </span>
                                                             <span th:if="${success gt 0}">,成功:[[${success}]]</span>