ndbm.c revision 1.11 1 /* $NetBSD: ndbm.c,v 1.11 1997/01/23 14:01:50 mrg Exp $ */
2
3 /*-
4 * Copyright (c) 1990, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Margo Seltzer.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39 #if defined(LIBC_SCCS) && !defined(lint)
40 #if 0
41 static char sccsid[] = "@(#)ndbm.c 8.4 (Berkeley) 7/21/94";
42 #else
43 static char rcsid[] = "$NetBSD: ndbm.c,v 1.11 1997/01/23 14:01:50 mrg Exp $";
44 #endif
45 #endif /* LIBC_SCCS and not lint */
46
47 /*
48 * This package provides a dbm compatible interface to the new hashing
49 * package described in db(3).
50 */
51
52 #include <sys/param.h>
53
54 #include <stdio.h>
55 #include <string.h>
56
57 #include <ndbm.h>
58 #include "hash.h"
59
60 /*
61 * Returns:
62 * *DBM on success
63 * NULL on failure
64 */
65 extern DBM *
66 dbm_open(file, flags, mode)
67 const char *file;
68 int flags, mode;
69 {
70 HASHINFO info;
71 char path[MAXPATHLEN];
72
73 info.bsize = 4096;
74 info.ffactor = 40;
75 info.nelem = 1;
76 info.cachesize = 0;
77 info.hash = NULL;
78 info.lorder = 0;
79 (void)strncpy(path, file, sizeof(path) - 1);
80 (void)strncat(path, DBM_SUFFIX, sizeof(path) - strlen(path) - 1);
81 return ((DBM *)__hash_open(path, flags, mode, &info, 0));
82 }
83
84 extern void
85 dbm_close(db)
86 DBM *db;
87 {
88 (void)(db->close)(db);
89 }
90
91 /*
92 * Returns:
93 * DATUM on success
94 * NULL on failure
95 */
96 extern datum
97 dbm_fetch(db, key)
98 DBM *db;
99 datum key;
100 {
101 datum retdata;
102 int status;
103 DBT dbtkey, dbtretdata;
104
105 dbtkey.data = key.dptr;
106 dbtkey.size = key.dsize;
107 status = (db->get)(db, &dbtkey, &dbtretdata, 0);
108 if (status) {
109 dbtretdata.data = NULL;
110 dbtretdata.size = 0;
111 }
112 retdata.dptr = dbtretdata.data;
113 retdata.dsize = dbtretdata.size;
114 return (retdata);
115 }
116
117 /*
118 * Returns:
119 * DATUM on success
120 * NULL on failure
121 */
122 extern datum
123 dbm_firstkey(db)
124 DBM *db;
125 {
126 int status;
127 datum retkey;
128 DBT dbtretkey, dbtretdata;
129
130 status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST);
131 if (status)
132 dbtretkey.data = NULL;
133 retkey.dptr = dbtretkey.data;
134 retkey.dsize = dbtretkey.size;
135 return (retkey);
136 }
137
138 /*
139 * Returns:
140 * DATUM on success
141 * NULL on failure
142 */
143 extern datum
144 dbm_nextkey(db)
145 DBM *db;
146 {
147 int status;
148 datum retkey;
149 DBT dbtretkey, dbtretdata;
150
151 status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT);
152 if (status)
153 dbtretkey.data = NULL;
154 retkey.dptr = dbtretkey.data;
155 retkey.dsize = dbtretkey.size;
156 return (retkey);
157 }
158
159 /*
160 * Returns:
161 * 0 on success
162 * <0 failure
163 */
164 extern int
165 dbm_delete(db, key)
166 DBM *db;
167 datum key;
168 {
169 int status;
170 DBT dbtkey;
171
172 dbtkey.data = key.dptr;
173 dbtkey.size = key.dsize;
174 status = (db->del)(db, &dbtkey, 0);
175 if (status)
176 return (-1);
177 else
178 return (0);
179 }
180
181 /*
182 * Returns:
183 * 0 on success
184 * <0 failure
185 * 1 if DBM_INSERT and entry exists
186 */
187 extern int
188 dbm_store(db, key, data, flags)
189 DBM *db;
190 datum key, data;
191 int flags;
192 {
193 DBT dbtkey, dbtdata;
194
195 dbtkey.data = key.dptr;
196 dbtkey.size = key.dsize;
197 dbtdata.data = data.dptr;
198 dbtdata.size = data.dsize;
199 return ((db->put)(db, &dbtkey, &dbtdata,
200 (flags == DBM_INSERT) ? R_NOOVERWRITE : 0));
201 }
202
203 extern int
204 dbm_error(db)
205 DBM *db;
206 {
207 HTAB *hp;
208
209 hp = (HTAB *)db->internal;
210 return (hp->err);
211 }
212
213 extern int
214 dbm_clearerr(db)
215 DBM *db;
216 {
217 HTAB *hp;
218
219 hp = (HTAB *)db->internal;
220 hp->err = 0;
221 return (0);
222 }
223
224 extern int
225 dbm_dirfno(db)
226 DBM *db;
227 {
228 return(((HTAB *)db->internal)->fp);
229 }
230