1 /* $NetBSD: ndbmdatum.c,v 1.1 2005/09/13 01:44:09 christos Exp $ */ 2 /* from: NetBSD: ndbm.c,v 1.18 2004/04/27 20:03:45 kleink Exp */ 3 4 /*- 5 * Copyright (c) 1990, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * Margo Seltzer. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <sys/cdefs.h> 37 #if defined(LIBC_SCCS) && !defined(lint) 38 #if 0 39 static char sccsid[] = "@(#)ndbm.c 8.4 (Berkeley) 7/21/94"; 40 #else 41 __RCSID("$NetBSD: ndbmdatum.c,v 1.1 2005/09/13 01:44:09 christos Exp $"); 42 #endif 43 #endif /* LIBC_SCCS and not lint */ 44 45 /* 46 * This package provides a dbm compatible interface to the new hashing 47 * package described in db(3). 48 */ 49 #include "namespace.h" 50 #include <sys/param.h> 51 52 #include <fcntl.h> 53 #include <stdio.h> 54 #include <string.h> 55 56 #include <ndbm.h> 57 #include "hash.h" 58 59 /* 60 * Returns: 61 * DATUM on success 62 * NULL on failure 63 */ 64 extern datum 65 dbm_fetch(db, key) 66 DBM *db; 67 datum key; 68 { 69 datum retdata; 70 int status; 71 DBT dbtkey, dbtretdata; 72 73 dbtkey.data = key.dptr; 74 dbtkey.size = key.dsize; 75 status = (db->get)(db, &dbtkey, &dbtretdata, 0); 76 if (status) { 77 dbtretdata.data = NULL; 78 dbtretdata.size = 0; 79 } 80 retdata.dptr = dbtretdata.data; 81 retdata.dsize = dbtretdata.size; 82 return (retdata); 83 } 84 85 /* 86 * Returns: 87 * DATUM on success 88 * NULL on failure 89 */ 90 extern datum 91 dbm_firstkey(db) 92 DBM *db; 93 { 94 int status; 95 datum retkey; 96 DBT dbtretkey, dbtretdata; 97 98 status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST); 99 if (status) 100 dbtretkey.data = NULL; 101 retkey.dptr = dbtretkey.data; 102 retkey.dsize = dbtretkey.size; 103 return (retkey); 104 } 105 106 /* 107 * Returns: 108 * DATUM on success 109 * NULL on failure 110 */ 111 extern datum 112 dbm_nextkey(db) 113 DBM *db; 114 { 115 int status; 116 datum retkey; 117 DBT dbtretkey, dbtretdata; 118 119 status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT); 120 if (status) 121 dbtretkey.data = NULL; 122 retkey.dptr = dbtretkey.data; 123 retkey.dsize = dbtretkey.size; 124 return (retkey); 125 } 126 127 /* 128 * Returns: 129 * 0 on success 130 * <0 failure 131 */ 132 extern int 133 dbm_delete(db, key) 134 DBM *db; 135 datum key; 136 { 137 int status; 138 DBT dbtkey; 139 140 dbtkey.data = key.dptr; 141 dbtkey.size = key.dsize; 142 status = (db->del)(db, &dbtkey, 0); 143 if (status) 144 return (-1); 145 else 146 return (0); 147 } 148 149 /* 150 * Returns: 151 * 0 on success 152 * <0 failure 153 * 1 if DBM_INSERT and entry exists 154 */ 155 extern int 156 dbm_store(db, key, data, flags) 157 DBM *db; 158 datum key, data; 159 int flags; 160 { 161 DBT dbtkey, dbtdata; 162 163 dbtkey.data = key.dptr; 164 dbtkey.size = key.dsize; 165 dbtdata.data = data.dptr; 166 dbtdata.size = data.dsize; 167 return ((db->put)(db, &dbtkey, &dbtdata, 168 (u_int)((flags == DBM_INSERT) ? R_NOOVERWRITE : 0))); 169 } 170