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 @@
+
+
+
+
+
+ {
+ Downloader.get(Environment.apiContextPath('/api/mvc/download?filePath=' + encodeURIComponent(progressInfo.result)));
+ }
+ "
+ >
+
+
+
+
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);
+ }
}