From d7d4f4d0dee0021428dfd0dfb882f7dd3f9aa932 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 30 Nov 2023 19:48:30 +0800 Subject: [PATCH] :art: Supports multiple views for the database https://github.com/siyuan-note/siyuan/issues/9751 --- kernel/model/transaction.go | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index cbd6eff5a..f95636035 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -242,6 +242,10 @@ func performTx(tx *Transaction) (ret *TxErr) { ret = tx.doReplaceAttrViewBlock(op) case "updateAttrViewColTemplate": ret = tx.doUpdateAttrViewColTemplate(op) + case "addAttrViewView": + ret = tx.doAddAttrViewView(op) + case "removeAttrViewView": + ret = tx.doRemoveAttrViewView(op) } if nil != ret { @@ -257,6 +261,49 @@ func performTx(tx *Transaction) (ret *TxErr) { return } +func (tx *Transaction) doRemoveAttrViewView(operation *Operation) (ret *TxErr) { + var err error + avID := operation.AvID + attrView, err := av.ParseAttributeView(avID) + if nil != err { + logging.LogErrorf("parse attribute view [%s] failed: %s", avID, err) + return &TxErr{code: TxErrCodeBlockNotFound, id: avID} + } + + viewID := operation.ID + for i, view := range attrView.Views { + if viewID == view.ID { + attrView.Views = append(attrView.Views[:i], attrView.Views[i+1:]...) + break + } + } + + if err = av.SaveAttributeView(attrView); nil != err { + logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) + return &TxErr{code: TxErrCodeWriteTree, msg: err.Error(), id: avID} + } + return +} + +func (tx *Transaction) doAddAttrViewView(operation *Operation) (ret *TxErr) { + var err error + avID := operation.AvID + attrView, err := av.ParseAttributeView(avID) + if nil != err { + logging.LogErrorf("parse attribute view [%s] failed: %s", avID, err) + return &TxErr{code: TxErrCodeBlockNotFound, id: avID} + } + + view := av.NewView() + attrView.Views = append(attrView.Views, view) + attrView.ViewID = view.ID + if err = av.SaveAttributeView(attrView); nil != err { + logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) + return &TxErr{code: TxErrCodeWriteTree, msg: err.Error(), id: avID} + } + return +} + func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) { var err error id := operation.ID