-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathupdate.go
48 lines (45 loc) · 1.04 KB
/
update.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package btree
import (
"bytes"
"github.com/golang/protobuf/proto"
)
// Update is used to update key/value
func (t *Btree) update(record TreeLog) error {
tnode, err := t.getTreeNode(t.GetRoot())
if err != nil {
return err
}
clonedNode, err := tnode.updateRecord(record, t)
if err == nil {
t.Root = proto.Int64(clonedNode.GetId())
}
return err
}
// update node
func (n *TreeNode) updateRecord(record TreeLog, tree *Btree) (*TreeNode, error) {
index := n.locate(record.Key)
var nnode *TreeNode
var clonedNode *TreeNode
var err error
if n.GetNodeType() == isNode {
tnode, err := tree.getTreeNode(n.Childrens[index])
if err != nil {
return tnode, err
}
clonedNode, err = tnode.updateRecord(record, tree)
if err == nil {
nnode = n.clone(tree)
nnode.Childrens[index] = clonedNode.GetId()
}
} else {
index--
if index >= 0 {
if bytes.Compare(n.Keys[index], record.Key) == 0 {
nnode = n.clone(tree)
nnode.Values[index] = record.Value
}
}
}
tree.Nodes[nnode.GetId()], err = proto.Marshal(nnode)
return nnode, err
}