From a2a3bca000cb88926f5a113a4b2a1f6fb6d4654f Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 30 Jan 2026 00:03:29 +0800 Subject: [PATCH] :art: Supports cleaning up unreferenced databases https://github.com/siyuan-note/siyuan/issues/11569 Signed-off-by: Daniel <845765@qq.com> --- kernel/av/av.go | 35 +++++++++++++++++++++++++++++++++++ kernel/model/history.go | 7 ++++--- kernel/sql/av.go | 34 ---------------------------------- kernel/sql/block.go | 2 +- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 9af93258b..db83f7ed8 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -18,6 +18,7 @@ package av import ( + "bytes" "errors" "fmt" "os" @@ -444,6 +445,40 @@ func GetAttributeViewNameByPath(avJSONPath string) (ret string, err error) { return } +func GetAttributeViewContent(avID string) (content string) { + if "" == avID { + return + } + + attrView, err := ParseAttributeView(avID) + if err != nil { + logging.LogErrorf("parse attribute view [%s] failed: %s", avID, err) + return + } + + buf := bytes.Buffer{} + buf.WriteString(attrView.Name) + buf.WriteByte(' ') + for _, v := range attrView.Views { + buf.WriteString(v.Name) + buf.WriteByte(' ') + } + + for _, keyValues := range attrView.KeyValues { + buf.WriteString(keyValues.Key.Name) + buf.WriteByte(' ') + for _, value := range keyValues.Values { + if nil != value { + buf.WriteString(value.String(true)) + buf.WriteByte(' ') + } + } + } + + content = strings.TrimSpace(buf.String()) + return +} + func IsAttributeViewExist(avID string) bool { avJSONPath := GetAttributeViewDataPath(avID) return filelock.IsExist(avJSONPath) diff --git a/kernel/model/history.go b/kernel/model/history.go index caa6cc38a..c8868fddc 100644 --- a/kernel/model/history.go +++ b/kernel/model/history.go @@ -528,7 +528,7 @@ func buildSearchHistoryQueryFilter(query, op, box, table string, typ int) (stmt case HistoryTypeAsset: stmt += table + " MATCH '{title content}:(" + query + ")'" case HistoryTypeDatabase: - stmt += table + " MATCH '{title}:(" + query + ")'" + stmt += table + " MATCH '{content}:(" + query + ")'" } } else { stmt += "1=1" @@ -987,12 +987,13 @@ func indexHistoryDir(name string, luteEngine *lute.Lute) { } p := strings.TrimPrefix(database, util.HistoryDir) p = filepath.ToSlash(p[1:]) - avName, _ := av.GetAttributeViewNameByPath(database) + content := av.GetAttributeViewContent(id) histories = append(histories, &sql.History{ ID: id, Type: HistoryTypeDatabase, Op: op, - Title: id + avName, + Title: id, + Content: content, Path: p, Created: created, }) diff --git a/kernel/sql/av.go b/kernel/sql/av.go index 54eef8f4f..fa4402ce3 100644 --- a/kernel/sql/av.go +++ b/kernel/sql/av.go @@ -741,40 +741,6 @@ func FillAttributeViewNilValue(value *av.Value, typ av.KeyType) { } } -func getAttributeViewContent(avID string) (content string) { - if "" == avID { - return - } - - attrView, err := av.ParseAttributeView(avID) - if err != nil { - logging.LogErrorf("parse attribute view [%s] failed: %s", avID, err) - return - } - - buf := bytes.Buffer{} - buf.WriteString(attrView.Name) - buf.WriteByte(' ') - for _, v := range attrView.Views { - buf.WriteString(v.Name) - buf.WriteByte(' ') - } - - for _, keyValues := range attrView.KeyValues { - buf.WriteString(keyValues.Key.Name) - buf.WriteByte(' ') - for _, value := range keyValues.Values { - if nil != value { - buf.WriteString(value.String(true)) - buf.WriteByte(' ') - } - } - } - - content = strings.TrimSpace(buf.String()) - return -} - func getBlockValue(keyValues []*av.KeyValues) (ret *av.Value) { for _, kv := range keyValues { if av.KeyTypeBlock == kv.Key.Type && 0 < len(kv.Values) { diff --git a/kernel/sql/block.go b/kernel/sql/block.go index c066c02b8..9b4c510b4 100644 --- a/kernel/sql/block.go +++ b/kernel/sql/block.go @@ -146,7 +146,7 @@ func NodeStaticContent(node *ast.Node, excludeTypes []string, includeTextMarkATi if ast.NodeAttributeView == node.Type { if fullAttrView { - return getAttributeViewContent(node.AttributeViewID) + return av.GetAttributeViewContent(node.AttributeViewID) } ret, _ := av.GetAttributeViewName(node.AttributeViewID)