* plugin/file: Rename do to walk, cleanup and document * This renames Do to Walk to be more inline with Go standards. Also make it return an error instead of a bool. Also give give walk access to rrs. Alternatively e.m could be exported, but just access the map of rrs should work as well. Another alternative would be adding a whole bunch of helper functions, but those need grab and return the data. Just having access to the rrs should be easiest for most Walks. * It adds Type and TypeForWildcard to show the different functions * *Removes* the identical RR check when inserting; this was only done for A, AAAA and MX and not finished; removed under the mantra garbage in garbage out. * Reuses Types to return all the types in an *tree.Elem Signed-off-by: Miek Gieben <miek@miek.nl> * better comments Signed-off-by: Miek Gieben <miek@miek.nl>
101 lines
2.1 KiB
Go
101 lines
2.1 KiB
Go
package tree
|
|
|
|
import "github.com/miekg/dns"
|
|
|
|
// Elem is an element in the tree.
|
|
type Elem struct {
|
|
m map[uint16][]dns.RR
|
|
name string // owner name
|
|
}
|
|
|
|
// newElem returns a new elem.
|
|
func newElem(rr dns.RR) *Elem {
|
|
e := Elem{m: make(map[uint16][]dns.RR)}
|
|
e.m[rr.Header().Rrtype] = []dns.RR{rr}
|
|
return &e
|
|
}
|
|
|
|
// Types returns the types of the records in e. The returned list is not sorted.
|
|
func (e *Elem) Types() []uint16 {
|
|
t := make([]uint16, len(e.m))
|
|
i := 0
|
|
for ty := range e.m {
|
|
t[i] = ty
|
|
i++
|
|
}
|
|
return t
|
|
}
|
|
|
|
// Type returns the RRs with type qtype from e.
|
|
func (e *Elem) Type(qtype uint16) []dns.RR { return e.m[qtype] }
|
|
|
|
// TypeForWildcard returns the RRs with type qtype from e. The ownername returned is set to qname.
|
|
func (e *Elem) TypeForWildcard(qtype uint16, qname string) []dns.RR {
|
|
rrs := e.m[qtype]
|
|
|
|
if rrs == nil {
|
|
return nil
|
|
}
|
|
|
|
copied := make([]dns.RR, len(rrs))
|
|
for i := range rrs {
|
|
copied[i] = dns.Copy(rrs[i])
|
|
copied[i].Header().Name = qname
|
|
}
|
|
return copied
|
|
}
|
|
|
|
// All returns all RRs from e, regardless of type.
|
|
func (e *Elem) All() []dns.RR {
|
|
list := []dns.RR{}
|
|
for _, rrs := range e.m {
|
|
list = append(list, rrs...)
|
|
}
|
|
return list
|
|
}
|
|
|
|
// Name returns the name for this node.
|
|
func (e *Elem) Name() string {
|
|
if e.name != "" {
|
|
return e.name
|
|
}
|
|
for _, rrs := range e.m {
|
|
e.name = rrs[0].Header().Name
|
|
return e.name
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Empty returns true is e does not contain any RRs, i.e. is an empty-non-terminal.
|
|
func (e *Elem) Empty() bool { return len(e.m) == 0 }
|
|
|
|
// Insert inserts rr into e. If rr is equal to existing RRs, the RR will be added anyway.
|
|
func (e *Elem) Insert(rr dns.RR) {
|
|
t := rr.Header().Rrtype
|
|
if e.m == nil {
|
|
e.m = make(map[uint16][]dns.RR)
|
|
e.m[t] = []dns.RR{rr}
|
|
return
|
|
}
|
|
rrs, ok := e.m[t]
|
|
if !ok {
|
|
e.m[t] = []dns.RR{rr}
|
|
return
|
|
}
|
|
|
|
rrs = append(rrs, rr)
|
|
e.m[t] = rrs
|
|
}
|
|
|
|
// Delete removes all RRs of type rr.Header().Rrtype from e.
|
|
func (e *Elem) Delete(rr dns.RR) {
|
|
if e.m == nil {
|
|
return
|
|
}
|
|
|
|
t := rr.Header().Rrtype
|
|
delete(e.m, t)
|
|
}
|
|
|
|
// Less is a tree helper function that calls less.
|
|
func Less(a *Elem, name string) int { return less(name, a.Name()) }
|