mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 15:10:12 +01:00
⚡ 改进多个功能点的性能 https://github.com/siyuan-note/siyuan/issues/7177
This commit is contained in:
parent
5da5ae8818
commit
2b09ea75f0
7 changed files with 56 additions and 63 deletions
|
|
@ -27,7 +27,6 @@ import (
|
||||||
"github.com/siyuan-note/filelock"
|
"github.com/siyuan-note/filelock"
|
||||||
"github.com/siyuan-note/logging"
|
"github.com/siyuan-note/logging"
|
||||||
"github.com/siyuan-note/siyuan/kernel/model"
|
"github.com/siyuan-note/siyuan/kernel/model"
|
||||||
"github.com/siyuan-note/siyuan/kernel/sql"
|
|
||||||
"github.com/siyuan-note/siyuan/kernel/util"
|
"github.com/siyuan-note/siyuan/kernel/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -155,7 +154,19 @@ func checkBlockFold(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
id := arg["id"].(string)
|
id := arg["id"].(string)
|
||||||
ret.Data = sql.IsBlockFolded(id)
|
b, err := model.GetBlock(id, nil)
|
||||||
|
if errors.Is(err, filelock.ErrUnableAccessFile) {
|
||||||
|
ret.Code = 2
|
||||||
|
ret.Data = id
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if errors.Is(err, model.ErrIndexing) {
|
||||||
|
ret.Code = 0
|
||||||
|
ret.Data = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ret.Data = nil != b && "1" == b.IAL["fold"]
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkBlockExist(c *gin.Context) {
|
func checkBlockExist(c *gin.Context) {
|
||||||
|
|
@ -168,7 +179,7 @@ func checkBlockExist(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
id := arg["id"].(string)
|
id := arg["id"].(string)
|
||||||
b, err := model.GetBlock(id)
|
b, err := model.GetBlock(id, nil)
|
||||||
if errors.Is(err, filelock.ErrUnableAccessFile) {
|
if errors.Is(err, filelock.ErrUnableAccessFile) {
|
||||||
ret.Code = 2
|
ret.Code = 2
|
||||||
ret.Data = id
|
ret.Data = id
|
||||||
|
|
@ -376,7 +387,8 @@ func getBlockInfo(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
id := arg["id"].(string)
|
id := arg["id"].(string)
|
||||||
block, err := model.GetBlock(id)
|
|
||||||
|
tree, err := model.LoadTreeByID(id)
|
||||||
if errors.Is(err, filelock.ErrUnableAccessFile) {
|
if errors.Is(err, filelock.ErrUnableAccessFile) {
|
||||||
ret.Code = 2
|
ret.Code = 2
|
||||||
ret.Data = id
|
ret.Data = id
|
||||||
|
|
@ -387,6 +399,8 @@ func getBlockInfo(c *gin.Context) {
|
||||||
ret.Msg = model.Conf.Language(56)
|
ret.Msg = model.Conf.Language(56)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
block, _ := model.GetBlock(id, tree)
|
||||||
if nil == block {
|
if nil == block {
|
||||||
ret.Code = -1
|
ret.Code = -1
|
||||||
ret.Msg = fmt.Sprintf(model.Conf.Language(15), id)
|
ret.Msg = fmt.Sprintf(model.Conf.Language(15), id)
|
||||||
|
|
@ -401,13 +415,13 @@ func getBlockInfo(c *gin.Context) {
|
||||||
rootChildID = b.ID
|
rootChildID = b.ID
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if b, _ = model.GetBlock(parentID); nil == b {
|
if b, _ = model.GetBlock(parentID, tree); nil == b {
|
||||||
logging.LogErrorf("not found parent")
|
logging.LogErrorf("not found parent")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
root, err := model.GetBlock(block.RootID)
|
root, err := model.GetBlock(block.RootID, tree)
|
||||||
if errors.Is(err, filelock.ErrUnableAccessFile) {
|
if errors.Is(err, filelock.ErrUnableAccessFile) {
|
||||||
ret.Code = 2
|
ret.Code = 2
|
||||||
ret.Data = id
|
ret.Data = id
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,7 @@ func updateBlock(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
block, err := model.GetBlock(id)
|
block, err := model.GetBlock(id, nil)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
ret.Code = -1
|
ret.Code = -1
|
||||||
ret.Msg = "get block failed: " + err.Error()
|
ret.Msg = "get block failed: " + err.Error()
|
||||||
|
|
|
||||||
|
|
@ -327,7 +327,7 @@ func duplicateDoc(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
id := arg["id"].(string)
|
id := arg["id"].(string)
|
||||||
newTree, err := model.DuplicateDoc(id)
|
tree, err := model.LoadTreeByID(id)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
ret.Code = -1
|
ret.Code = -1
|
||||||
ret.Msg = err.Error()
|
ret.Msg = err.Error()
|
||||||
|
|
@ -335,24 +335,17 @@ func duplicateDoc(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
block, _ := model.GetBlock(id)
|
p := tree.Path
|
||||||
p := block.Path
|
notebook := tree.Box
|
||||||
notebook := block.Box
|
|
||||||
box := model.Conf.Box(notebook)
|
box := model.Conf.Box(notebook)
|
||||||
tree, err := model.LoadTree(box.ID, p)
|
model.DuplicateDoc(tree)
|
||||||
if nil != err {
|
|
||||||
ret.Code = -1
|
|
||||||
ret.Msg = err.Error()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
pushCreate(box, p, tree.Root.ID, arg)
|
pushCreate(box, p, tree.Root.ID, arg)
|
||||||
|
|
||||||
ret.Data = map[string]interface{}{
|
ret.Data = map[string]interface{}{
|
||||||
"id": newTree.Root.ID,
|
"id": tree.Root.ID,
|
||||||
"notebook": notebook,
|
"notebook": notebook,
|
||||||
"path": newTree.Path,
|
"path": tree.Path,
|
||||||
"hPath": newTree.HPath,
|
"hPath": tree.HPath,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -478,7 +471,7 @@ func createDocWithMd(c *gin.Context) {
|
||||||
ret.Data = id
|
ret.Data = id
|
||||||
|
|
||||||
box := model.Conf.Box(notebook)
|
box := model.Conf.Box(notebook)
|
||||||
b, _ := model.GetBlock(id)
|
b, _ := model.GetBlock(id, nil)
|
||||||
p := b.Path
|
p := b.Path
|
||||||
pushCreate(box, p, id, arg)
|
pushCreate(box, p, id, arg)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ import (
|
||||||
"github.com/88250/lute/ast"
|
"github.com/88250/lute/ast"
|
||||||
"github.com/88250/lute/parse"
|
"github.com/88250/lute/parse"
|
||||||
"github.com/siyuan-note/siyuan/kernel/sql"
|
"github.com/siyuan-note/siyuan/kernel/sql"
|
||||||
"github.com/siyuan-note/siyuan/kernel/task"
|
|
||||||
"github.com/siyuan-note/siyuan/kernel/treenode"
|
"github.com/siyuan-note/siyuan/kernel/treenode"
|
||||||
"github.com/siyuan-note/siyuan/kernel/util"
|
"github.com/siyuan-note/siyuan/kernel/util"
|
||||||
)
|
)
|
||||||
|
|
@ -383,31 +382,33 @@ func GetBlockKramdown(id string) (ret string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetBlock(id string) (ret *Block, err error) {
|
func GetBlock(id string, tree *parse.Tree) (ret *Block, err error) {
|
||||||
ret, err = getBlock(id)
|
ret, err = getBlock(id, tree)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func getBlock(id string) (ret *Block, err error) {
|
func getBlock(id string, tree *parse.Tree) (ret *Block, err error) {
|
||||||
if "" == id {
|
if "" == id {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tree, err := loadTreeByBlockID(id)
|
if nil == tree {
|
||||||
|
tree, err = loadTreeByBlockID(id)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
if task.ContainIndexTask() {
|
|
||||||
err = ErrIndexing
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
tree, err = loadTreeByBlockID(id)
|
tree, err = loadTreeByBlockID(id)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
node := treenode.GetNodeInTree(tree, id)
|
node := treenode.GetNodeInTree(tree, id)
|
||||||
|
if nil == node {
|
||||||
|
err = ErrBlockNotFound
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
sqlBlock := sql.BuildBlockFromNode(node, tree)
|
sqlBlock := sql.BuildBlockFromNode(node, tree)
|
||||||
if nil == sqlBlock {
|
if nil == sqlBlock {
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -892,18 +892,12 @@ func renameWriteJSONQueue(tree *parse.Tree, oldHPath string) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func DuplicateDoc(rootID string) (ret *parse.Tree, err error) {
|
func DuplicateDoc(tree *parse.Tree) {
|
||||||
msgId := util.PushMsg(Conf.Language(116), 30000)
|
msgId := util.PushMsg(Conf.Language(116), 30000)
|
||||||
defer util.PushClearMsg(msgId)
|
defer util.PushClearMsg(msgId)
|
||||||
|
|
||||||
WaitForWritingFiles()
|
resetTree(tree, "Duplicated")
|
||||||
ret, err = loadTreeByBlockID(rootID)
|
createTreeTx(tree)
|
||||||
if nil != err {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
resetTree(ret, "Duplicated")
|
|
||||||
createTreeTx(ret)
|
|
||||||
WaitForWritingFiles()
|
WaitForWritingFiles()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import (
|
||||||
"github.com/siyuan-note/filelock"
|
"github.com/siyuan-note/filelock"
|
||||||
"github.com/siyuan-note/logging"
|
"github.com/siyuan-note/logging"
|
||||||
"github.com/siyuan-note/siyuan/kernel/filesys"
|
"github.com/siyuan-note/siyuan/kernel/filesys"
|
||||||
|
"github.com/siyuan-note/siyuan/kernel/task"
|
||||||
"github.com/siyuan-note/siyuan/kernel/treenode"
|
"github.com/siyuan-note/siyuan/kernel/treenode"
|
||||||
"github.com/siyuan-note/siyuan/kernel/util"
|
"github.com/siyuan-note/siyuan/kernel/util"
|
||||||
)
|
)
|
||||||
|
|
@ -145,6 +146,10 @@ var (
|
||||||
ErrIndexing = errors.New("indexing")
|
ErrIndexing = errors.New("indexing")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func LoadTreeByID(id string) (ret *parse.Tree, err error) {
|
||||||
|
return loadTreeByBlockID(id)
|
||||||
|
}
|
||||||
|
|
||||||
func loadTreeByBlockID(id string) (ret *parse.Tree, err error) {
|
func loadTreeByBlockID(id string) (ret *parse.Tree, err error) {
|
||||||
if "" == id {
|
if "" == id {
|
||||||
return nil, ErrTreeNotFound
|
return nil, ErrTreeNotFound
|
||||||
|
|
@ -152,6 +157,11 @@ func loadTreeByBlockID(id string) (ret *parse.Tree, err error) {
|
||||||
|
|
||||||
bt := treenode.GetBlockTree(id)
|
bt := treenode.GetBlockTree(id)
|
||||||
if nil == bt {
|
if nil == bt {
|
||||||
|
if task.ContainIndexTask() {
|
||||||
|
err = ErrIndexing
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
return nil, ErrBlockNotFound
|
return nil, ErrBlockNotFound
|
||||||
}
|
}
|
||||||
ret, err = LoadTree(bt.BoxID, bt.Path)
|
ret, err = LoadTree(bt.BoxID, bt.Path)
|
||||||
|
|
|
||||||
|
|
@ -95,25 +95,6 @@ func (block *Block) IsContainerBlock() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsBlockFolded(id string) (ret bool) {
|
|
||||||
sqlStmt := "SELECT parent_id, ial FROM blocks WHERE id = ? AND type != 'd'"
|
|
||||||
for i := 0; i < 64; i++ {
|
|
||||||
row := queryRow(sqlStmt, id)
|
|
||||||
var pid, ial string
|
|
||||||
if err := row.Scan(&pid, &ial); nil != err {
|
|
||||||
if sql.ErrNoRows != err {
|
|
||||||
logging.LogErrorf("query scan field failed: %s", err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
id = pid
|
|
||||||
if strings.Contains(ial, "fold=\"1\"") {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func queryBlockChildrenIDs(id string) (ret []string) {
|
func queryBlockChildrenIDs(id string) (ret []string) {
|
||||||
ret = append(ret, id)
|
ret = append(ret, id)
|
||||||
childIDs := queryBlockIDByParentID(id)
|
childIDs := queryBlockIDByParentID(id)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue