diff --git a/app/electron/main.js b/app/electron/main.js
index cdca57ade..faae062be 100644
--- a/app/electron/main.js
+++ b/app/electron/main.js
@@ -550,7 +550,7 @@ const initKernel = (initData) => {
switch (code) {
case 20:
showErrorWindow('⚠️ 数据库被锁定 The database is locked',
- `
数据库文件正在被其他进程占用,请检查是否同时存在多个内核进程(SiYuan Kernel)。
The database file is being occupied by other processes, please check whether there are multiple kernel processes (SiYuan Kernel) at the same time.
`)
+ `数据库文件正在被其他进程占用,请检查是否同时存在多个内核进程(SiYuan Kernel)服务相同的工作空间。
The database file is being occupied by other processes, please check whether there are multiple kernel processes (SiYuan Kernel) serving the same workspace at the same time.
`)
break
case 21:
showErrorWindow('⚠️ 监听端口 ' + kernelPort + ' 失败 Failed to listen to port ' + kernelPort,
diff --git a/app/src/config/exportConfig.ts b/app/src/config/exportConfig.ts
index 03d517a41..db0ccffec 100644
--- a/app/src/config/exportConfig.ts
+++ b/app/src/config/exportConfig.ts
@@ -1,8 +1,9 @@
import {fetchPost} from "../util/fetch";
/// #if !BROWSER
import {dialog} from "@electron/remote";
-import {SaveDialogReturnValue, shell} from "electron";
+import {shell} from "electron";
import {afterExport} from "../protyle/export/util";
+import * as path from "path";
/// #endif
import {isBrowser} from "../util/functions";
import {showMessage} from "../dialog/message";
@@ -157,19 +158,20 @@ export const exportConfig = {
window.location.href = response.data.zip;
});
/// #else
- dialog.showSaveDialog({
- defaultPath: "data",
- properties: ["showOverwriteConfirmation"],
- }).then((result: SaveDialogReturnValue) => {
- if (!result.canceled) {
- const msgId = showMessage(window.siyuan.languages.exporting, -1);
- fetchPost("/api/export/exportDataInFolder", {
- folder: result.filePath
- }, () => {
- afterExport(result.filePath, msgId);
- });
- }
- });
+ let filePaths = dialog.showOpenDialogSync({
+ title: window.siyuan.languages.export + " " + "Data",
+ properties: ["createDirectory", "openDirectory"],
+ })
+ if (filePaths && 0 < filePaths.length) {
+ const savePath = filePaths[0];
+ const msgId = showMessage(window.siyuan.languages.exporting, -1);
+ fetchPost("/api/export/exportDataInFolder", {
+ folder: savePath,
+ }, response => {
+ afterExport(path.join(savePath, response.data.name), msgId);
+ });
+ }
+
/// #endif
});
/// #if !BROWSER
diff --git a/kernel/api/export.go b/kernel/api/export.go
index 7e516d43e..aa7ed6f6a 100644
--- a/kernel/api/export.go
+++ b/kernel/api/export.go
@@ -41,13 +41,16 @@ func exportDataInFolder(c *gin.Context) {
}
exportFolder := arg["folder"].(string)
- err := model.ExportDataInFolder(exportFolder)
+ name, err := model.ExportDataInFolder(exportFolder)
if nil != err {
ret.Code = -1
ret.Msg = err.Error()
ret.Data = map[string]interface{}{"closeTimeout": 7000}
return
}
+ ret.Data = map[string]interface{}{
+ "name": name,
+ }
}
func exportData(c *gin.Context) {
diff --git a/kernel/model/box.go b/kernel/model/box.go
index e6fee5e2b..f6ef21498 100644
--- a/kernel/model/box.go
+++ b/kernel/model/box.go
@@ -530,7 +530,7 @@ func FullReindex() {
WaitForWritingFiles()
if err := sql.InitDatabase(true); nil != err {
- util.PushErrMsg(fmt.Sprintf(Conf.Language(85), err), 5000)
+ os.Exit(util.ExitCodeReadOnlyDatabase)
return
}
treenode.InitBlockTree(true)
diff --git a/kernel/model/export.go b/kernel/model/export.go
index 108b3ac1e..fbe6a2c02 100644
--- a/kernel/model/export.go
+++ b/kernel/model/export.go
@@ -120,17 +120,18 @@ func ExportSY(id string) (name, zipPath string) {
return
}
-func ExportDataInFolder(exportFolder string) (err error) {
+func ExportDataInFolder(exportFolder string) (name string, err error) {
util.PushEndlessProgress(Conf.Language(65))
defer util.ClearPushProgress(100)
WaitForWritingFiles()
exportFolder = filepath.Join(exportFolder, util.CurrentTimeSecondsStr())
- err = exportData(exportFolder)
+ zipPath, err := exportData(exportFolder)
if nil != err {
return
}
+ name = filepath.Base(zipPath)
return
}
@@ -140,10 +141,8 @@ func ExportData() (zipPath string) {
WaitForWritingFiles()
- baseFolderName := "data-" + util.CurrentTimeSecondsStr()
- exportFolder := filepath.Join(util.TempDir, "export", baseFolderName)
- zipPath = exportFolder + ".zip"
- err := exportData(exportFolder)
+ exportFolder := filepath.Join(util.TempDir, "export", util.CurrentTimeSecondsStr())
+ zipPath, err := exportData(exportFolder)
if nil != err {
return
}
@@ -151,7 +150,7 @@ func ExportData() (zipPath string) {
return
}
-func exportData(exportFolder string) (err error) {
+func exportData(exportFolder string) (zipPath string, err error) {
baseFolderName := "data-" + util.CurrentTimeSecondsStr()
if err = os.MkdirAll(exportFolder, 0755); nil != err {
logging.LogErrorf("create export temp folder failed: %s", err)
@@ -165,7 +164,7 @@ func exportData(exportFolder string) (err error) {
return
}
- zipPath := exportFolder + ".zip"
+ zipPath = exportFolder + ".zip"
zip, err := gulu.Zip.Create(zipPath)
if nil != err {
logging.LogErrorf("create export data zip [%s] failed: %s", exportFolder, err)
diff --git a/kernel/server/serve.go b/kernel/server/serve.go
index 0ac7ab2f6..d5e68ee06 100644
--- a/kernel/server/serve.go
+++ b/kernel/server/serve.go
@@ -118,9 +118,9 @@ func Serve(fastMode bool) {
// 启动一个 6806 端口的反向代理服务器,这样浏览器扩展才能直接使用 127.0.0.1:6806,不用配置端口
serverURL, _ := url.Parse("http://" + host + ":" + port)
proxy := httputil.NewSingleHostReverseProxy(serverURL)
- logging.LogInfof("kernel reverse proxy server [%s] is booting", util.FixedPort)
+ logging.LogInfof("reverse proxy server [%s] is booting", util.FixedPort)
if proxyErr := http.ListenAndServe(host+":"+util.FixedPort, proxy); nil != proxyErr {
- logging.LogErrorf("boot kernel reverse proxy server [%s] failed: %s", serverURL, proxyErr)
+ logging.LogWarnf("boot reverse proxy server [%s] failed: %s", serverURL, proxyErr)
}
// 反代服务器启动失败不影响核心服务器启动
}