protected override void CacheRecords(IReadOnlyList <DnsResourceRecord> resourceRecords)
        {
            if (resourceRecords.Count == 1)
            {
                CacheZone zone = _root.GetOrAdd(resourceRecords[0].Name, delegate(string key)
                {
                    return(new CacheZone(resourceRecords[0].Name));
                });

                zone.SetRecords(resourceRecords[0].Type, resourceRecords);
            }
            else
            {
                Dictionary <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByDomainRecords = DnsResourceRecord.GroupRecords(resourceRecords);

                //add grouped records
                foreach (KeyValuePair <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByTypeRecords in groupedByDomainRecords)
                {
                    CacheZone zone = _root.GetOrAdd(groupedByTypeRecords.Key, delegate(string key)
                    {
                        return(new CacheZone(groupedByTypeRecords.Key));
                    });

                    foreach (KeyValuePair <DnsResourceRecordType, List <DnsResourceRecord> > groupedRecords in groupedByTypeRecords.Value)
                    {
                        zone.SetRecords(groupedRecords.Key, groupedRecords.Value);
                    }
                }
            }
        }
        protected override void CacheRecords(IReadOnlyList <DnsResourceRecord> resourceRecords)
        {
            //read and set glue records from base class
            foreach (DnsResourceRecord resourceRecord in resourceRecords)
            {
                IReadOnlyList <DnsResourceRecord> glueRecords = GetGlueRecordsFrom(resourceRecord);
                if (glueRecords.Count > 0)
                {
                    resourceRecord.SetGlueRecords(glueRecords);
                }
            }

            if (resourceRecords.Count == 1)
            {
                DnsResourceRecord resourceRecord = resourceRecords[0];

                if (resourceRecord.Name.Contains('*'))
                {
                    return;
                }

                CacheZone zone = _root.GetOrAdd(resourceRecord.Name, delegate(string key)
                {
                    return(new CacheZone(resourceRecord.Name, 1));
                });

                zone.SetRecords(resourceRecord.Type, resourceRecords, _dnsServer.ServeStale);
            }
            else
            {
                Dictionary <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByDomainRecords = DnsResourceRecord.GroupRecords(resourceRecords);
                bool serveStale = _dnsServer.ServeStale;

                //add grouped records
                foreach (KeyValuePair <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByTypeRecords in groupedByDomainRecords)
                {
                    if (groupedByTypeRecords.Key.Contains('*'))
                    {
                        continue;
                    }

                    CacheZone zone = _root.GetOrAdd(groupedByTypeRecords.Key, delegate(string key)
                    {
                        return(new CacheZone(groupedByTypeRecords.Key, groupedByTypeRecords.Value.Count));
                    });

                    foreach (KeyValuePair <DnsResourceRecordType, List <DnsResourceRecord> > groupedRecords in groupedByTypeRecords.Value)
                    {
                        zone.SetRecords(groupedRecords.Key, groupedRecords.Value, serveStale);
                    }
                }
            }
        }
        private AuthZone GetOrAddSubDomainZone(string domain)
        {
            return(_root.GetOrAdd(domain, delegate(string key)
            {
                _ = _root.FindZone(domain, out _, out AuthZone authZone, out _);
                if (authZone == null)
                {
                    throw new DnsServerException("Zone was not found for domain: " + domain);
                }

                if (authZone is PrimaryZone)
                {
                    return new PrimarySubDomainZone(authZone as PrimaryZone, domain);
                }
                else if (authZone is SecondaryZone)
                {
                    return new SecondarySubDomainZone(domain);
                }
                else if (authZone is ForwarderZone)
                {
                    return new ForwarderSubDomainZone(domain);
                }

                throw new DnsServerException("Zone cannot have sub domains.");
            }));
        }