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