Exemplo n.º 1
0
        internal void CommitAndIncrementSerial(IReadOnlyList <DnsResourceRecord> deletedRecords = null, IReadOnlyList <DnsResourceRecord> addedRecords = null)
        {
            if (_internal)
            {
                return;
            }

            lock (_history)
            {
                DnsResourceRecord oldSoaRecord = _entries[DnsResourceRecordType.SOA][0];
                DnsResourceRecord newSoaRecord;
                {
                    DnsSOARecord soa = oldSoaRecord.RDATA as DnsSOARecord;

                    uint serial = soa.Serial;
                    if (serial < uint.MaxValue)
                    {
                        serial++;
                    }
                    else
                    {
                        serial = 1;
                    }

                    newSoaRecord = new DnsResourceRecord(oldSoaRecord.Name, oldSoaRecord.Type, oldSoaRecord.Class, oldSoaRecord.TtlValue, new DnsSOARecord(soa.PrimaryNameServer, soa.ResponsiblePerson, serial, soa.Refresh, soa.Retry, soa.Expire, soa.Minimum))
                    {
                        Tag = oldSoaRecord.Tag
                    };
                    oldSoaRecord.Tag = null; //remove RR info from old SOA to allow creating new RR info for it during SetDeletedOn()
                }

                //update SOA
                _entries[DnsResourceRecordType.SOA] = new DnsResourceRecord[] { newSoaRecord };

                //start commit
                oldSoaRecord.SetDeletedOn(DateTime.UtcNow);

                //write removed
                _history.Add(oldSoaRecord);

                if (deletedRecords is not null)
                {
                    foreach (DnsResourceRecord deletedRecord in deletedRecords)
                    {
                        if (deletedRecord.IsDisabled())
                        {
                            continue;
                        }

                        _history.Add(deletedRecord);

                        if (deletedRecord.Type == DnsResourceRecordType.NS)
                        {
                            _history.AddRange(deletedRecord.GetGlueRecords());
                        }
                    }
                }

                //write added
                _history.Add(newSoaRecord);

                if (addedRecords is not null)
                {
                    foreach (DnsResourceRecord addedRecord in addedRecords)
                    {
                        if (addedRecord.IsDisabled())
                        {
                            continue;
                        }

                        _history.Add(addedRecord);

                        if (addedRecord.Type == DnsResourceRecordType.NS)
                        {
                            _history.AddRange(addedRecord.GetGlueRecords());
                        }
                    }
                }

                //end commit

                CleanupHistory(_history);
            }
        }