diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/DatabaseManagerService.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/DatabaseManagerService.java index cf265a60c..29c9b16ee 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/DatabaseManagerService.java +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/DatabaseManagerService.java @@ -12,5 +12,5 @@ import java.util.Map; * @author zhouhao */ public interface DatabaseManagerService extends SqlExecutor,TransactionSqlExecutor { - Map> getMetas(String datasourceId); + Map> getMetas(); } diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionInfo.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionInfo.java new file mode 100644 index 000000000..e89ce603d --- /dev/null +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionInfo.java @@ -0,0 +1,21 @@ +package org.hswebframework.web.database.manager.sql; + +import lombok.Data; +import org.hswebframework.web.database.manager.SqlInfo; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Data +public class TransactionInfo implements Serializable { + private String id; + + private List sqlHistory=new ArrayList<>(); + + private Date createTime; + + private Date lastExecuteTime; + +} diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionSqlExecutor.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionSqlExecutor.java index b5cfdb608..43e30df5f 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionSqlExecutor.java +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/sql/TransactionSqlExecutor.java @@ -3,6 +3,7 @@ package org.hswebframework.web.database.manager.sql; import org.hswebframework.web.database.manager.SqlExecuteRequest; import org.hswebframework.web.database.manager.SqlExecuteResult; import org.hswebframework.web.datasource.DynamicDataSource; +import org.springframework.beans.factory.annotation.Autowired; import java.util.List; @@ -36,6 +37,19 @@ public interface TransactionSqlExecutor { */ void rollback(String transactionId); + /** + * @return 获取全部事务 + */ + List allTransaction(); + + /** + * 执行 + * + * @param transactionId + * @param request + * @return + * @throws Exception + */ List execute(String transactionId, SqlExecuteRequest request) throws Exception; } diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DatabaseManagerAutoConfiguration.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DatabaseManagerAutoConfiguration.java deleted file mode 100644 index 8b8b24d07..000000000 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DatabaseManagerAutoConfiguration.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.hswebframework.web.datasource.manager.simple; - -import org.hswebframework.ezorm.rdb.executor.SqlExecutor; -import org.hswebframework.ezorm.rdb.meta.parser.OracleTableMetaParser; -import org.hswebframework.web.database.manager.DatabaseManagerService; -import org.hswebframework.web.database.manager.meta.ObjectMetadata; -import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserRegister; -import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserSupplier; -import org.hswebframework.web.database.manager.meta.table.parser.TableMetaDataParser; -import org.hswebframework.web.database.manager.meta.table.parser.support.H2TableMetaDataParser; -import org.hswebframework.web.database.manager.meta.table.parser.support.MysqlTableMetaDataParser; -import org.hswebframework.web.database.manager.meta.table.parser.support.SqlServerTableMetaDataParser; -import org.hswebframework.web.datasource.DatabaseType; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ConditionalOnMissingBean(DatabaseManagerService.class) -public class DatabaseManagerAutoConfiguration { - - @Bean - public DatabaseManagerService databaseManagerService() { - return new SimpleDatabaseManagerService(); - } - - @Configuration - public static class TableMetaDataParserAutoConfiguration { - - @Autowired - private SqlExecutor sqlExecutor; - - @Autowired - private MetaDataParserRegister metaDataParserRegister; - - @Bean - @ConditionalOnClass(name = "org.h2.Driver") - public H2TableMetaDataParser h2TableMetaDataParser() { - return new H2TableMetaDataParser(sqlExecutor); - } - - @Bean - @ConditionalOnClass(name = "com.mysql.jdbc.Driver") - public MysqlTableMetaDataParser mysqlTableMetaDataParser() { - return new MysqlTableMetaDataParser(sqlExecutor); - } - - @Bean - @ConditionalOnClass(name = "oracle.jdbc.driver.OracleDriver") - public OracleTableMetaParser oracleTableMetaParser() { - return new OracleTableMetaParser(sqlExecutor); - } - - @Bean - @ConditionalOnClass(name ="com.microsoft.sqlserver.jdbc.SQLServerDriver") - public SqlServerTableMetaDataParser sqlServerTableMetaDataParser(){ - return new SqlServerTableMetaDataParser(sqlExecutor); - } - @Bean - @ConditionalOnClass(name ="net.sourceforge.jtds.jdbc.Driver") - public SqlServerTableMetaDataParser jstdSqlServerTableMetaDataParser(){ - return new SqlServerTableMetaDataParser(sqlExecutor); - } - - @Bean - public BeanPostProcessor tableMetaDataAutoParserRegister() { - return new BeanPostProcessor() { - @Override - public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { - return o; - } - - @Override - @SuppressWarnings("unchecked") - public Object postProcessAfterInitialization(Object o, String s) throws BeansException { - if (o instanceof MetaDataParserSupplier) { - MetaDataParserSupplier supplier = ((MetaDataParserSupplier) o); - for (DatabaseType databaseType : DatabaseType.values()) { - if (supplier.isSupport(databaseType)) { - metaDataParserRegister.registerMetaDataParser(databaseType, ObjectMetadata.ObjectType.TABLE, supplier.get()); - } - } - } - return o; - } - }; - } - } -} diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java index ddee7e304..2f771bdff 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java @@ -152,6 +152,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { protected void doExecute() { Execution execution; while ((execution = executionQueue.poll()) != null) { + Execution finalE = execution; running = true; logger.debug("start execute sql {}", transactionId); try { @@ -159,6 +160,11 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { .stream() .map(sqlInfo -> { try { + if (finalE.datasourceId != null) { + DataSourceHolder.switcher().use(finalE.datasourceId); + } else { + DataSourceHolder.switcher().useDefault(); + } //执行sql return sqlRequestExecutor.apply(sqlExecutor, sqlInfo); } catch (SQLException e) { @@ -188,6 +194,8 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { //异常信息 Exception[] exceptions = new Exception[1]; Execution execution = new Execution(); + execution.datasourceId=DataSourceHolder.switcher().currentDataSourceId(); + execution.request = request; execution.callback = sqlExecuteResults -> { results.addAll(sqlExecuteResults); @@ -215,6 +223,9 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { } protected class Execution { + + protected String datasourceId; + protected SqlExecuteRequest request; protected Consumer> callback; diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java index be6577e93..a621fff64 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java @@ -8,9 +8,11 @@ import org.hswebframework.web.database.manager.SqlExecuteResult; import org.hswebframework.web.database.manager.meta.ObjectMetadata; import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParser; import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserRegister; +import org.hswebframework.web.database.manager.sql.TransactionInfo; import org.hswebframework.web.datasource.DataSourceHolder; import org.hswebframework.web.datasource.DatabaseType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.PostConstruct; @@ -22,27 +24,32 @@ import java.util.concurrent.Executors; import java.util.stream.Collectors; /** - * * @author zhouhao */ @Slf4j -public class SimpleDatabaseManagerService implements DatabaseManagerService,MetaDataParserRegister { +public class SimpleDatabaseManagerService implements DatabaseManagerService, MetaDataParserRegister { private Map transactionExecutorMap = new ConcurrentHashMap<>(); + private Map transactionInfoMap = new ConcurrentHashMap<>(); + private ExecutorService executorService; private SqlExecutor sqlExecutor; private TransactionTemplate transactionTemplate; - private Map>> parserRepo=new HashMap<>(); + private Map>> parserRepo = new HashMap<>(); + @Override + public List allTransaction() { + return new ArrayList<>(transactionInfoMap.values()); + } @PostConstruct public void init() { if (executorService == null) { - executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2); + executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2); } } @@ -67,6 +74,10 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta DefaultLocalTransactionExecutor executor = new DefaultLocalTransactionExecutor(sqlExecutor, id, datasourceId, transactionTemplate); transactionExecutorMap.put(id, executor); executorService.submit(executor); + TransactionInfo info = new TransactionInfo(); + info.setId(id); + info.setCreateTime(new Date()); + transactionInfoMap.put(id, info); return id; } @@ -77,26 +88,39 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta @Override public void commit(String transactionId) { - TransactionExecutor executor = transactionExecutorMap.get(transactionId); - if (executor != null) { - executor.commit(); + try { + TransactionExecutor executor = transactionExecutorMap.get(transactionId); + if (executor != null) { + executor.commit(); + } + } finally { + transactionExecutorMap.remove(transactionId); + transactionInfoMap.remove(transactionId); } - transactionExecutorMap.remove(transactionId); } @Override public void rollback(String transactionId) { - TransactionExecutor executor = transactionExecutorMap.get(transactionId); - if (executor != null) { - executor.rollback(); + try { + TransactionExecutor executor = transactionExecutorMap.get(transactionId); + if (executor != null) { + executor.rollback(); + } + } finally { + transactionExecutorMap.remove(transactionId); + transactionInfoMap.remove(transactionId); } - transactionExecutorMap.remove(transactionId); } @Override public List execute(String transactionId, SqlExecuteRequest request) throws Exception { TransactionExecutor executor = transactionExecutorMap.get(transactionId); if (executor != null) { + TransactionInfo info = transactionInfoMap.get(transactionId); + if (null != info) { + info.setLastExecuteTime(new Date()); + info.getSqlHistory().addAll(request.getSql()); + } return executor.execute(request); } return null; @@ -108,16 +132,16 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta } @Override - public Map> getMetas(String datasourceId) { + public Map> getMetas() { return parserRepo - .computeIfAbsent(DataSourceHolder.dataSource(datasourceId).getType(),t->new HashMap<>()) + .computeIfAbsent(DataSourceHolder.currentDatabaseType(), t -> new HashMap<>()) .entrySet() .parallelStream() - .collect(Collectors.toMap(Map.Entry::getKey, entry->{ + .collect(Collectors.toMap(Map.Entry::getKey, entry -> { try { return entry.getValue().parseAll(); } catch (SQLException e) { - log.error("parse meta {} error",entry.getKey(),e); + log.error("parse meta {} error", entry.getKey(), e); return new ArrayList<>(); } })); @@ -125,7 +149,7 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta @Override public void registerMetaDataParser(DatabaseType databaseType, ObjectMetadata.ObjectType objectType, MetaDataParser parser) { - parserRepo.computeIfAbsent(databaseType,t->new HashMap<>()) - .put(objectType,parser); + parserRepo.computeIfAbsent(databaseType, t -> new HashMap<>()) + .put(objectType, parser); } } diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/pom.xml b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/pom.xml new file mode 100644 index 000000000..6bbd1d222 --- /dev/null +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/pom.xml @@ -0,0 +1,26 @@ + + + + hsweb-system-database-manager + org.hswebframework.web + 3.0-SNAPSHOT + + 4.0.0 + + hsweb-system-database-manager-starter + + + + org.hswebframework.web + hsweb-system-database-manager-simple + ${project.version} + + + org.hswebframework.web + hsweb-system-database-manager-web + ${project.version} + + + \ No newline at end of file diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/mamager/DataBaseManagerAutoConfiguration.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/mamager/DataBaseManagerAutoConfiguration.java new file mode 100644 index 000000000..51de7f830 --- /dev/null +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/mamager/DataBaseManagerAutoConfiguration.java @@ -0,0 +1,26 @@ +package org.hswebframework.web.database.mamager; + +import org.hswebframework.web.database.manager.DatabaseManagerService; +import org.hswebframework.web.datasource.manager.simple.SimpleDatabaseManagerService; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan({"org.hswebframework.web.database.manager.web" + , "org.hswebframework.web.datasource.manager.simple"}) +@ImportAutoConfiguration(TableMetaDataParserAutoConfiguration.class) +@AutoConfigureBefore(TableMetaDataParserAutoConfiguration.class) +public class DataBaseManagerAutoConfiguration { + + @Bean + @ConditionalOnMissingBean(DatabaseManagerService.class) + public SimpleDatabaseManagerService simpleDatabaseManagerService() { + return new SimpleDatabaseManagerService(); + } + + +} diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/mamager/TableMetaDataParserAutoConfiguration.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/mamager/TableMetaDataParserAutoConfiguration.java new file mode 100644 index 000000000..bce97e920 --- /dev/null +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/mamager/TableMetaDataParserAutoConfiguration.java @@ -0,0 +1,82 @@ +package org.hswebframework.web.database.mamager; + +import org.hswebframework.ezorm.rdb.executor.SqlExecutor; +import org.hswebframework.ezorm.rdb.meta.parser.OracleTableMetaParser; +import org.hswebframework.web.database.manager.meta.ObjectMetadata; +import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserRegister; +import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserSupplier; +import org.hswebframework.web.database.manager.meta.table.parser.TableMetaDataParser; +import org.hswebframework.web.database.manager.meta.table.parser.support.H2TableMetaDataParser; +import org.hswebframework.web.database.manager.meta.table.parser.support.MysqlTableMetaDataParser; +import org.hswebframework.web.database.manager.meta.table.parser.support.SqlServerTableMetaDataParser; +import org.hswebframework.web.datasource.DatabaseType; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class TableMetaDataParserAutoConfiguration { + + @Autowired + private SqlExecutor sqlExecutor; + + @Autowired + private MetaDataParserRegister metaDataParserRegister; + + @Bean + @ConditionalOnClass(name = "org.h2.Driver") + public H2TableMetaDataParser h2TableMetaDataParser() { + return new H2TableMetaDataParser(sqlExecutor); + } + + @Bean + @ConditionalOnClass(name = "com.mysql.jdbc.Driver") + public MysqlTableMetaDataParser mysqlTableMetaDataParser() { + return new MysqlTableMetaDataParser(sqlExecutor); + } + + @Bean + @ConditionalOnClass(name = "oracle.jdbc.driver.OracleDriver") + public OracleTableMetaParser oracleTableMetaParser() { + return new OracleTableMetaParser(sqlExecutor); + } + + @Bean + @ConditionalOnClass(name = "com.microsoft.sqlserver.jdbc.SQLServerDriver") + public SqlServerTableMetaDataParser sqlServerTableMetaDataParser() { + return new SqlServerTableMetaDataParser(sqlExecutor); + } + + @Bean + @ConditionalOnClass(name = "net.sourceforge.jtds.jdbc.Driver") + public SqlServerTableMetaDataParser jstdSqlServerTableMetaDataParser() { + return new SqlServerTableMetaDataParser(sqlExecutor); + } + + @Bean + public BeanPostProcessor tableMetaDataAutoParserRegister() { + return new BeanPostProcessor() { + @Override + public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { + return o; + } + + @Override + @SuppressWarnings("unchecked") + public Object postProcessAfterInitialization(Object o, String s) throws BeansException { + if (o instanceof MetaDataParserSupplier) { + MetaDataParserSupplier supplier = ((MetaDataParserSupplier) o); + for (DatabaseType databaseType : DatabaseType.values()) { + if (supplier.isSupport(databaseType)) { + metaDataParserRegister.registerMetaDataParser(databaseType, ObjectMetadata.ObjectType.TABLE, supplier.get()); + } + } + } + return o; + } + }; + } +} \ No newline at end of file diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/resources/META-INF/spring.factories b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/resources/META-INF/spring.factories similarity index 50% rename from hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/resources/META-INF/spring.factories rename to hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/resources/META-INF/spring.factories index 09d3125b7..2f1d01fcb 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/resources/META-INF/spring.factories +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/resources/META-INF/spring.factories @@ -1,3 +1,3 @@ # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.hswebframework.web.datasource.manager.simple.DatabaseManagerAutoConfiguration \ No newline at end of file +org.hswebframework.web.database.mamager.DataBaseManagerAutoConfiguration \ No newline at end of file diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/pom.xml b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/pom.xml new file mode 100644 index 000000000..f4a44a57f --- /dev/null +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/pom.xml @@ -0,0 +1,27 @@ + + + + hsweb-system-database-manager + org.hswebframework.web + 3.0-SNAPSHOT + + 4.0.0 + + hsweb-system-database-manager-web + + + + org.hswebframework.web + hsweb-system-database-manager-api + ${project.version} + + + org.hswebframework.web + hsweb-commons-controller + ${project.version} + + + + \ No newline at end of file diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/src/main/java/org/hswebframework/web/database/manager/web/DataBaseManagerController.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/src/main/java/org/hswebframework/web/database/manager/web/DataBaseManagerController.java new file mode 100644 index 000000000..0f9b03784 --- /dev/null +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/src/main/java/org/hswebframework/web/database/manager/web/DataBaseManagerController.java @@ -0,0 +1,121 @@ +package org.hswebframework.web.database.manager.web; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.hswebframework.web.Sqls; +import org.hswebframework.web.authorization.Permission; +import org.hswebframework.web.authorization.annotation.Authorize; +import org.hswebframework.web.controller.message.ResponseMessage; +import org.hswebframework.web.database.manager.DatabaseManagerService; +import org.hswebframework.web.database.manager.SqlExecuteRequest; +import org.hswebframework.web.database.manager.SqlExecuteResult; +import org.hswebframework.web.database.manager.SqlInfo; +import org.hswebframework.web.database.manager.meta.ObjectMetadata; +import org.hswebframework.web.database.manager.sql.TransactionInfo; +import org.hswebframework.web.datasource.DataSourceHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/database/manager") +@Api(value = "开发人员工具-数据库维护", description = "数据库维护") +@Authorize(permission = "database-manager",description = "数据库维护") +public class DataBaseManagerController { + + @Autowired + private DatabaseManagerService databaseManagerService; + + @GetMapping("/metas") + @Authorize(action = Permission.ACTION_QUERY) + @ApiOperation("获取数据库元数据") + public ResponseMessage>> parseAllObject() throws Exception { + return parseAllObject(null); + } + + @GetMapping("/metas/{datasourceId}") + @Authorize(action = Permission.ACTION_QUERY) + @ApiOperation("获取指定数据源的元数据") + public ResponseMessage>> parseAllObject(@PathVariable String datasourceId) throws Exception { + DataSourceHolder.switcher().use(datasourceId); + return ResponseMessage.ok(databaseManagerService.getMetas()); + } + + @PostMapping("/execute/{datasourceId}") + @Authorize(action = "execute", description = "执行SQL") + @ApiOperation("指定数据源执行SQL") + public ResponseMessage> execute( + @PathVariable String datasourceId + , @RequestBody String sqlLines) throws Exception { + DataSourceHolder.switcher().use(datasourceId); + return ResponseMessage.ok(databaseManagerService + .execute(SqlExecuteRequest.builder() + .sql(parseSql(sqlLines)) + .build())); + + } + + @PostMapping("/execute") + @ApiOperation("执行SQL") + @Authorize(action = "execute", description = "执行SQL") + public ResponseMessage> execute(@RequestBody String sqlLines) throws Exception { + return ResponseMessage.ok(databaseManagerService + .execute(SqlExecuteRequest.builder() + .sql(parseSql(sqlLines)) + .build())); + } + + @PostMapping("/transactional/execute/{transactionalId}") + @Authorize(action = "execute", description = "执行SQL") + @ApiOperation("开启事务执行SQL") + public ResponseMessage> executeTransactional(@PathVariable String transactionalId, @RequestBody String sqlLines) throws Exception { + return ResponseMessage.ok(databaseManagerService + .execute(transactionalId,SqlExecuteRequest.builder() + .sql(parseSql(sqlLines)) + .build())); + } + + @GetMapping("/transactional/new") + @Authorize(action = "execute", description = "执行SQL") + @ApiOperation("新建事务") + public ResponseMessage newTransaction() throws Exception { + return ResponseMessage.ok(databaseManagerService.newTransaction()); + } + + @GetMapping("/transactional") + @Authorize(action = "execute", description = "执行SQL") + @ApiOperation("获取全部事务信息") + public ResponseMessage> allTransaction() throws Exception { + return ResponseMessage.ok(databaseManagerService.allTransaction()); + } + + @PostMapping("/transactional/{id}/commit") + @Authorize(action = "execute", description = "执行SQL") + @ApiOperation("提交事务") + public ResponseMessage commitTransaction(@PathVariable String id) throws Exception { + databaseManagerService.commit(id); + return ResponseMessage.ok(); + } + + @PostMapping("/transactional/{id}/rollback") + @Authorize(action = "execute", description = "执行SQL") + @ApiOperation("回滚事务") + public ResponseMessage rollbackTransaction(@PathVariable String id) throws Exception { + databaseManagerService.rollback(id); + return ResponseMessage.ok(); + } + + private List parseSql(String sqlText) { + List sqlList = Sqls.parse(sqlText); + return sqlList.stream().map(sql -> { + SqlInfo sqlInfo = new SqlInfo(); + sqlInfo.setSql(sql); + sqlInfo.setType(sql.split("[ ]")[0].toLowerCase()); + return sqlInfo; + }).collect(Collectors.toList()); + } + +} diff --git a/hsweb-system/hsweb-system-database-manager/pom.xml b/hsweb-system/hsweb-system-database-manager/pom.xml index 2fdebec00..c988e6220 100644 --- a/hsweb-system/hsweb-system-database-manager/pom.xml +++ b/hsweb-system/hsweb-system-database-manager/pom.xml @@ -15,6 +15,8 @@ hsweb-system-database-manager-api hsweb-system-database-manager-simple + hsweb-system-database-manager-web + hsweb-system-database-manager-starter \ No newline at end of file