mirror of
				https://github.com/vran-dev/databasir.git
				synced 2025-10-31 12:39:20 +08:00 
			
		
		
		
	fix: sqlserver table sync incomplete (#164)
This commit is contained in:
		| @@ -12,9 +12,7 @@ import java.sql.Connection; | ||||
| import java.sql.PreparedStatement; | ||||
| import java.sql.ResultSet; | ||||
| import java.sql.SQLException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.*; | ||||
|  | ||||
| @RequiredArgsConstructor | ||||
| @Slf4j | ||||
| @@ -30,58 +28,31 @@ public class SqlServerTableMetaProvider implements TableMetaProvider { | ||||
|  | ||||
|     @Override | ||||
|     public List<TableMeta> selectTables(Connection connection, Condition condition) { | ||||
|         String sql = "SELECT sys.objects.name                            AS TABLE_NAME,\n" | ||||
|                 + "       sys.objects.type_desc                            AS TABLE_TYPE,\n" | ||||
|                 + "       CAST(extended_properties.value AS NVARCHAR(500)) AS REMARKS\n" | ||||
|                 + "FROM sys.objects\n" | ||||
|                 + "         LEFT JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id\n" | ||||
|                 + "         LEFT JOIN sys.extended_properties " | ||||
|                 + "ON sys.objects.object_id = sys.extended_properties.major_id\n" | ||||
|                 + "WHERE (type = 'U' OR type = 'V')\n" | ||||
|                 + "  AND sys.extended_properties.minor_id = 0\n" | ||||
|                 + "  AND sys.schemas.name LIKE ?;\n"; | ||||
|         PreparedStatement preparedStatement = null; | ||||
|         try { | ||||
|             preparedStatement = connection.prepareStatement(sql); | ||||
|             preparedStatement.setString(1, condition.getSchemaName()); | ||||
|             ResultSet results = preparedStatement.executeQuery(); | ||||
|             return doSelect(results, connection, condition); | ||||
|         } catch (SQLException e) { | ||||
|             log.warn("get table meta failed {}", e.getMessage()); | ||||
|             if (log.isDebugEnabled()) { | ||||
|                 log.debug("get table meta failed", e); | ||||
|             } | ||||
|             return Collections.emptyList(); | ||||
|         } finally { | ||||
|             if (preparedStatement != null) { | ||||
|                 try { | ||||
|                     preparedStatement.close(); | ||||
|                 } catch (SQLException e) { | ||||
|                     // ignore | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return doSelect(connection, condition); | ||||
|     } | ||||
|  | ||||
|     private List<TableMeta> doSelect(ResultSet tablesResult, | ||||
|                                      Connection connection, | ||||
|                                      Condition condition) throws SQLException { | ||||
|     private List<TableMeta> doSelect(Connection connection, Condition condition) { | ||||
|         List<TableMeta> tableMetas = new ArrayList<>(); | ||||
|         String databaseName = condition.getDatabaseName(); | ||||
|         Map<String, String> tableNameAndComment = tableNameAndCommentMap(connection, condition); | ||||
|         ResultSet tablesResult = null; | ||||
|         try { | ||||
|             tablesResult = connection.getMetaData() | ||||
|                     .getTables(databaseName, condition.getSchemaName(), null, new String[]{"TABLE"}); | ||||
|             while (tablesResult.next()) { | ||||
|                 String tableName = tablesResult.getString("TABLE_NAME"); | ||||
|                 if (condition.tableIsIgnored(tableName)) { | ||||
|                     if (log.isWarnEnabled()) { | ||||
|                         log.warn("ignored table: " + condition.getSchemaName() + "." + tableName); | ||||
|                     if (log.isDebugEnabled()) { | ||||
|                         log.debug("ignored table: " + databaseName + "." + tableName); | ||||
|                     } | ||||
|                 } else { | ||||
|                     String tableType = tablesResult.getString("TABLE_TYPE"); | ||||
|                     String tableComment = tablesResult.getString("REMARKS"); | ||||
|                     String tableComment = tableNameAndComment.getOrDefault(tableName, ""); | ||||
|                     TableCondition tableCondition = TableCondition.of(condition, tableName); | ||||
|                     List<ColumnMeta> columns = columnMetaProvider.selectColumns(connection, tableCondition); | ||||
|                     if (columns.isEmpty()) { | ||||
|                         if (log.isWarnEnabled()) { | ||||
|                             log.warn("ignored table: " + condition.getSchemaName() + "." + tableName | ||||
|                             log.warn("ignored table: " + databaseName + "." + tableName | ||||
|                                     + ", caused by get empty columns"); | ||||
|                         } | ||||
|                         continue; | ||||
| @@ -98,10 +69,78 @@ public class SqlServerTableMetaProvider implements TableMetaProvider { | ||||
|                     tableMetas.add(tableMeta); | ||||
|                 } | ||||
|             } | ||||
|         } catch (SQLException e) { | ||||
|             log.error("select tables error", e); | ||||
|             throw new IllegalStateException(e); | ||||
|         } finally { | ||||
|             tablesResult.close(); | ||||
|             if (tablesResult != null) { | ||||
|                 try { | ||||
|                     tablesResult.close(); | ||||
|                 } catch (SQLException e) { | ||||
|                     // ignore | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return tableMetas; | ||||
|     } | ||||
|  | ||||
|     public Map<String, String> tableNameAndCommentMap(Connection connection, Condition condition) { | ||||
|         String sql = "SELECT sys.objects.name                              AS TABLE_NAME,\n" | ||||
|                 + "       sys.objects.type_desc                            AS TABLE_TYPE,\n" | ||||
|                 + "       CAST(extended_properties.value AS NVARCHAR(500)) AS REMARKS\n" | ||||
|                 + "FROM sys.objects\n" | ||||
|                 + "         LEFT JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id\n" | ||||
|                 + "         LEFT JOIN sys.extended_properties " | ||||
|                 + "ON sys.objects.object_id = sys.extended_properties.major_id\n" | ||||
|                 + "WHERE (type = 'U' OR type = 'V')\n" | ||||
|                 + "  AND sys.extended_properties.minor_id = 0\n" | ||||
|                 + "  AND sys.schemas.name LIKE ?;\n"; | ||||
|         PreparedStatement preparedStatement = null; | ||||
|         try { | ||||
|             preparedStatement = connection.prepareStatement(sql); | ||||
|             preparedStatement.setString(1, condition.getSchemaName()); | ||||
|             ResultSet results = preparedStatement.executeQuery(); | ||||
|             return tableNameAndCommentMap(results, connection, condition); | ||||
|         } catch (SQLException e) { | ||||
|             log.warn("get table meta failed {}", e.getMessage()); | ||||
|             if (log.isDebugEnabled()) { | ||||
|                 log.debug("get table meta failed", e); | ||||
|             } | ||||
|             return Collections.emptyMap(); | ||||
|         } finally { | ||||
|             if (preparedStatement != null) { | ||||
|                 try { | ||||
|                     preparedStatement.close(); | ||||
|                 } catch (SQLException e) { | ||||
|                     // ignore | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private Map<String, String> tableNameAndCommentMap(ResultSet tablesResult, | ||||
|                                                        Connection connection, | ||||
|                                                        Condition condition) throws SQLException { | ||||
|  | ||||
|         Map<String, String> tableNameAndCommentMap = new HashMap<>(); | ||||
|         try { | ||||
|             while (tablesResult.next()) { | ||||
|                 String tableName = tablesResult.getString("TABLE_NAME"); | ||||
|                 if (condition.tableIsIgnored(tableName)) { | ||||
|                     if (log.isDebugEnabled()) { | ||||
|                         log.debug("ignored table: " + condition.getSchemaName() + "." + tableName); | ||||
|                     } | ||||
|                 } else { | ||||
|                     String tableComment = tablesResult.getString("REMARKS"); | ||||
|                     if (!Objects.isNull(tableComment)) { | ||||
|                         tableNameAndCommentMap.put(tableName, tableComment); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } finally { | ||||
|             tablesResult.close(); | ||||
|         } | ||||
|         return tableNameAndCommentMap; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user