]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
6 | * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights | |
7 | * Reserved. This file contains Original Code and/or Modifications of | |
8 | * Original Code as defined in and that are subject to the Apple Public | |
9 | * Source License Version 1.0 (the 'License'). You may not use this file | |
10 | * except in compliance with the License. Please obtain a copy of the | |
11 | * License at http://www.apple.com/publicsource and read it before using | |
12 | * this file. | |
13 | * | |
14 | * The Original Code and all software distributed under the License are | |
15 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
16 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
17 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
18 | * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the | |
19 | * License for the specific language governing rights and limitations | |
20 | * under the License." | |
21 | * | |
22 | * @APPLE_LICENSE_HEADER_END@ | |
23 | */ | |
24 | /* $OpenBSD: ypdb.c,v 1.5 1997/02/09 09:49:36 maja Exp $ */ | |
25 | ||
26 | /* | |
27 | * Copyright (c) 1990, 1993 | |
28 | * The Regents of the University of California. All rights reserved. | |
29 | * All rights reserved. | |
30 | * | |
31 | * This code is derived from software contributed to Berkeley by | |
32 | * Margo Seltzer. | |
33 | * | |
34 | * This code is derived from ndbm module of BSD4.4 db (hash) by | |
35 | * Mats O Jansson | |
36 | * | |
37 | * Redistribution and use in source and binary forms, with or without | |
38 | * modification, are permitted provided that the following conditions | |
39 | * are met: | |
40 | * 1. Redistributions of source code must retain the above copyright | |
41 | * notice, this list of conditions and the following disclaimer. | |
42 | * 2. Redistributions in binary form must reproduce the above copyright | |
43 | * notice, this list of conditions and the following disclaimer in the | |
44 | * documentation and/or other materials provided with the distribution. | |
45 | * 3. All advertising materials mentioning features or use of this software | |
46 | * must display the following acknowledgement: | |
47 | * This product includes software developed by the University of | |
48 | * California, Berkeley and its contributors. | |
49 | * 4. Neither the name of the University nor the names of its contributors | |
50 | * may be used to endorse or promote products derived from this software | |
51 | * without specific prior written permission. | |
52 | * | |
53 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS | |
54 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
55 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
56 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | |
57 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
58 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
59 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
60 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
61 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
62 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
63 | * SUCH DAMAGE. | |
64 | */ | |
65 | ||
66 | #include <sys/param.h> | |
67 | #include <sys/types.h> | |
68 | #include <stdio.h> | |
69 | #include <string.h> | |
70 | ||
71 | #include "ypdb.h" | |
72 | ||
73 | #ifdef YPDB_PATCH | |
74 | extern DBM *__hash_open(); | |
75 | #else | |
76 | extern DBM *__bt_open(); | |
77 | #endif | |
78 | ||
79 | /* | |
80 | * Returns: | |
81 | * *DBM on success | |
82 | * NULL on failure | |
83 | */ | |
84 | ||
85 | extern DBM * | |
86 | ypdb_open(file, flags, mode) | |
87 | const char *file; | |
88 | int flags, mode; | |
89 | { | |
90 | #ifdef YPDB_PATCH | |
91 | HASHINFO info; | |
92 | char path[MAXPATHLEN]; | |
93 | ||
94 | info.bsize = 4096; | |
95 | info.ffactor = 40; | |
96 | info.nelem = 1; | |
97 | info.cachesize = NULL; | |
98 | info.hash = NULL; | |
99 | info.lorder = 0; | |
100 | snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX); | |
101 | return ((DBM *)__hash_open(path, flags, mode, &info, 0)); | |
102 | #else | |
103 | BTREEINFO info; | |
104 | char path[MAXPATHLEN]; | |
105 | DBM *db; | |
106 | ||
107 | info.flags = 0; | |
108 | info.cachesize = 0; | |
109 | info.maxkeypage = 0; | |
110 | info.minkeypage = 0; | |
111 | info.psize = 0; | |
112 | info.compare = NULL; | |
113 | info.prefix = NULL; | |
114 | info.lorder = 0; | |
115 | snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX); | |
116 | db = (DBM *)__bt_open(path, flags, mode, &info, 0); | |
117 | return (db); | |
118 | #endif | |
119 | } | |
120 | ||
121 | /* | |
122 | * Returns: | |
123 | * *DBM on success | |
124 | * NULL on failure | |
125 | */ | |
126 | ||
127 | extern DBM * | |
128 | ypdb_open_suf(file, flags, mode) | |
129 | const char *file; | |
130 | int flags, mode; | |
131 | { | |
132 | #ifdef YPDB_PATCH | |
133 | HASHINFO info; | |
134 | ||
135 | info.bsize = 4096; | |
136 | info.ffactor = 40; | |
137 | info.nelem = 1; | |
138 | info.cachesize = NULL; | |
139 | info.hash = NULL; | |
140 | info.lorder = 0; | |
141 | return ((DBM *)__hash_open(file, flags, mode, &info, 0)); | |
142 | #else | |
143 | BTREEINFO info; | |
144 | DBM *db; | |
145 | ||
146 | info.flags = 0; | |
147 | info.cachesize = 0; | |
148 | info.maxkeypage = 0; | |
149 | info.minkeypage = 0; | |
150 | info.psize = 0; | |
151 | info.compare = NULL; | |
152 | info.prefix = NULL; | |
153 | info.lorder = 0; | |
154 | db = (DBM *)__bt_open(file, flags, mode, &info, 0); | |
155 | return (db); | |
156 | #endif | |
157 | } | |
158 | ||
159 | extern void | |
160 | ypdb_close(db) | |
161 | DBM *db; | |
162 | { | |
163 | (void)(db->close)(db); | |
164 | } | |
165 | ||
166 | /* | |
167 | * Returns: | |
168 | * DATUM on success | |
169 | * NULL on failure | |
170 | */ | |
171 | ||
172 | extern datum | |
173 | ypdb_fetch(db, key) | |
174 | DBM *db; | |
175 | datum key; | |
176 | { | |
177 | datum retval; | |
178 | int status; | |
179 | ||
180 | status = (db->get)(db, (DBT *)&key, (DBT *)&retval, 0); | |
181 | if (status) { | |
182 | retval.dptr = NULL; | |
183 | retval.dsize = 0; | |
184 | } | |
185 | return (retval); | |
186 | } | |
187 | ||
188 | /* | |
189 | * Returns: | |
190 | * DATUM on success | |
191 | * NULL on failure | |
192 | */ | |
193 | ||
194 | extern datum | |
195 | ypdb_firstkey(db) | |
196 | DBM *db; | |
197 | { | |
198 | int status; | |
199 | datum retdata, retkey; | |
200 | ||
201 | status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST); | |
202 | if (status) | |
203 | retkey.dptr = NULL; | |
204 | return (retkey); | |
205 | } | |
206 | ||
207 | /* | |
208 | * Returns: | |
209 | * DATUM on success | |
210 | * NULL on failure | |
211 | */ | |
212 | ||
213 | extern datum | |
214 | ypdb_nextkey(db) | |
215 | DBM *db; | |
216 | { | |
217 | int status; | |
218 | datum retdata, retkey; | |
219 | ||
220 | status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT); | |
221 | if (status) | |
222 | retkey.dptr = NULL; | |
223 | return (retkey); | |
224 | } | |
225 | ||
226 | /* | |
227 | * Returns: | |
228 | * DATUM on success | |
229 | * NULL on failure | |
230 | */ | |
231 | ||
232 | extern datum | |
233 | ypdb_setkey(db, key) | |
234 | DBM *db; | |
235 | datum key; | |
236 | { | |
237 | int status; | |
238 | datum retdata; | |
239 | #ifdef YPDB_PATCH | |
240 | datum retkey; | |
241 | ||
242 | status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST); | |
243 | if (status) | |
244 | retkey.dptr = NULL; | |
245 | while ((retkey.dptr != NULL) && | |
246 | ((retkey.dsize != key.dsize) || | |
247 | (strncmp(key.dptr,retkey.dptr,retkey.dsize) != 0))) { | |
248 | status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT); | |
249 | if (status) | |
250 | retkey.dptr = NULL; | |
251 | }; | |
252 | return (retkey); | |
253 | #else | |
254 | status = (db->seq)(db, (DBT *)&key, (DBT *)&retdata, R_CURSOR); | |
255 | if (status) | |
256 | key.dptr = NULL; | |
257 | return (key); | |
258 | #endif | |
259 | } | |
260 | ||
261 | /* | |
262 | * Returns: | |
263 | * 0 on success | |
264 | * <0 failure | |
265 | */ | |
266 | ||
267 | int | |
268 | ypdb_delete(db, key) | |
269 | DBM *db; | |
270 | datum key; | |
271 | { | |
272 | int status; | |
273 | ||
274 | status = (db->del)(db, (DBT *)&key, 0); | |
275 | if (status) | |
276 | return (-1); | |
277 | else | |
278 | return (0); | |
279 | } | |
280 | ||
281 | /* | |
282 | * Returns: | |
283 | * 0 on success | |
284 | * <0 failure | |
285 | * 1 if YPDB_INSERT and entry exists | |
286 | */ | |
287 | ||
288 | int | |
289 | ypdb_store(db, key, content, flags) | |
290 | DBM *db; | |
291 | datum key, content; | |
292 | int flags; | |
293 | { | |
294 | return ((db->put)(db, (DBT *)&key, (DBT *)&content, | |
295 | (flags == YPDB_INSERT) ? R_NOOVERWRITE : 0)); | |
296 | } | |
297 |