// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. //go:build plus package models import ( "github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs" "strings" ) type DomainRecords struct { RecordsMap map[RecordKey]*RouteRecords // key => records Keys map[int64]RecordKey // recordId => key } func NewDomainRecords() *DomainRecords { return &DomainRecords{ RecordsMap: map[RecordKey]*RouteRecords{}, Keys: map[int64]RecordKey{}, } } func (this *DomainRecords) Add(record *NSRecord) { var key = NewRecordKey(record.Name, record.Type) records, ok := this.RecordsMap[key] if !ok { records = NewRouteRecords() this.RecordsMap[key] = records } records.Add(record) this.Keys[record.Id] = key } func (this *DomainRecords) Find(routeCodes []string, recordName string, recordType string, config *dnsconfigs.NSAnswerConfig, strictMode bool) (record []*NSRecord, routeCode string) { // NAME.example.com var key = NewRecordKey(recordName, recordType) records, ok := this.RecordsMap[key] if ok { return records.Find(routeCodes, config, strictMode) } // @.example.com if len(recordName) == 0 { records, ok = this.RecordsMap[NewRecordKey("@", recordType)] if ok { return records.Find(routeCodes, config, strictMode) } return nil, "" } // *.NAME.example.com var dotIndex = strings.Index(recordName, ".") var wildcardNames = []string{} if dotIndex > 0 { wildcardNames = append(wildcardNames, "*."+recordName[dotIndex+1:]) } wildcardNames = append(wildcardNames, "*") for _, wildcardName := range wildcardNames { records, ok = this.RecordsMap[NewRecordKey(wildcardName, recordType)] if ok { return records.Find(routeCodes, config, strictMode) } } return nil, "" } func (this *DomainRecords) Remove(recordId int64) { key, ok := this.Keys[recordId] if ok { var recordsMap = this.RecordsMap[key] recordsMap.Remove(recordId) if recordsMap.IsEmpty() { delete(this.RecordsMap, key) } delete(this.Keys, recordId) } }