|
@@ -21,6 +21,7 @@ import (
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
"path/filepath"
|
|
|
+ "strconv"
|
|
|
"strings"
|
|
|
"sync"
|
|
|
"time"
|
|
@@ -190,6 +191,8 @@ func performTx(tx *Transaction) (ret *TxErr) {
|
|
|
ret = tx.doUnfoldHeading(op)
|
|
|
case "setAttrs":
|
|
|
ret = tx.doSetAttrs(op)
|
|
|
+ case "doUpdateUpdated":
|
|
|
+ ret = tx.doUpdateUpdated(op)
|
|
|
case "addFlashcards":
|
|
|
ret = tx.doAddFlashcards(op)
|
|
|
case "removeFlashcards":
|
|
@@ -987,6 +990,35 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+func (tx *Transaction) doUpdateUpdated(operation *Operation) (ret *TxErr) {
|
|
|
+ id := operation.ID
|
|
|
+ tree, err := tx.loadTree(id)
|
|
|
+ if nil != err {
|
|
|
+ if errors.Is(err, ErrBlockNotFound) {
|
|
|
+ logging.LogWarnf("not found block [%s]", id)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ logging.LogErrorf("load tree [%s] failed: %s", id, err)
|
|
|
+ return &TxErr{code: TxErrCodeBlockNotFound, id: id}
|
|
|
+ }
|
|
|
+
|
|
|
+ node := treenode.GetNodeInTree(tree, id)
|
|
|
+ if nil == node {
|
|
|
+ logging.LogErrorf("get node [%s] in tree [%s] failed", id, tree.Root.ID)
|
|
|
+ return &TxErr{msg: ErrBlockNotFound.Error(), id: id}
|
|
|
+ }
|
|
|
+
|
|
|
+ updated := int64(operation.Data.(float64))
|
|
|
+ node.SetIALAttr("updated", strconv.FormatInt(updated, 10))
|
|
|
+ createdUpdated(node)
|
|
|
+ tx.nodes[node.ID] = node
|
|
|
+ if err = tx.writeTree(tree); nil != err {
|
|
|
+ return &TxErr{code: TxErrCodeWriteTree, msg: err.Error(), id: id}
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
func (tx *Transaction) doCreate(operation *Operation) (ret *TxErr) {
|
|
|
tree := operation.Data.(*parse.Tree)
|
|
|
tx.writeTree(tree)
|