diff --git a/app.platformnull/platform/schema/liquibase.xml b/app.platformnull/platform/schema/liquibase.xml new file mode 100644 index 00000000..e69de29b diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties index 9e47bf3e..da9bd163 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties @@ -270,4 +270,5 @@ defaultRoleName=Default Role Name async=Asynchronous valueScale=Value Scale scale=Scale -clean=Clean \ No newline at end of file +clean=Clean +remarks=Remarks \ No newline at end of file diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties index b428c60b..f367f7cb 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties @@ -270,4 +270,5 @@ defaultRoleName=\u9ED8\u8A8D\u89D2\u8272\u540D\u7A31 async=\u7570\u6B65 valueScale=\u503C\u7CBE\u5EA6 scale=\u7CBE\u5EA6 -clean=\u6E05\u9664 \ No newline at end of file +clean=\u6E05\u9664 +remarks=\u5907\u6CE8 \ No newline at end of file diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties index e1f8983c..af04072c 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties @@ -270,4 +270,5 @@ defaultRoleName=\u9ED8\u8BA4\u89D2\u8272\u540D\u79F0 async=\u5F02\u6B65 valueScale=\u503C\u7CBE\u5EA6 scale=\u7CBE\u5EA6 -clean=\u6E05\u9664 \ No newline at end of file +clean=\u6E05\u9664 +remarks=\u5099\u8A3B \ No newline at end of file diff --git a/io.sc.platform.developer.frontend/src/components/index.ts b/io.sc.platform.developer.frontend/src/components/index.ts index afd0b0df..7055906d 100644 --- a/io.sc.platform.developer.frontend/src/components/index.ts +++ b/io.sc.platform.developer.frontend/src/components/index.ts @@ -26,6 +26,7 @@ import component_developer_plugin_Ws from '@/views/plugin/Ws.vue'; import component_developer_plugin_Swagger from '@/views/plugin/Swagger.vue'; import component_developer_plugin_SystemProperties from '@/views/plugin/SystemProperties.vue'; import component_developer_backend_importLiquibase from '@/views/backend/ImportLiquibase.vue'; +import component_developer_backend_liquibaseSchema from '@/views/backend/ExportLiquibaseSchema.vue'; import component_developer_backend_exportLiquibase from '@/views/backend/ExportLiquibase.vue'; import component_developer_backend_sql from '@/views/backend/sql/Sql.vue'; import component_developer_backend_upload from '@/views/backend/Upload.vue'; @@ -60,6 +61,7 @@ const localComponents = { 'component.developer.plugin.Swagger': component_developer_plugin_Swagger, 'component.developer.plugin.SystemProperties': component_developer_plugin_SystemProperties, 'component.developer.backend.importLiquibase': component_developer_backend_importLiquibase, + 'component.developer.backend.liquibaseSchema': component_developer_backend_liquibaseSchema, 'component.developer.backend.exportLiquibase': component_developer_backend_exportLiquibase, 'component.developer.backend.sql': component_developer_backend_sql, 'component.developer.backend.upload': component_developer_backend_upload, diff --git a/io.sc.platform.developer.frontend/src/i18n/messages.json b/io.sc.platform.developer.frontend/src/i18n/messages.json index 5c1aca02..2e478a4a 100644 --- a/io.sc.platform.developer.frontend/src/i18n/messages.json +++ b/io.sc.platform.developer.frontend/src/i18n/messages.json @@ -29,6 +29,7 @@ "menu.developer.backend": "Back End Tools", "menu.developer.backend.import.liquibase": "Data Import", + "menu.developer.backend.export.liquibaseSchema": "Table Liquibase Schema Export", "menu.developer.backend.export.liquibase": "Data Export", "menu.developer.backend.sql": "SQL", "menu.developer.backend.upload": "Upload File", diff --git a/io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json b/io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json index f851d3f9..33cad262 100644 --- a/io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json +++ b/io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json @@ -29,6 +29,7 @@ "menu.developer.backend": "後端工具", "menu.developer.backend.import.liquibase": "數據導入", + "menu.developer.backend.export.liquibaseSchema": "表結構 Liquibase 文件導出", "menu.developer.backend.export.liquibase": "數據導出", "menu.developer.backend.sql": "SQL", "menu.developer.backend.upload": "上傳文件", diff --git a/io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json b/io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json index ed416de9..152e58e1 100644 --- a/io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json +++ b/io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json @@ -29,6 +29,7 @@ "menu.developer.backend": "后端工具", "menu.developer.backend.import.liquibase": "数据导入", + "menu.developer.backend.export.liquibaseSchema": "表结构 Liquibase 文件导出", "menu.developer.backend.export.liquibase": "数据导出", "menu.developer.backend.sql": "SQL", "menu.developer.backend.upload": "上传文件", diff --git a/io.sc.platform.developer.frontend/src/menus/menus.json b/io.sc.platform.developer.frontend/src/menus/menus.json index 0300026b..c44c4658 100644 --- a/io.sc.platform.developer.frontend/src/menus/menus.json +++ b/io.sc.platform.developer.frontend/src/menus/menus.json @@ -75,6 +75,8 @@ {"type":"GROUP", "order":500, "parentId":"menu.developer", "id":"menu.developer.backend", "titleI18nKey":"menu.developer.backend", "icon":"bi-server"}, /*开发者工具/后端工具/数据导入*/ {"type":"ROUTE", "order":100, "parentId":"menu.developer.backend", "id":"menu.developer.backend.import.liquibase", "titleI18nKey":"menu.developer.backend.import.liquibase", "icon":"bi-database-up", "routeName":"route.developer.backend.import.liquibase"}, + /*开发者工具/后端工具/表结构 Liquibase 文件导出*/ + {"type":"ROUTE", "order":150, "parentId":"menu.developer.backend", "id":"menu.developer.backend.export.liquibaseSchema","titleI18nKey":"menu.developer.backend.export.liquibaseSchema","icon":"bi-database-gear", "routeName":"route.developer.backend.export.liquibaseSchema"}, /*开发者工具/后端工具/数据导出*/ {"type":"ROUTE", "order":200, "parentId":"menu.developer.backend", "id":"menu.developer.backend.export.liquibase", "titleI18nKey":"menu.developer.backend.export.liquibase", "icon":"bi-database-down", "routeName":"route.developer.backend.export.liquibase"}, /*开发者工具/后端工具/SQL*/ diff --git a/io.sc.platform.developer.frontend/src/routes/routes.json b/io.sc.platform.developer.frontend/src/routes/routes.json index c65448ce..45207906 100644 --- a/io.sc.platform.developer.frontend/src/routes/routes.json +++ b/io.sc.platform.developer.frontend/src/routes/routes.json @@ -309,6 +309,17 @@ "redirect": null, "meta": {} }, + { + "name": "route.developer.backend.export.liquibaseSchema", + "path": "developer/backend/export/liquibaseSchema", + "parent": "/", + "priority": 0, + "module": "io.sc.platform.developer.frontend", + "component": "component.developer.backend.liquibaseSchema", + "componentPath": "@/views/backend/ExportLiquibaseSchema.vue", + "redirect": null, + "meta": {} + }, { "name": "route.developer.backend.export.liquibase", "path": "developer/backend/export/liquibase", diff --git a/io.sc.platform.developer.frontend/src/views/backend/ExportLiquibaseSchema.vue b/io.sc.platform.developer.frontend/src/views/backend/ExportLiquibaseSchema.vue new file mode 100644 index 00000000..f1558a4f --- /dev/null +++ b/io.sc.platform.developer.frontend/src/views/backend/ExportLiquibaseSchema.vue @@ -0,0 +1,185 @@ + + diff --git a/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseSchemaExporter.java b/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseSchemaExporter.java index 950fbe2e..3f823411 100644 --- a/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseSchemaExporter.java +++ b/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseSchemaExporter.java @@ -2,14 +2,19 @@ package io.sc.platform.jdbc.liquibase.exporter; import io.sc.platform.core.DirectoryManager; import io.sc.platform.core.Environment; +import io.sc.platform.core.enums.ProgressStatus; +import io.sc.platform.core.support.ProgressInfo; +import io.sc.platform.core.util.ZipUtil; import io.sc.platform.jdbc.exporter.SchemaExporter; import io.sc.platform.jdbc.exporter.support.SchemaExportConfigure; import io.sc.platform.jdbc.meta.MetaDataLoader; import io.sc.platform.jdbc.meta.support.Column; import io.sc.platform.jdbc.meta.support.Index; import io.sc.platform.jdbc.meta.support.Table; +import io.sc.platform.util.FileUtil; import io.sc.platform.util.WriterUtil; import org.springframework.jdbc.support.MetaDataAccessException; +import org.springframework.util.StringUtils; import javax.sql.DataSource; import javax.xml.stream.XMLStreamException; @@ -17,34 +22,53 @@ import javax.xml.stream.XMLStreamWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.UnsupportedEncodingException; +import java.util.Date; import java.util.List; +import java.util.Locale; public class LiquibaseSchemaExporter implements SchemaExporter { - private static final String OUTPUT_PATH = DirectoryManager.getInstance().getByName(""); + private static final String OUTPUT_PATH = DirectoryManager.getInstance().getByName("dir.work.web.export") + "/liquibase"; @Override - public void export(DataSource dataSource, SchemaExportConfigure configure) { + public void export(DataSource dataSource, SchemaExportConfigure configure, ProgressInfo progressInfo, Locale locale) { try { - exportSingleFile(dataSource, configure); + exportSingleFile(dataSource, configure,progressInfo,locale); //exportMultiFile(dataSource, configure); }catch (Exception e){ throw new RuntimeException(e); } } - private void exportSingleFile(DataSource dataSource, SchemaExportConfigure configure) throws XMLStreamException, FileNotFoundException, UnsupportedEncodingException, MetaDataAccessException { - XMLStreamWriter writer = WriterUtil.xmlStreamWriter(OUTPUT_PATH + File.separator + "schema." + configure.getSchema() + ".xml"); - writeHeader(writer,configure.getSchema()); - List tables =MetaDataLoader.newInstance().getTables(dataSource,configure.getCatalog(), configure.getSchema()); + private void exportSingleFile(DataSource dataSource, SchemaExportConfigure configure, ProgressInfo progressInfo, Locale locale) throws Exception { + progressInfo.setStatus(ProgressStatus.RUNNING); + progressInfo.setStartDatetime(new Date()); + progressInfo.setTotalWeight(configure.getTables().length); + + String outPutDir =OUTPUT_PATH + getPath(configure.getCatalog(),configure.getSchema()); + FileUtil.deldirs(outPutDir); + String schemaDir =outPutDir + "/schema"; + new File(schemaDir).mkdirs(); + + XMLStreamWriter writer = WriterUtil.xmlStreamWriter(schemaDir + "/liquibase.xml"); + writeHeader(writer,getSchemaName(configure.getCatalog(),configure.getSchema())); + List
tables =MetaDataLoader.newInstance().getTables(dataSource,configure.getCatalog(),configure.getSchema(),configure.getTables()); for(Table table : tables){ writeTable(table,writer); } writeTail(writer); writer.flush(); writer.close(); + + ZipUtil.zip(outPutDir); + + // 设置结果为导出的 zip 文件全路径 + progressInfo.setResult(outPutDir + ".zip"); + + //执行完毕 + progressInfo.done(); } - private void exportMultiFile(DataSource dataSource, SchemaExportConfigure configure) throws MetaDataAccessException, XMLStreamException, FileNotFoundException, UnsupportedEncodingException { + private void exportMultiFile(DataSource dataSource, SchemaExportConfigure configure, ProgressInfo progressInfo, Locale locale) throws MetaDataAccessException, XMLStreamException, FileNotFoundException, UnsupportedEncodingException { List
tables =MetaDataLoader.newInstance().getTables(dataSource, configure.getCatalog(), configure.getSchema()); for(Table table : tables){ XMLStreamWriter writer = WriterUtil.xmlStreamWriter(OUTPUT_PATH + File.separator + "schema." + configure.getSchema() + "." + table.getName() + ".xml"); @@ -58,6 +82,7 @@ public class LiquibaseSchemaExporter implements SchemaExporter { private void writeHeader(XMLStreamWriter writer,String changeSetId) throws XMLStreamException { writer.writeStartDocument(Environment.DEFAULT_CHARSET_NAME,"1.0"); + writer.writeStartElement("databaseChangeLog"); //start databaseChangeLog writer.writeAttribute("xmlns", "http://www.liquibase.org/xml/ns/dbchangelog"); writer.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); @@ -66,6 +91,7 @@ public class LiquibaseSchemaExporter implements SchemaExporter { writer.writeStartElement("changeSet"); //start changeSet writer.writeAttribute("id", changeSetId); + writer.writeAttribute("author", "platform"); } private void writeTail(XMLStreamWriter writer) throws XMLStreamException { @@ -113,20 +139,50 @@ public class LiquibaseSchemaExporter implements SchemaExporter { } private String getLiquibaseJavaSqlType(Column column) { - String type ="java.sql.Types." + column.getSqlType(); + String type =column.getSqlType(); if("java.sql.Types.VARCHAR".equals(type)) { if(column.getSize()>10000) { type ="java.sql.Types.CLOB"; }else { - type =type + "(" + column.getSize() + ")"; + type ="NVARCHAR(" + column.getSize() + ")"; } + }else if("java.sql.Types.LONGVARCHAR".equals(type)){ + type ="CLOB"; }else if("java.sql.Types.TIMESTAMP".equals(type)) { type ="DATETIME"; }else if("java.sql.Types.NUMERIC".equals(type)) { type ="java.sql.Types.NUMERIC" + column.getWidth(); }else if("java.sql.Types.DECIMAL".equals(type)) { type ="java.sql.Types.DECIMAL" + column.getWidth(); + }else if("java.sql.Types.INTEGER".equals(type)){ + type ="INTEGER"; } return type; } + + private String getPath(String catalog,String schema){ + String catalogOrSchemaName =""; + if(StringUtils.hasText(catalog)){ + catalogOrSchemaName ="/" + catalog; + } + if(StringUtils.hasText(schema)){ + catalogOrSchemaName ="/" + schema; + } + return catalogOrSchemaName; + } + + private String getSchemaName(String catalog,String schema){ + String catalogOrSchemaName =""; + if(StringUtils.hasText(catalog)){ + catalogOrSchemaName =catalog; + if(StringUtils.hasText(schema)){ + catalogOrSchemaName ="." + schema; + } + return catalogOrSchemaName; + } + if(StringUtils.hasText(schema)){ + catalogOrSchemaName =schema; + } + return catalogOrSchemaName; + } } diff --git a/io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java b/io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java index 3a6345ef..c60d9b67 100644 --- a/io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java +++ b/io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java @@ -1,5 +1,6 @@ package io.sc.platform.jdbc.schemacrawler; +import com.oceanbase.jdbc.OceanBaseConnection; import io.sc.platform.jdbc.DatabaseType; import io.sc.platform.jdbc.meta.MetaDataLoader; import io.sc.platform.jdbc.meta.support.*; @@ -20,10 +21,7 @@ import us.fatehi.utility.datasource.DatabaseConnectionSources; import javax.sql.DataSource; import java.sql.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; @Service("io.sc.platform.jdbc.schemacrawler.MetaDataLoaderImpl") public class MetaDataLoaderImpl implements MetaDataLoader { @@ -34,7 +32,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { Connection connection =null; ResultSet rs =null; try { - connection =dataSource.getConnection(); + connection =getConnection(dataSource); DatabaseMetaData databaseMetaData =connection.getMetaData(); rs =databaseMetaData.getCatalogs(); while (rs.next()){ @@ -57,7 +55,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { Connection connection =null; ResultSet rs =null; try { - connection =dataSource.getConnection(); + connection =getConnection(dataSource); DatabaseMetaData databaseMetaData =connection.getMetaData(); rs =databaseMetaData.getSchemas(catalogName,null); while (rs.next()){ @@ -80,7 +78,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { Connection connection =null; ResultSet rs =null; try { - connection =dataSource.getConnection(); + connection =getConnection(dataSource); DatabaseMetaData databaseMetaData =connection.getMetaData(); if(tableNames==null || tableNames.length==0) { rs = databaseMetaData.getTables(catalogName, schemaName, null, new String[]{"TABLE"}); @@ -124,7 +122,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { Connection connection =null; ResultSet rs =null; try { - connection =dataSource.getConnection(); + connection =getConnection(dataSource); DatabaseMetaData databaseMetaData =connection.getMetaData(); rs =databaseMetaData.getColumns(catalogName,schemaName,tableName,null); while (rs.next()){ @@ -136,6 +134,32 @@ public class MetaDataLoaderImpl implements MetaDataLoader { try{rs.close();} catch (SQLException e) {} try{connection.close();} catch (SQLException e) {} } + + Map primaryKeys =getPrimaryKeys(dataSource,catalogName,schemaName,tableName); + for(Column column : result){ + column.setPartOfPrimaryKey(primaryKeys.containsKey(column.getName())); + } + return result; + } + + private Map getPrimaryKeys(DataSource dataSource, String catalogName, String schemaName, String tableName) throws MetaDataAccessException { + Map result =new HashMap<>(); + Connection connection =null; + ResultSet rs =null; + try { + connection =getConnection(dataSource); + DatabaseMetaData databaseMetaData =connection.getMetaData(); + rs =databaseMetaData.getPrimaryKeys(catalogName,schemaName,tableName); + while (rs.next()){ + String columnName =rs.getString("COLUMN_NAME"); + result.put(columnName,columnName); + } + } catch (SQLException e) { + throw new MetaDataAccessException(e); + }finally { + try{rs.close();} catch (SQLException e) {} + try{connection.close();} catch (SQLException e) {} + } return result; } @@ -144,7 +168,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { Connection connection =null; ResultSet rs =null; try { - connection =dataSource.getConnection(); + connection =getConnection(dataSource); DatabaseMetaData databaseMetaData =connection.getMetaData(); rs =databaseMetaData.getIndexInfo(catalogName,schemaName,tableName,false,false); while (rs.next()){ @@ -182,7 +206,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { tableSummary.setRemarks(table.getRemarks()); if(isCount){ try( - Connection connection =dataSource.getConnection(); + Connection connection =getConnection(dataSource); PreparedStatement ps =connection.prepareStatement("select count(1) from " + table.getName()); ResultSet rs =ps.executeQuery(); ){ @@ -242,6 +266,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { column.setSqlType(SqlTypeUtil.getSqlTypeName(DATA_TYPE)); column.setJavaType(SqlTypeUtil.getJavaType(DATA_TYPE)); column.setSize(COLUMN_SIZE); + column.setWidth("(" + COLUMN_SIZE + "," + String.valueOf(DECIMAL_DIGITS)+")"); column.setNullable("YES".equalsIgnoreCase(IS_NULLABLE)?true:false); column.setAutoIncremented("YES".equalsIgnoreCase(IS_AUTOINCREMENT)?true:false); return column; @@ -252,7 +277,7 @@ public class MetaDataLoaderImpl implements MetaDataLoader { Connection connection =null; ResultSet rs =null; try { - connection =dataSource.getConnection(); + connection =getConnection(dataSource); DatabaseMetaData databaseMetaData =connection.getMetaData(); rs =databaseMetaData.getImportedKeys(catalogName,schemaName,tableName); while (rs.next()){ @@ -271,4 +296,12 @@ public class MetaDataLoaderImpl implements MetaDataLoader { } return result; } + + private Connection getConnection(DataSource dataSource) throws SQLException { + Connection connection =dataSource.getConnection(); + if(connection instanceof OceanBaseConnection){ + ((OceanBaseConnection)connection).setRemarksReporting(true); + } + return connection; + } } diff --git a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcDataWebController.java b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcDataWebController.java index c404050c..51433a06 100644 --- a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcDataWebController.java +++ b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcDataWebController.java @@ -4,8 +4,10 @@ import io.sc.platform.core.service.ProgressableThreadService; import io.sc.platform.core.support.ProgressInfo; import io.sc.platform.jdbc.controller.support.ExporterThread; import io.sc.platform.jdbc.controller.support.ImporterThread; +import io.sc.platform.jdbc.controller.support.SchemaExporterThread; import io.sc.platform.jdbc.exporter.support.DataExportConfigure; import io.sc.platform.jdbc.exporter.support.DataImportConfigure; +import io.sc.platform.jdbc.exporter.support.SchemaExportConfigure; import io.sc.platform.jdbc.service.JdbcDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -35,6 +37,13 @@ public class JdbcDataWebController { progressableThreadService.start(thread); } + @PostMapping("exportSchema") + public void exportSchema(@RequestBody SchemaExportConfigure configure, Locale locale) throws Exception { + SchemaExporterThread thread =new SchemaExporterThread(jdbcDataService,configure,locale); + progressableThreadService.start(thread); + } + + @PostMapping("exportData") public void exportData(@RequestBody DataExportConfigure configure, Locale locale) throws Exception { ExporterThread thread =new ExporterThread(jdbcDataService,configure,locale); @@ -50,4 +59,9 @@ public class JdbcDataWebController { public ProgressInfo traceExporterExecuteProgress(Locale locale) throws Exception{ return progressableThreadService.getProgressInfo(ExporterThread.class.getName()); } + + @GetMapping("traceSchemaExporterExecuteProgress") + public ProgressInfo traceSchemaExporterExecuteProgress(Locale locale) throws Exception{ + return progressableThreadService.getProgressInfo(SchemaExporterThread.class.getName()); + } } diff --git a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/support/SchemaExporterThread.java b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/support/SchemaExporterThread.java new file mode 100644 index 00000000..0eaa55cf --- /dev/null +++ b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/support/SchemaExporterThread.java @@ -0,0 +1,38 @@ +package io.sc.platform.jdbc.controller.support; + +import io.sc.platform.core.enums.ProgressStatus; +import io.sc.platform.core.support.ProgressableThread; +import io.sc.platform.jdbc.exporter.support.DataExportConfigure; +import io.sc.platform.jdbc.exporter.support.SchemaExportConfigure; +import io.sc.platform.jdbc.service.JdbcDataService; +import io.sc.platform.util.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Locale; + +public class SchemaExporterThread extends ProgressableThread { + private Logger log = LoggerFactory.getLogger(SchemaExporterThread.class); + private JdbcDataService jdbcDataService; + private SchemaExportConfigure configure; + private Locale locale; + + public SchemaExporterThread(JdbcDataService jdbcDataService, SchemaExportConfigure configure, Locale locale){ + this.jdbcDataService =jdbcDataService; + this.configure =configure; + this.locale =locale; + } + @Override + public void run() { + try { + progressInfo.setStatus(ProgressStatus.RUNNING); + jdbcDataService.exportSchema(configure,progressInfo,locale); + progressInfo.setStatus(ProgressStatus.COMPLETED); + } catch (Exception e) { + log.error("",e); + progressInfo.setStatus(ProgressStatus.ERROR); + progressInfo.setErrorMessage(e.getMessage()); + progressInfo.setErrorStackTrace(StringUtil.getStackTrace(e)); + } + } +} diff --git a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/SchemaExporter.java b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/SchemaExporter.java index 1987d279..1b11eb79 100644 --- a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/SchemaExporter.java +++ b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/SchemaExporter.java @@ -1,13 +1,15 @@ package io.sc.platform.jdbc.exporter; +import io.sc.platform.core.support.ProgressInfo; import io.sc.platform.jdbc.exporter.support.SchemaExportConfigure; import javax.sql.DataSource; import java.util.Iterator; +import java.util.Locale; import java.util.ServiceLoader; public interface SchemaExporter { - public void export(DataSource dataSource, SchemaExportConfigure configure); + public void export(DataSource dataSource, SchemaExportConfigure configure, ProgressInfo progressInfo, Locale locale); public static SchemaExporter newInstance(){ ServiceLoader serviceLoader =ServiceLoader.load(SchemaExporter.class); diff --git a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcDataService.java b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcDataService.java index cf8ea0a0..a53cf48f 100644 --- a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcDataService.java +++ b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcDataService.java @@ -3,6 +3,7 @@ package io.sc.platform.jdbc.service; import io.sc.platform.core.support.ProgressInfo; import io.sc.platform.jdbc.exporter.support.DataExportConfigure; import io.sc.platform.jdbc.exporter.support.DataImportConfigure; +import io.sc.platform.jdbc.exporter.support.SchemaExportConfigure; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @@ -11,4 +12,5 @@ import java.util.Locale; public interface JdbcDataService { public void importData(DataImportConfigure configure, ProgressInfo progressInfo, Locale locale) throws Exception; public void exportData(DataExportConfigure configure, ProgressInfo progressInfo, Locale locale) throws Exception; + public void exportSchema(SchemaExportConfigure configure, ProgressInfo progressInfo, Locale locale) throws Exception; } diff --git a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcDataServiceImpl.java b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcDataServiceImpl.java index 6864dba4..43b1c13b 100644 --- a/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcDataServiceImpl.java +++ b/io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcDataServiceImpl.java @@ -2,8 +2,10 @@ package io.sc.platform.jdbc.service.impl; import io.sc.platform.core.support.ProgressInfo; import io.sc.platform.jdbc.exporter.DataExporter; +import io.sc.platform.jdbc.exporter.SchemaExporter; import io.sc.platform.jdbc.exporter.support.DataExportConfigure; import io.sc.platform.jdbc.exporter.support.DataImportConfigure; +import io.sc.platform.jdbc.exporter.support.SchemaExportConfigure; import io.sc.platform.jdbc.importer.DataImporter; import io.sc.platform.jdbc.service.DatasourceService; import io.sc.platform.jdbc.service.JdbcDataService; @@ -45,4 +47,18 @@ public class JdbcDataServiceImpl implements JdbcDataService { } DataExporter.newInstance().exportData(dataSource,configure,progressInfo,locale); } + + @Override + public void exportSchema(SchemaExportConfigure configure, ProgressInfo progressInfo, Locale locale) throws Exception { + if(configure==null){ + return; + } + DataSource dataSource =null; + if(StringUtils.hasText(configure.getDatasource())){ + dataSource =datasourceService.getDatasource(configure.getDatasource()); + }else{ + dataSource =datasourceService.getDefaultDatasource(); + } + SchemaExporter.newInstance().export(dataSource,configure,progressInfo,locale); + } }