1 /* $NetBSD: ndbmdatum.c,v 1.2 2007/02/03 23:46: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.2 2007/02/03 23:46: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 datum 65 dbm_fetch(DBM *db, datum key) 66 { 67 datum retdata; 68 int status; 69 DBT dbtkey, dbtretdata; 70 71 dbtkey.data = key.dptr; 72 dbtkey.size = key.dsize; 73 status = (db->get)(db, &dbtkey, &dbtretdata, 0); 74 if (status) { 75 dbtretdata.data = NULL; 76 dbtretdata.size = 0; 77 } 78 retdata.dptr = dbtretdata.data; 79 retdata.dsize = dbtretdata.size; 80 return (retdata); 81 } 82 83 /* 84 * Returns: 85 * DATUM on success 86 * NULL on failure 87 */ 88 datum 89 dbm_firstkey(DBM *db) 90 { 91 int status; 92 datum retkey; 93 DBT dbtretkey, dbtretdata; 94 95 status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST); 96 if (status) 97 dbtretkey.data = NULL; 98 retkey.dptr = dbtretkey.data; 99 retkey.dsize = dbtretkey.size; 100 return (retkey); 101 } 102 103 /* 104 * Returns: 105 * DATUM on success 106 * NULL on failure 107 */ 108 datum 109 dbm_nextkey(DBM *db) 110 { 111 int status; 112 datum retkey; 113 DBT dbtretkey, dbtretdata; 114 115 status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT); 116 if (status) 117 dbtretkey.data = NULL; 118 retkey.dptr = dbtretkey.data; 119 retkey.dsize = dbtretkey.size; 120 return (retkey); 121 } 122 123 /* 124 * Returns: 125 * 0 on success 126 * <0 failure 127 */ 128 int 129 dbm_delete(DBM *db, datum key) 130 { 131 int status; 132 DBT dbtkey; 133 134 dbtkey.data = key.dptr; 135 dbtkey.size = key.dsize; 136 status = (db->del)(db, &dbtkey, 0); 137 if (status) 138 return (-1); 139 else 140 return (0); 141 } 142 143 /* 144 * Returns: 145 * 0 on success 146 * <0 failure 147 * 1 if DBM_INSERT and entry exists 148 */ 149 int 150 dbm_store(DBM *db, datum key, datum data, int flags) 151 { 152 DBT dbtkey, dbtdata; 153 154 dbtkey.data = key.dptr; 155 dbtkey.size = key.dsize; 156 dbtdata.data = data.dptr; 157 dbtdata.size = data.dsize; 158 return ((db->put)(db, &dbtkey, &dbtdata, 159 (u_int)((flags == DBM_INSERT) ? R_NOOVERWRITE : 0))); 160 } 161