1 /*
2  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
7  *
8  * See the COPYRIGHT file distributed with this work for additional
9  * information regarding copyright ownership.
10  */
11 
12 /*! \file */
13 
14 #include <stdbool.h>
15 
16 #include <isc/util.h>
17 
18 #include <dns/dbiterator.h>
19 #include <dns/name.h>
20 
21 void
dns_dbiterator_destroy(dns_dbiterator_t ** iteratorp)22 dns_dbiterator_destroy(dns_dbiterator_t **iteratorp) {
23 	/*
24 	 * Destroy '*iteratorp'.
25 	 */
26 
27 	REQUIRE(iteratorp != NULL);
28 	REQUIRE(DNS_DBITERATOR_VALID(*iteratorp));
29 
30 	(*iteratorp)->methods->destroy(iteratorp);
31 
32 	ENSURE(*iteratorp == NULL);
33 }
34 
35 isc_result_t
dns_dbiterator_first(dns_dbiterator_t * iterator)36 dns_dbiterator_first(dns_dbiterator_t *iterator) {
37 	/*
38 	 * Move the node cursor to the first node in the database (if any).
39 	 */
40 
41 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
42 
43 	return (iterator->methods->first(iterator));
44 }
45 
46 isc_result_t
dns_dbiterator_last(dns_dbiterator_t * iterator)47 dns_dbiterator_last(dns_dbiterator_t *iterator) {
48 	/*
49 	 * Move the node cursor to the first node in the database (if any).
50 	 */
51 
52 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
53 
54 	return (iterator->methods->last(iterator));
55 }
56 
57 isc_result_t
dns_dbiterator_seek(dns_dbiterator_t * iterator,const dns_name_t * name)58 dns_dbiterator_seek(dns_dbiterator_t *iterator, const dns_name_t *name) {
59 	/*
60 	 * Move the node cursor to the node with name 'name'.
61 	 */
62 
63 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
64 
65 	return (iterator->methods->seek(iterator, name));
66 }
67 
68 isc_result_t
dns_dbiterator_prev(dns_dbiterator_t * iterator)69 dns_dbiterator_prev(dns_dbiterator_t *iterator) {
70 	/*
71 	 * Move the node cursor to the previous node in the database (if any).
72 	 */
73 
74 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
75 
76 	return (iterator->methods->prev(iterator));
77 }
78 
79 isc_result_t
dns_dbiterator_next(dns_dbiterator_t * iterator)80 dns_dbiterator_next(dns_dbiterator_t *iterator) {
81 	/*
82 	 * Move the node cursor to the next node in the database (if any).
83 	 */
84 
85 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
86 
87 	return (iterator->methods->next(iterator));
88 }
89 
90 isc_result_t
dns_dbiterator_current(dns_dbiterator_t * iterator,dns_dbnode_t ** nodep,dns_name_t * name)91 dns_dbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep,
92 		       dns_name_t *name) {
93 	/*
94 	 * Return the current node.
95 	 */
96 
97 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
98 	REQUIRE(nodep != NULL && *nodep == NULL);
99 	REQUIRE(name == NULL || dns_name_hasbuffer(name));
100 
101 	return (iterator->methods->current(iterator, nodep, name));
102 }
103 
104 isc_result_t
dns_dbiterator_pause(dns_dbiterator_t * iterator)105 dns_dbiterator_pause(dns_dbiterator_t *iterator) {
106 	/*
107 	 * Pause iteration.
108 	 */
109 
110 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
111 
112 	return (iterator->methods->pause(iterator));
113 }
114 
115 isc_result_t
dns_dbiterator_origin(dns_dbiterator_t * iterator,dns_name_t * name)116 dns_dbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {
117 	/*
118 	 * Return the origin to which returned node names are relative.
119 	 */
120 
121 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
122 	REQUIRE(iterator->relative_names);
123 	REQUIRE(dns_name_hasbuffer(name));
124 
125 	return (iterator->methods->origin(iterator, name));
126 }
127 
128 void
dns_dbiterator_setcleanmode(dns_dbiterator_t * iterator,bool mode)129 dns_dbiterator_setcleanmode(dns_dbiterator_t *iterator, bool mode) {
130 	REQUIRE(DNS_DBITERATOR_VALID(iterator));
131 
132 	iterator->cleaning = mode;
133 }
134