Skip to content

Commit ec2f03b

Browse files
committed
chnum and usage counters are kept and unit test succeeds.
git-svn-id: file:///svn/nsd/trunk@3322 a26ef69c-88ff-0310-839f-98b793d9c207
1 parent 7e76b22 commit ec2f03b

File tree

6 files changed

+43
-3
lines changed

6 files changed

+43
-3
lines changed

dbaccess.c

+1
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ make_zone(namedb_type* db, const dname_type* dname, zone_options_t* zo,
246246
dname->name_size, zone);
247247
assert(zone->node);
248248
zone->apex = domain_table_insert(db->domains, dname);
249+
zone->apex->usage++; /* the zone.apex reference */
249250
zone->soa_rrset = NULL;
250251
zone->soa_nx_rrset = NULL;
251252
zone->ns_rrset = NULL;

difffile.c

+25
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,27 @@ find_rr_num(rrset_type* rrset,
320320
return -1;
321321
}
322322

323+
/* fixup usage lower for domain names in the rdata */
324+
static void
325+
rr_lower_usage(rr_type* rr)
326+
{
327+
unsigned i;
328+
for(i=0; i<rr->rdata_count; i++) {
329+
if(rdata_atom_is_domain(rr->type, i)) {
330+
assert(rdata_atom_domain(rr->rdatas[i])->usage > 0);
331+
rdata_atom_domain(rr->rdatas[i])->usage --;
332+
}
333+
}
334+
}
335+
336+
static void
337+
rrset_lower_usage(rrset_type* rrset)
338+
{
339+
unsigned i;
340+
for(i=0; i<rrset->rr_count; i++)
341+
rr_lower_usage(&rrset->rrs[i]);
342+
}
343+
323344
int
324345
delete_RR(namedb_type* db, const dname_type* dname,
325346
uint16_t type, uint16_t klass,
@@ -364,6 +385,8 @@ delete_RR(namedb_type* db, const dname_type* dname,
364385
dname_to_string(dname,0));
365386
return 1; /* not fatal error */
366387
}
388+
rr_lower_usage(&rrset->rrs[rrnum]);
389+
367390
/* delete the normalized RR from the udb */
368391
udb_del_rr(db->udb, udbz, &rrset->rrs[rrnum]);
369392
if(rrset->rr_count == 1) {
@@ -502,6 +525,7 @@ find_or_create_zone(namedb_type* db, const dname_type* zone_name,
502525
zone_name->name_size, zone);
503526
assert(zone->node);
504527
zone->apex = domain;
528+
domain->usage++; /* the zone.apex reference */
505529
zone->soa_rrset = 0;
506530
zone->soa_nx_rrset = 0;
507531
zone->ns_rrset = 0;
@@ -540,6 +564,7 @@ delete_zone_rrs(namedb_type* db, zone_type* zone)
540564
dname_to_string(domain_dname(domain),0)));
541565
/* delete all rrsets of the zone */
542566
while((rrset = domain_find_any_rrset(domain, zone))) {
567+
rrset_lower_usage(rrset);
543568
rrset_delete(db, domain, rrset);
544569
}
545570
domain = domain_next(domain);

namedb.c

+2
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ domain_table_insert(domain_table_type *table,
187187
dname_name(result->dname),
188188
result->dname->name_size, result);
189189
result->number = table->nametree->count;
190+
if(result->parent)
191+
result->parent->chnum ++;
190192

191193
/*
192194
* If the newly added domain name is larger

rdata.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -698,9 +698,11 @@ rdata_wireformat_to_rdata_atoms(region_type *region,
698698
temp_rdatas[i].data[0] = dname->name_size;
699699
memcpy(temp_rdatas[i].data+1, dname_name(dname),
700700
dname->name_size);
701-
} else
701+
} else {
702702
temp_rdatas[i].domain
703703
= domain_table_insert(owners, dname);
704+
temp_rdatas[i].domain->usage ++;
705+
}
704706
} else {
705707
if (buffer_position(packet) + length > end) {
706708
if (required) {

tpkg/cutest/cutest_namedb.c

+11-2
Original file line numberDiff line numberDiff line change
@@ -479,9 +479,14 @@ check_walkdomains(CuTest* tc, namedb_type* db)
479479
}
480480
for(d=db->domains->root; d; d=domain_next(d)) {
481481
/* check chnum */
482-
/* TODO CuAssertTrue(tc, d->chnum == chnum[d->number]); */
482+
CuAssertTrue(tc, d->chnum == chnum[d->number]);
483483
/* check usage */
484-
/* TODO CuAssertTrue(tc, d->usage == usage[d->number]); */
484+
if(d->usage != usage[d->number]) {
485+
printf("bad usage %s, have %d want %d\n",
486+
dname_to_string(domain_dname(d), NULL),
487+
(int)d->usage, (int)usage[d->number]);
488+
}
489+
CuAssertTrue(tc, d->usage == usage[d->number]);
485490
}
486491
free(numbers);
487492
free(chnum);
@@ -711,6 +716,10 @@ test_add_del(CuTest *tc, namedb_type* db)
711716
del_str(db, zone, &udbz, "lotso.example.org. IN TXT lotso\n");
712717
check_namedb(tc, db);
713718

719+
zone->is_ok = 0;
720+
delete_zone_rrs(db, zone);
721+
check_namedb(tc, db);
722+
714723
udb_ptr_unlink(&udbz, db->udb);
715724
}
716725

zonec.c

+1
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,7 @@ zadd_rdata_domain(domain_type *domain)
10011001
} else {
10021002
parser->current_rr.rdatas[parser->current_rr.rdata_count].domain
10031003
= domain;
1004+
domain->usage ++; /* new reference to domain */
10041005
++parser->current_rr.rdata_count;
10051006
}
10061007
}

0 commit comments

Comments
 (0)