mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-04 20:22:03 -04:00
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:
parent
1addbb8471
commit
012c6d0b91
5 changed files with 22 additions and 11 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue