1/*
2 * Copyright (C) 2004, 2005, 2007  Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1999-2001  Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* $Id: dbiterator.c,v 1.18 2007/06/19 23:47:16 tbox Exp $ */
19
20/*! \file */
21
22#include <config.h>
23
24#include <isc/util.h>
25
26#include <dns/dbiterator.h>
27#include <dns/name.h>
28
29void
30dns_dbiterator_destroy(dns_dbiterator_t **iteratorp) {
31	/*
32	 * Destroy '*iteratorp'.
33	 */
34
35	REQUIRE(iteratorp != NULL);
36	REQUIRE(DNS_DBITERATOR_VALID(*iteratorp));
37
38	(*iteratorp)->methods->destroy(iteratorp);
39
40	ENSURE(*iteratorp == NULL);
41}
42
43isc_result_t
44dns_dbiterator_first(dns_dbiterator_t *iterator) {
45	/*
46	 * Move the node cursor to the first node in the database (if any).
47	 */
48
49	REQUIRE(DNS_DBITERATOR_VALID(iterator));
50
51	return (iterator->methods->first(iterator));
52}
53
54isc_result_t
55dns_dbiterator_last(dns_dbiterator_t *iterator) {
56	/*
57	 * Move the node cursor to the first node in the database (if any).
58	 */
59
60	REQUIRE(DNS_DBITERATOR_VALID(iterator));
61
62	return (iterator->methods->last(iterator));
63}
64
65isc_result_t
66dns_dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {
67	/*
68	 * Move the node cursor to the node with name 'name'.
69	 */
70
71	REQUIRE(DNS_DBITERATOR_VALID(iterator));
72
73	return (iterator->methods->seek(iterator, name));
74}
75
76isc_result_t
77dns_dbiterator_prev(dns_dbiterator_t *iterator) {
78	/*
79	 * Move the node cursor to the previous node in the database (if any).
80	 */
81
82	REQUIRE(DNS_DBITERATOR_VALID(iterator));
83
84	return (iterator->methods->prev(iterator));
85}
86
87isc_result_t
88dns_dbiterator_next(dns_dbiterator_t *iterator) {
89	/*
90	 * Move the node cursor to the next node in the database (if any).
91	 */
92
93	REQUIRE(DNS_DBITERATOR_VALID(iterator));
94
95	return (iterator->methods->next(iterator));
96}
97
98isc_result_t
99dns_dbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep,
100		       dns_name_t *name)
101{
102	/*
103	 * Return the current node.
104	 */
105
106	REQUIRE(DNS_DBITERATOR_VALID(iterator));
107	REQUIRE(nodep != NULL && *nodep == NULL);
108	REQUIRE(name == NULL || dns_name_hasbuffer(name));
109
110	return (iterator->methods->current(iterator, nodep, name));
111}
112
113isc_result_t
114dns_dbiterator_pause(dns_dbiterator_t *iterator) {
115	/*
116	 * Pause iteration.
117	 */
118
119	REQUIRE(DNS_DBITERATOR_VALID(iterator));
120
121	return (iterator->methods->pause(iterator));
122}
123
124isc_result_t
125dns_dbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {
126
127	/*
128	 * Return the origin to which returned node names are relative.
129	 */
130
131	REQUIRE(DNS_DBITERATOR_VALID(iterator));
132	REQUIRE(iterator->relative_names);
133	REQUIRE(dns_name_hasbuffer(name));
134
135	return (iterator->methods->origin(iterator, name));
136}
137
138void
139dns_dbiterator_setcleanmode(dns_dbiterator_t *iterator, isc_boolean_t mode) {
140	REQUIRE(DNS_DBITERATOR_VALID(iterator));
141
142	iterator->cleaning = mode;
143}
144