mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00

Before this change if the value of a Node was "" it would get dropped from the json encoding and the Node.Value field would be missing. Fix this problem by making NodeExtern.Value a *string so that an empty string will be encoded but a nil value will drop the field.
72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package store
|
|
|
|
import (
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
// NodeExtern is the external representation of the
|
|
// internal node with additional fields
|
|
// PrevValue is the previous value of the node
|
|
// TTL is time to live in second
|
|
type NodeExtern struct {
|
|
Key string `json:"key,omitempty"`
|
|
Value *string `json:"value,omitempty"`
|
|
Dir bool `json:"dir,omitempty"`
|
|
Expiration *time.Time `json:"expiration,omitempty"`
|
|
TTL int64 `json:"ttl,omitempty"`
|
|
Nodes NodeExterns `json:"nodes,omitempty"`
|
|
ModifiedIndex uint64 `json:"modifiedIndex,omitempty"`
|
|
CreatedIndex uint64 `json:"createdIndex,omitempty"`
|
|
}
|
|
|
|
func (eNode *NodeExtern) loadInternalNode(n *node, recursive, sorted bool) {
|
|
if n.IsDir() { // node is a directory
|
|
eNode.Dir = true
|
|
|
|
children, _ := n.List()
|
|
eNode.Nodes = make(NodeExterns, len(children))
|
|
|
|
// we do not use the index in the children slice directly
|
|
// we need to skip the hidden one
|
|
i := 0
|
|
|
|
for _, child := range children {
|
|
if child.IsHidden() { // get will not return hidden nodes
|
|
continue
|
|
}
|
|
|
|
eNode.Nodes[i] = child.Repr(recursive, sorted)
|
|
i++
|
|
}
|
|
|
|
// eliminate hidden nodes
|
|
eNode.Nodes = eNode.Nodes[:i]
|
|
|
|
if sorted {
|
|
sort.Sort(eNode.Nodes)
|
|
}
|
|
|
|
} else { // node is a file
|
|
value, _ := n.Read()
|
|
eNode.Value = &value
|
|
}
|
|
|
|
eNode.Expiration, eNode.TTL = n.ExpirationAndTTL()
|
|
}
|
|
|
|
type NodeExterns []*NodeExtern
|
|
|
|
// interfaces for sorting
|
|
func (ns NodeExterns) Len() int {
|
|
return len(ns)
|
|
}
|
|
|
|
func (ns NodeExterns) Less(i, j int) bool {
|
|
return ns[i].Key < ns[j].Key
|
|
}
|
|
|
|
func (ns NodeExterns) Swap(i, j int) {
|
|
ns[i], ns[j] = ns[j], ns[i]
|
|
}
|