585. [func] dns_db_addrdataset() and and dns_rdataslab_merge()

now support 'exact' additions in a similar manner to
                        dns_db_subtractrdataset() and dns_rdataslab_subtract().
This commit is contained in:
Mark Andrews 2000-11-30 13:19:09 +00:00
parent 1addbb8471
commit 012c6d0b91
5 changed files with 22 additions and 11 deletions

View file

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: db.c,v 1.63 2000/11/17 01:06:37 bwelling Exp $ */
/* $Id: db.c,v 1.64 2000/11/30 13:19:04 marka Exp $ */
/***
*** Imports
@ -615,6 +615,8 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
REQUIRE(((db->attributes & DNS_DBATTR_CACHE) == 0 && version != NULL)||
((db->attributes & DNS_DBATTR_CACHE) != 0 &&
version == NULL && (options & DNS_DBADD_MERGE) == 0));
REQUIRE((options & DNS_DBADD_EXACT) == 0 ||
(options & DNS_DBADD_MERGE) != 0);
REQUIRE(DNS_RDATASET_VALID(rdataset));
REQUIRE(dns_rdataset_isassociated(rdataset));
REQUIRE(rdataset->rdclass == db->rdclass);

View file

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: db.h,v 1.60 2000/11/16 22:33:50 bwelling Exp $ */
/* $Id: db.h,v 1.61 2000/11/30 13:19:08 marka Exp $ */
#ifndef DNS_DB_H
#define DNS_DB_H 1
@ -192,6 +192,7 @@ struct dns_db {
*/
#define DNS_DBADD_MERGE 0x01
#define DNS_DBADD_FORCE 0x02
#define DNS_DBADD_EXACT 0x04
/*****
***** Methods
@ -1014,6 +1015,8 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
* without regard to trust levels. If not forcing the data, then the
* rdataset will only be added if its trust level is >= the trust level of
* any existing rdataset. Forcing is only meaningful for cache databases.
* If DNS_DBADD_EXACT is set then there must be no rdata in common between
* the old and new rdata sets.
*
* The 'now' field is ignored if 'db' is a zone database. If 'db' is
* a cache database, then the added rdataset will expire no later than

View file

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: rdataslab.h,v 1.16 2000/10/18 23:53:30 marka Exp $ */
/* $Id: rdataslab.h,v 1.17 2000/11/30 13:19:09 marka Exp $ */
#ifndef DNS_RDATASLAB_H
#define DNS_RDATASLAB_H 1
@ -55,6 +55,9 @@
ISC_LANG_BEGINDECLS
#define DNS_RDATASLAB_FORCE 0x1
#define DNS_RDATASLAB_EXACT 0x2
/***
*** Functions
***/
@ -96,11 +99,12 @@ isc_result_t
dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
unsigned int reservelen, isc_mem_t *mctx,
dns_rdataclass_t rdclass, dns_rdatatype_t type,
isc_boolean_t force, unsigned char **tslabp);
unsigned int flags, unsigned char **tslabp);
/*
* Merge 'oslab' and 'nslab'.
*
* XXX
* DNS_RDATASLAB_FORCE and DNS_RDATASLAB_EXACT are mutually exclusive.
*/
isc_result_t

View file

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: journal.c,v 1.63 2000/11/14 23:29:50 bwelling Exp $ */
/* $Id: journal.c,v 1.64 2000/11/30 13:19:05 marka Exp $ */
#include <config.h>
@ -397,7 +397,8 @@ dns_diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver)
if (op == DNS_DIFFOP_ADD) {
result = dns_db_addrdataset(db, node, ver,
0, &rds,
DNS_DBADD_MERGE,
DNS_DBADD_MERGE|
DNS_DBADD_EXACT,
NULL);
} else if (op == DNS_DIFFOP_DEL) {
result = dns_db_subtractrdataset(db, node, ver,

View file

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: rbtdb.c,v 1.134 2000/11/22 01:56:02 halley Exp $ */
/* $Id: rbtdb.c,v 1.135 2000/11/30 13:19:06 marka Exp $ */
/*
* Principal Author: Bob Halley
@ -3108,7 +3108,6 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
rdatasetheader_t *topheader, *topheader_prev, *header;
unsigned char *merged;
isc_result_t result;
isc_boolean_t force = ISC_FALSE;
isc_boolean_t header_nx;
isc_boolean_t newheader_nx;
isc_boolean_t merge;
@ -3274,10 +3273,13 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
* that is the union of 'newheader' and 'header'.
*/
if (merge) {
unsigned int flags = 0;
INSIST(rbtversion->serial >= header->serial);
merged = NULL;
if ((options & DNS_DBADD_EXACT) != 0)
flags |= DNS_RDATASLAB_EXACT;
if (newheader->ttl != header->ttl)
force = ISC_TRUE;
flags |= DNS_RDATASLAB_FORCE;
result = dns_rdataslab_merge(
(unsigned char *)header,
(unsigned char *)newheader,
@ -3285,8 +3287,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
rbtdb->common.mctx,
rbtdb->common.rdclass,
(dns_rdatatype_t)header->type,
force,
&merged);
flags, &merged);
if (result == ISC_R_SUCCESS) {
/*
* If 'header' has the same serial number as