From a6513c44d5576f94485630d5a0273c49f5c6c66e Mon Sep 17 00:00:00 2001 From: Petr Spacek Date: May 21 2015 12:06:38 +0000 Subject: Add function for node deletion from generic meta-database. https://fedorahosted.org/bind-dyndb-ldap/ticket/151 --- diff --git a/src/metadb.c b/src/metadb.c index b9caf24..e36f281 100644 --- a/src/metadb.c +++ b/src/metadb.c @@ -9,6 +9,7 @@ #include #include +#include #include "metadb.h" #include "util.h" @@ -147,6 +148,45 @@ metadb_node_close(metadb_node_t **nodep) { } /** + * Delete all RRsets in given metaDB node. + */ +isc_result_t +metadb_node_delete(metadb_node_t **nodep) { + isc_result_t result; + metadb_node_t *node; + dns_rdatasetiter_t *iter = NULL; + dns_rdataset_t rdataset; + + REQUIRE(nodep != NULL && *nodep != NULL); + node = *nodep; + + dns_rdataset_init(&rdataset); + CHECK(dns_db_allrdatasets(node->rbtdb, node->dbnode, node->version, 0, + &iter)); + + for (result = dns_rdatasetiter_first(iter); + result == ISC_R_SUCCESS; + result = dns_rdatasetiter_next(iter)) { + + dns_rdatasetiter_current(iter, &rdataset); + CHECK(dns_db_deleterdataset(node->rbtdb, node->dbnode, + node->version, rdataset.type, 0)); + dns_rdataset_disassociate(&rdataset); + } + if (result == ISC_R_NOMORE) + result = ISC_R_SUCCESS; + +cleanup: + if (dns_rdataset_isassociated(&rdataset)) + dns_rdataset_disassociate(&rdataset); + if (iter != NULL) + dns_rdatasetiter_destroy(&iter); + if (result == ISC_R_SUCCESS) + metadb_node_close(nodep); + return result; +} + +/** * Create new "metaDB node" structure and attach underlying RBT DB node to it. * * @param[in] version Underlying RBTDB version to use. diff --git a/src/metadb.h b/src/metadb.h index f1869d8..681535d 100644 --- a/src/metadb.h +++ b/src/metadb.h @@ -53,4 +53,7 @@ metadb_rdataset_get(metadb_node_t *node, dns_rdatatype_t rrtype, void ATTR_NONNULLS metadb_node_close(metadb_node_t **nodep); +isc_result_t ATTR_NONNULLS +metadb_node_delete(metadb_node_t **nodep); + #endif /* SRC_METADB_H_ */