From bdfa2de9ea3b75b0e5bfb6952a79f8915b21bb24 Mon Sep 17 00:00:00 2001 From: shizhendong Date: Tue, 31 May 2022 11:55:16 +0800 Subject: fix: 修改 POST /sys/backup 系统备份接口相关问题 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 按接口文档正确返回 RCode 内容 2. 修改 setFetchSize 值,设置为 0 ,让 JDBC 忽略该值自行设置最优参数 3. 修改 Blob 类型导出不正确问题,改正为导出 十六进制大写字符串 --- .../sys/controller/SysBackupController.java | 13 ++++++-- .../nis/modules/sys/service/SysBackupService.java | 4 +-- .../sys/service/impl/SysBackupServiceImpl.java | 37 +++++++++++++++------- nz-admin/src/main/resources/db/R__AZ_sys_i18n.sql | 6 ++++ .../src/main/java/com/nis/common/utils/RCode.java | 2 +- 5 files changed, 45 insertions(+), 17 deletions(-) diff --git a/nz-admin/src/main/java/com/nis/modules/sys/controller/SysBackupController.java b/nz-admin/src/main/java/com/nis/modules/sys/controller/SysBackupController.java index b7d1f2a7..ad9fcb20 100644 --- a/nz-admin/src/main/java/com/nis/modules/sys/controller/SysBackupController.java +++ b/nz-admin/src/main/java/com/nis/modules/sys/controller/SysBackupController.java @@ -1,5 +1,6 @@ package com.nis.modules.sys.controller; +import cn.hutool.log.Log; import com.nis.common.exception.NZException; import com.nis.common.smartvalidate.ValidateUtils; import com.nis.common.utils.R; @@ -20,6 +21,8 @@ import java.util.Map; @RequestMapping("/sys/backup") public class SysBackupController { + Log log = Log.get(); + @Autowired private SysBackupService sysBackupService; @@ -48,8 +51,14 @@ public class SysBackupController { } @PostMapping - public void backupData() { - sysBackupService.backupData(); + public R backupData() { + try { + sysBackupService.backupData(); + } catch (Exception e) { + log.error("data backup error", e); + throw new NZException(RCode.SYS_BACKUP_ERROR); + } + return R.ok(); } diff --git a/nz-admin/src/main/java/com/nis/modules/sys/service/SysBackupService.java b/nz-admin/src/main/java/com/nis/modules/sys/service/SysBackupService.java index 427f3274..d0582990 100644 --- a/nz-admin/src/main/java/com/nis/modules/sys/service/SysBackupService.java +++ b/nz-admin/src/main/java/com/nis/modules/sys/service/SysBackupService.java @@ -10,8 +10,8 @@ public interface SysBackupService { void save(Map params); List queryBackupList(); - - void backupData(); + + void backupData() throws Exception; void removeBackFileByFilename(String filename); diff --git a/nz-admin/src/main/java/com/nis/modules/sys/service/impl/SysBackupServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/sys/service/impl/SysBackupServiceImpl.java index f43781aa..4b8c022a 100644 --- a/nz-admin/src/main/java/com/nis/modules/sys/service/impl/SysBackupServiceImpl.java +++ b/nz-admin/src/main/java/com/nis/modules/sys/service/impl/SysBackupServiceImpl.java @@ -3,6 +3,7 @@ package com.nis.modules.sys.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; import cn.hutool.log.Log; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -12,6 +13,7 @@ import com.nis.common.utils.*; import com.nis.modules.sys.dao.SysConfigDao; import com.nis.modules.sys.entity.SysConfigEntity; import com.nis.modules.sys.service.SysBackupService; +import org.mariadb.jdbc.MariaDbBlob; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -20,6 +22,7 @@ import javax.sql.DataSource; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.sql.*; import java.util.Date; import java.util.*; @@ -90,7 +93,8 @@ public class SysBackupServiceImpl implements SysBackupService { return result; } - public void backupData() { + @Override + public void backupData() throws Exception { String sqlFilename = null; Connection conn = null; Statement stmtInfo = null, stmtData = null; @@ -187,14 +191,7 @@ public class SysBackupServiceImpl implements SysBackupService { writer.flush(); writer.close(); } - - } catch (Exception e) { - e.printStackTrace(); - log.error("nezha data backup error", e); - if(StringUtils.isNotEmpty(sqlFilename)) { - FileUtil.del(sqlFilename); - } - } finally { + } finally { Tool.IoUtil.close(stmtData); Tool.IoUtil.close(rsData); Tool.IoUtil.close(stmtInfo); @@ -307,7 +304,15 @@ public class SysBackupServiceImpl implements SysBackupService { writer.newLine(); stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - stmt.setFetchSize(Integer.MIN_VALUE); + /** + * If the fetch size specified is zero, the JDBC driver ignores the value and is free to make its own best guess as to what the fetch size should be. + * The default value is set by the Statement object that created the result set. + * The fetch size may be changed at any time. + * @see #setFetchSize + * @link https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#setFetchSize-int- + */ + // stmt.setFetchSize(Integer.MIN_VALUE); + stmt.setFetchSize(0); stmt.setFetchDirection(ResultSet.FETCH_REVERSE); Integer start = 0; @@ -337,8 +342,16 @@ public class SysBackupServiceImpl implements SysBackupService { writer.write(','); } colValue = rs.getObject(j + 1); - if(null != colValue) { - writer.write(String.format("'%s'", this.escapeString(colValue.toString()))); + if (null != colValue) { + // MariaDbBlob 单独处理,解决 bolo 类型直接 toString 造成结果有误问题 + if (colValue instanceof MariaDbBlob) { + InputStream binaryStream = ((MariaDbBlob) colValue).getBinaryStream(); + // 使用 0x 标识十六进制字符串,参照 ResultSet API ,binaryStream 转 十六进制 大写 字符串 + String blobHexStr = Tool.StrUtil.concat(true, "0x", Tool.HexUtil.encodeHexStr(IoUtil.readBytes(binaryStream), false)); + writer.write(blobHexStr); + } else { + writer.write(String.format("'%s'", escapeString(colValue.toString()))); + } } else { writer.write("NULL"); } diff --git a/nz-admin/src/main/resources/db/R__AZ_sys_i18n.sql b/nz-admin/src/main/resources/db/R__AZ_sys_i18n.sql index ff9b3b0a..896be0b1 100644 --- a/nz-admin/src/main/resources/db/R__AZ_sys_i18n.sql +++ b/nz-admin/src/main/resources/db/R__AZ_sys_i18n.sql @@ -5510,5 +5510,11 @@ INSERT INTO `sys_i18n` VALUES (6081, 'ping.trance', 'en', 'ping.trance', 'Trance INSERT INTO `sys_i18n` VALUES (6082, 'ping.trance', 'zh', 'ping.trance', 'Trance', '', '2022-05-18 02:45:00', 1); INSERT INTO `sys_i18n` VALUES (6083, 'overall.snapshoot', 'en', 'overall.snapshoot', 'Snapshoot', '', '2022-05-27 01:35:01', 1); INSERT INTO `sys_i18n` VALUES (6084, 'overall.snapshoot', 'zh', 'overall.snapshoot', '快照', '', '2022-05-27 01:35:11', 1); +INSERT INTO `sys_i18n` VALUES (6085, 'tip.addFavorites', 'en', 'tip.addFavorites', 'Add to Favorites', '', '2022-05-27 02:28:36', 1); +INSERT INTO `sys_i18n` VALUES (6086, 'tip.addFavorites', 'zh', 'tip.addFavorites', '添加到收藏夹', '', '2022-05-27 02:28:59', 1); +INSERT INTO `sys_i18n` VALUES (6087, 'explore.graph', 'en', 'explore.graph', 'Graph', '', '2022-05-30 01:52:47', 1); +INSERT INTO `sys_i18n` VALUES (6088, 'explore.graph', 'zh', 'explore.graph', '图表', '', '2022-05-30 01:53:42', 1); +INSERT INTO `sys_i18n` VALUES (6089, '609002', 'en', 'SYS_BACKUP_ERROR', 'System data backup is abnormal', '', '2022-05-31 03:44:42', 1); +INSERT INTO `sys_i18n` VALUES (6090, '609002', 'zh', 'SYS_BACKUP_ERROR', '系统数据备份异常', '', '2022-05-31 03:45:04', 1); SET FOREIGN_KEY_CHECKS = 1; diff --git a/nz-common/src/main/java/com/nis/common/utils/RCode.java b/nz-common/src/main/java/com/nis/common/utils/RCode.java index b87cc5b6..d59133ba 100644 --- a/nz-common/src/main/java/com/nis/common/utils/RCode.java +++ b/nz-common/src/main/java/com/nis/common/utils/RCode.java @@ -830,7 +830,7 @@ public enum RCode { */ SYS_BACKUP_FILENAME_ISNULL(601000, "System backup file name cannot be empty"), SYS_BACKUP_FILENAME_NOTEXIST(601001, "System backup file does not exist"), - + SYS_BACKUP_ERROR(609002, "System data backup is abnormal"), /** * webshell相关 */ -- cgit v1.2.3