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