1135446Strhodes/*
2193149Sdougb * Copyright (C) 2004, 2005, 2007  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1999-2001  Internet Software Consortium.
4135446Strhodes *
5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18234010Sdougb/* $Id: dbiterator.c,v 1.18 2007/06/19 23:47:16 tbox Exp $ */
19135446Strhodes
20170222Sdougb/*! \file */
21170222Sdougb
22135446Strhodes#include <config.h>
23135446Strhodes
24135446Strhodes#include <isc/util.h>
25135446Strhodes
26135446Strhodes#include <dns/dbiterator.h>
27135446Strhodes#include <dns/name.h>
28135446Strhodes
29135446Strhodesvoid
30135446Strhodesdns_dbiterator_destroy(dns_dbiterator_t **iteratorp) {
31135446Strhodes	/*
32135446Strhodes	 * Destroy '*iteratorp'.
33135446Strhodes	 */
34135446Strhodes
35135446Strhodes	REQUIRE(iteratorp != NULL);
36135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(*iteratorp));
37135446Strhodes
38135446Strhodes	(*iteratorp)->methods->destroy(iteratorp);
39135446Strhodes
40135446Strhodes	ENSURE(*iteratorp == NULL);
41135446Strhodes}
42135446Strhodes
43135446Strhodesisc_result_t
44135446Strhodesdns_dbiterator_first(dns_dbiterator_t *iterator) {
45135446Strhodes	/*
46135446Strhodes	 * Move the node cursor to the first node in the database (if any).
47135446Strhodes	 */
48135446Strhodes
49135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
50135446Strhodes
51135446Strhodes	return (iterator->methods->first(iterator));
52135446Strhodes}
53135446Strhodes
54135446Strhodesisc_result_t
55135446Strhodesdns_dbiterator_last(dns_dbiterator_t *iterator) {
56135446Strhodes	/*
57135446Strhodes	 * Move the node cursor to the first node in the database (if any).
58135446Strhodes	 */
59135446Strhodes
60135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
61135446Strhodes
62135446Strhodes	return (iterator->methods->last(iterator));
63135446Strhodes}
64135446Strhodes
65135446Strhodesisc_result_t
66135446Strhodesdns_dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {
67135446Strhodes	/*
68135446Strhodes	 * Move the node cursor to the node with name 'name'.
69135446Strhodes	 */
70135446Strhodes
71135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
72135446Strhodes
73135446Strhodes	return (iterator->methods->seek(iterator, name));
74135446Strhodes}
75135446Strhodes
76135446Strhodesisc_result_t
77135446Strhodesdns_dbiterator_prev(dns_dbiterator_t *iterator) {
78135446Strhodes	/*
79135446Strhodes	 * Move the node cursor to the previous node in the database (if any).
80135446Strhodes	 */
81135446Strhodes
82135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
83135446Strhodes
84135446Strhodes	return (iterator->methods->prev(iterator));
85135446Strhodes}
86135446Strhodes
87135446Strhodesisc_result_t
88135446Strhodesdns_dbiterator_next(dns_dbiterator_t *iterator) {
89135446Strhodes	/*
90135446Strhodes	 * Move the node cursor to the next node in the database (if any).
91135446Strhodes	 */
92135446Strhodes
93135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
94135446Strhodes
95135446Strhodes	return (iterator->methods->next(iterator));
96135446Strhodes}
97135446Strhodes
98135446Strhodesisc_result_t
99135446Strhodesdns_dbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep,
100135446Strhodes		       dns_name_t *name)
101135446Strhodes{
102135446Strhodes	/*
103135446Strhodes	 * Return the current node.
104135446Strhodes	 */
105135446Strhodes
106135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
107135446Strhodes	REQUIRE(nodep != NULL && *nodep == NULL);
108135446Strhodes	REQUIRE(name == NULL || dns_name_hasbuffer(name));
109135446Strhodes
110135446Strhodes	return (iterator->methods->current(iterator, nodep, name));
111135446Strhodes}
112135446Strhodes
113135446Strhodesisc_result_t
114135446Strhodesdns_dbiterator_pause(dns_dbiterator_t *iterator) {
115135446Strhodes	/*
116135446Strhodes	 * Pause iteration.
117135446Strhodes	 */
118135446Strhodes
119135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
120135446Strhodes
121135446Strhodes	return (iterator->methods->pause(iterator));
122135446Strhodes}
123135446Strhodes
124135446Strhodesisc_result_t
125135446Strhodesdns_dbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {
126135446Strhodes
127135446Strhodes	/*
128135446Strhodes	 * Return the origin to which returned node names are relative.
129135446Strhodes	 */
130135446Strhodes
131135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
132135446Strhodes	REQUIRE(iterator->relative_names);
133135446Strhodes	REQUIRE(dns_name_hasbuffer(name));
134135446Strhodes
135135446Strhodes	return (iterator->methods->origin(iterator, name));
136135446Strhodes}
137135446Strhodes
138135446Strhodesvoid
139135446Strhodesdns_dbiterator_setcleanmode(dns_dbiterator_t *iterator, isc_boolean_t mode) {
140135446Strhodes	REQUIRE(DNS_DBITERATOR_VALID(iterator));
141135446Strhodes
142135446Strhodes	iterator->cleaning = mode;
143135446Strhodes}
144