1224090Sdougb/* 2254897Serwin * Copyright (C) 2009, 2011 Internet Systems Consortium, Inc. ("ISC") 3224090Sdougb * 4224090Sdougb * Permission to use, copy, modify, and/or distribute this software for any 5224090Sdougb * purpose with or without fee is hereby granted, provided that the above 6224090Sdougb * copyright notice and this permission notice appear in all copies. 7224090Sdougb * 8224090Sdougb * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 9224090Sdougb * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10224090Sdougb * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 11224090Sdougb * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12224090Sdougb * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 13224090Sdougb * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14224090Sdougb * PERFORMANCE OF THIS SOFTWARE. 15224090Sdougb */ 16224090Sdougb 17254897Serwin/* $Id: rriterator.h,v 1.4 2011/11/01 23:47:00 tbox Exp $ */ 18224090Sdougb 19224090Sdougb#ifndef DNS_RRITERATOR_H 20224090Sdougb#define DNS_RRITERATOR_H 1 21224090Sdougb 22224090Sdougb/***** 23224090Sdougb ***** Module Info 24224090Sdougb *****/ 25224090Sdougb 26224090Sdougb/*! \file dns/rriterator.h 27224090Sdougb * \brief 28224090Sdougb * Functions for "walking" a zone database, visiting each RR or RRset in turn. 29224090Sdougb */ 30224090Sdougb 31224090Sdougb/***** 32224090Sdougb ***** Imports 33224090Sdougb *****/ 34224090Sdougb 35224090Sdougb#include <isc/lang.h> 36224090Sdougb#include <isc/magic.h> 37224090Sdougb#include <isc/ondestroy.h> 38224090Sdougb#include <isc/stdtime.h> 39224090Sdougb 40224090Sdougb#include <dns/db.h> 41224090Sdougb#include <dns/dbiterator.h> 42224090Sdougb#include <dns/fixedname.h> 43224090Sdougb#include <dns/name.h> 44224090Sdougb#include <dns/rdata.h> 45224090Sdougb#include <dns/rdataset.h> 46224090Sdougb#include <dns/rdatasetiter.h> 47224090Sdougb#include <dns/types.h> 48224090Sdougb 49224090SdougbISC_LANG_BEGINDECLS 50224090Sdougb 51224090Sdougb/***** 52224090Sdougb ***** Types 53224090Sdougb *****/ 54224090Sdougb 55224090Sdougb/*% 56224090Sdougb * A dns_rriterator_t is an iterator that iterates over an entire database, 57224090Sdougb * returning one RR at a time, in some arbitrary order. 58224090Sdougb */ 59224090Sdougb 60224090Sdougbtypedef struct dns_rriterator { 61224090Sdougb unsigned int magic; 62224090Sdougb isc_result_t result; 63224090Sdougb dns_db_t *db; 64224090Sdougb dns_dbiterator_t *dbit; 65224090Sdougb dns_dbversion_t *ver; 66224090Sdougb isc_stdtime_t now; 67224090Sdougb dns_dbnode_t *node; 68224090Sdougb dns_fixedname_t fixedname; 69224090Sdougb dns_rdatasetiter_t *rdatasetit; 70224090Sdougb dns_rdataset_t rdataset; 71224090Sdougb dns_rdata_t rdata; 72224090Sdougb} dns_rriterator_t; 73224090Sdougb 74224090Sdougb#define RRITERATOR_MAGIC ISC_MAGIC('R', 'R', 'I', 't') 75224090Sdougb#define VALID_RRITERATOR(m) ISC_MAGIC_VALID(m, RRITERATOR_MAGIC) 76224090Sdougb 77224090Sdougbisc_result_t 78224090Sdougbdns_rriterator_init(dns_rriterator_t *it, dns_db_t *db, 79224090Sdougb dns_dbversion_t *ver, isc_stdtime_t now); 80234010Sdougb/*% 81234010Sdougb * Initialize an rriterator; sets the cursor to the origin node 82234010Sdougb * of the database. 83234010Sdougb * 84234010Sdougb * Requires: 85234010Sdougb * 86234010Sdougb * \li 'db' is a valid database. 87234010Sdougb * 88234010Sdougb * Returns: 89234010Sdougb * 90234010Sdougb * \li #ISC_R_SUCCESS 91234010Sdougb * \li #ISC_R_NOMEMORY 92234010Sdougb */ 93224090Sdougb 94224090Sdougbisc_result_t 95224090Sdougbdns_rriterator_first(dns_rriterator_t *it); 96234010Sdougb/*%< 97234010Sdougb * Move the rriterator cursor to the first rdata in the database. 98234010Sdougb * 99234010Sdougb * Requires: 100234010Sdougb *\li 'it' is a valid, initialized rriterator 101234010Sdougb * 102234010Sdougb * Returns: 103234010Sdougb *\li #ISC_R_SUCCESS 104234010Sdougb *\li #ISC_R_NOMORE There are no rdata in the set. 105234010Sdougb */ 106224090Sdougb 107224090Sdougbisc_result_t 108224090Sdougbdns_rriterator_nextrrset(dns_rriterator_t *it); 109234010Sdougb/*%< 110234010Sdougb * Move the rriterator cursor to the next rrset in the database, 111234010Sdougb * skipping over any remaining records that have the same rdatatype 112234010Sdougb * as the current one. 113234010Sdougb * 114234010Sdougb * Requires: 115234010Sdougb *\li 'it' is a valid, initialized rriterator 116234010Sdougb * 117234010Sdougb * Returns: 118234010Sdougb *\li #ISC_R_SUCCESS 119234010Sdougb *\li #ISC_R_NOMORE No more rrsets in the database 120234010Sdougb */ 121224090Sdougb 122224090Sdougbisc_result_t 123224090Sdougbdns_rriterator_next(dns_rriterator_t *it); 124234010Sdougb/*%< 125234010Sdougb * Move the rriterator cursor to the next rrset in the database, 126234010Sdougb * skipping over any remaining records that have the same rdatatype 127234010Sdougb * as the current one. 128234010Sdougb * 129234010Sdougb * Requires: 130234010Sdougb *\li 'it' is a valid, initialized rriterator 131234010Sdougb * 132234010Sdougb * Returns: 133234010Sdougb *\li #ISC_R_SUCCESS 134234010Sdougb *\li #ISC_R_NOMORE No more records in the database 135234010Sdougb */ 136224090Sdougb 137224090Sdougbvoid 138224090Sdougbdns_rriterator_current(dns_rriterator_t *it, dns_name_t **name, 139224090Sdougb isc_uint32_t *ttl, dns_rdataset_t **rdataset, 140224090Sdougb dns_rdata_t **rdata); 141234010Sdougb/*%< 142234010Sdougb * Make '*name' refer to the current name. If 'rdataset' is not NULL, 143234010Sdougb * make '*rdataset' refer to the current * rdataset. If '*rdata' is not 144234010Sdougb * NULL, make '*rdata' refer to the current record. 145234010Sdougb * 146234010Sdougb * Requires: 147234010Sdougb *\li '*name' is a valid name object 148234010Sdougb *\li 'rdataset' is NULL or '*rdataset' is NULL 149234010Sdougb *\li 'rdata' is NULL or '*rdata' is NULL 150234010Sdougb * 151234010Sdougb * Ensures: 152234010Sdougb *\li 'rdata' refers to the rdata at the rdata cursor location of 153234010Sdougb *\li 'rdataset'. 154234010Sdougb */ 155224090Sdougb 156224090Sdougbvoid 157224090Sdougbdns_rriterator_pause(dns_rriterator_t *it); 158234010Sdougb/*%< 159234010Sdougb * Pause rriterator. Frees any locks held by the database iterator. 160234010Sdougb * Callers should use this routine any time they are not going to 161234010Sdougb * execute another rriterator method in the immediate future. 162234010Sdougb * 163234010Sdougb * Requires: 164234010Sdougb *\li 'it' is a valid iterator. 165234010Sdougb * 166234010Sdougb * Ensures: 167234010Sdougb *\li Any database locks being held for efficiency of iterator access are 168234010Sdougb * released. 169234010Sdougb */ 170224090Sdougb 171224090Sdougbvoid 172224090Sdougbdns_rriterator_destroy(dns_rriterator_t *it); 173234010Sdougb/*%< 174234010Sdougb * Shut down and free resources in rriterator 'it'. 175234010Sdougb * 176234010Sdougb * Requires: 177234010Sdougb * 178234010Sdougb *\li 'it' is a valid iterator. 179234010Sdougb * 180234010Sdougb * Ensures: 181234010Sdougb * 182234010Sdougb *\li All resources used by the rriterator are freed. 183234010Sdougb */ 184224090Sdougb 185224090SdougbISC_LANG_ENDDECLS 186224090Sdougb 187224090Sdougb#endif /* DNS_RRITERATOR_H */ 188