diff options
Diffstat (limited to 'middleware/file/tree/tree.go')
-rw-r--r-- | middleware/file/tree/tree.go | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/middleware/file/tree/tree.go b/middleware/file/tree/tree.go index 05dfdfa7d..ca616ad67 100644 --- a/middleware/file/tree/tree.go +++ b/middleware/file/tree/tree.go @@ -13,7 +13,7 @@ // Heavily modified by Miek Gieben for use in DNS zones. package tree -// TODO(miek): locking? lockfree +// TODO(miek): locking? lockfree would be nice. Will probably go for fine grained locking on the name level. // TODO(miek): fix docs import ( @@ -64,6 +64,14 @@ func (e *Elem) All() []dns.RR { return list } +// Return the domain name for this element. +func (e *Elem) Name() string { + for _, rrs := range e.m { + return rrs[0].Header().Name + } + return "" +} + // Insert inserts rr into e. If rr is equal to existing rrs this is a noop. func (e *Elem) Insert(rr dns.RR) { t := rr.Header().Rrtype @@ -112,10 +120,7 @@ func (e *Elem) Delete(rr dns.RR) (empty bool) { } func Less(a *Elem, rr dns.RR) int { - for _, ar := range a.m { // Get first element in a - return middleware.Less(ar[0].Header().Name, rr.Header().Name) - } - return 0 + return middleware.Less(rr.Header().Name, a.Name()) } // Assuming the same type and name this will check if the rdata is equal as well. @@ -539,6 +544,33 @@ func (n *Node) ceil(rr dns.RR) *Node { return n } +// Do performs fn on all values stored in the tree. A boolean is returned indicating whether the +// Do traversal was interrupted by an Operation returning true. If fn alters stored values' sort +// relationships, future tree operation behaviors are undefined. +func (t *Tree) Do(fn func(e *Elem) bool) bool { + if t.Root == nil { + return false + } + return t.Root.do(fn) +} + +func (n *Node) do(fn func(e *Elem) bool) (done bool) { + if n.Left != nil { + done = n.Left.do(fn) + if done { + return + } + } + done = fn(n.Elem) + if done { + return + } + if n.Right != nil { + done = n.Right.do(fn) + } + return +} + /* Copyright ©2012 The bíogo Authors. All rights reserved. |