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); } }