xref: /minix3/lib/libc/db/hash/ndbmdatum.c (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*f14fb602SLionel Sambuc /*	$NetBSD: ndbmdatum.c,v 1.5 2012/03/13 21:13:33 christos Exp $	*/
22639ae9bSBen Gras /*	from: NetBSD: ndbm.c,v 1.18 2004/04/27 20:03:45 kleink Exp 	*/
32639ae9bSBen Gras 
42639ae9bSBen Gras /*-
52639ae9bSBen Gras  * Copyright (c) 1990, 1993
62639ae9bSBen Gras  *	The Regents of the University of California.  All rights reserved.
72639ae9bSBen Gras  *
82639ae9bSBen Gras  * This code is derived from software contributed to Berkeley by
92639ae9bSBen Gras  * Margo Seltzer.
102639ae9bSBen Gras  *
112639ae9bSBen Gras  * Redistribution and use in source and binary forms, with or without
122639ae9bSBen Gras  * modification, are permitted provided that the following conditions
132639ae9bSBen Gras  * are met:
142639ae9bSBen Gras  * 1. Redistributions of source code must retain the above copyright
152639ae9bSBen Gras  *    notice, this list of conditions and the following disclaimer.
162639ae9bSBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
172639ae9bSBen Gras  *    notice, this list of conditions and the following disclaimer in the
182639ae9bSBen Gras  *    documentation and/or other materials provided with the distribution.
192639ae9bSBen Gras  * 3. Neither the name of the University nor the names of its contributors
202639ae9bSBen Gras  *    may be used to endorse or promote products derived from this software
212639ae9bSBen Gras  *    without specific prior written permission.
222639ae9bSBen Gras  *
232639ae9bSBen Gras  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
242639ae9bSBen Gras  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
252639ae9bSBen Gras  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
262639ae9bSBen Gras  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
272639ae9bSBen Gras  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
282639ae9bSBen Gras  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
292639ae9bSBen Gras  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
302639ae9bSBen Gras  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
312639ae9bSBen Gras  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
322639ae9bSBen Gras  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
332639ae9bSBen Gras  * SUCH DAMAGE.
342639ae9bSBen Gras  */
352639ae9bSBen Gras 
362639ae9bSBen Gras #if HAVE_NBTOOL_CONFIG_H
372639ae9bSBen Gras #include "nbtool_config.h"
382639ae9bSBen Gras #endif
392639ae9bSBen Gras 
402639ae9bSBen Gras #include <sys/cdefs.h>
41*f14fb602SLionel Sambuc __RCSID("$NetBSD: ndbmdatum.c,v 1.5 2012/03/13 21:13:33 christos Exp $");
422639ae9bSBen Gras 
432639ae9bSBen Gras /*
442639ae9bSBen Gras  * This package provides a dbm compatible interface to the new hashing
452639ae9bSBen Gras  * package described in db(3).
462639ae9bSBen Gras  */
472639ae9bSBen Gras #include "namespace.h"
482639ae9bSBen Gras #include <sys/param.h>
492639ae9bSBen Gras 
502639ae9bSBen Gras #include <fcntl.h>
512639ae9bSBen Gras #include <stdio.h>
522639ae9bSBen Gras #include <string.h>
532639ae9bSBen Gras 
542639ae9bSBen Gras #include <ndbm.h>
552639ae9bSBen Gras #include "hash.h"
562639ae9bSBen Gras 
57*f14fb602SLionel Sambuc #ifndef datum_truncate
58*f14fb602SLionel Sambuc #define datum_truncate(a) (a)
59*f14fb602SLionel Sambuc #endif
602639ae9bSBen Gras /*
612639ae9bSBen Gras  * Returns:
622639ae9bSBen Gras  *	DATUM on success
632639ae9bSBen Gras  *	NULL on failure
642639ae9bSBen Gras  */
652639ae9bSBen Gras datum
dbm_fetch(DBM * db,datum key)662639ae9bSBen Gras dbm_fetch(DBM *db, datum key)
672639ae9bSBen Gras {
682639ae9bSBen Gras 	datum retdata;
692639ae9bSBen Gras 	int status;
702639ae9bSBen Gras 	DBT dbtkey, dbtretdata;
712639ae9bSBen Gras 
722639ae9bSBen Gras 	dbtkey.data = key.dptr;
732639ae9bSBen Gras 	dbtkey.size = key.dsize;
742639ae9bSBen Gras 	status = (db->get)(db, &dbtkey, &dbtretdata, 0);
752639ae9bSBen Gras 	if (status) {
762639ae9bSBen Gras 		dbtretdata.data = NULL;
772639ae9bSBen Gras 		dbtretdata.size = 0;
782639ae9bSBen Gras 	}
792639ae9bSBen Gras 	retdata.dptr = dbtretdata.data;
80*f14fb602SLionel Sambuc 	retdata.dsize = datum_truncate(dbtretdata.size);
812639ae9bSBen Gras 	return (retdata);
822639ae9bSBen Gras }
832639ae9bSBen Gras 
842639ae9bSBen Gras /*
852639ae9bSBen Gras  * Returns:
862639ae9bSBen Gras  *	DATUM on success
872639ae9bSBen Gras  *	NULL on failure
882639ae9bSBen Gras  */
892639ae9bSBen Gras datum
dbm_firstkey(DBM * db)902639ae9bSBen Gras dbm_firstkey(DBM *db)
912639ae9bSBen Gras {
922639ae9bSBen Gras 	int status;
932639ae9bSBen Gras 	datum retkey;
942639ae9bSBen Gras 	DBT dbtretkey, dbtretdata;
952639ae9bSBen Gras 
962639ae9bSBen Gras 	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST);
972639ae9bSBen Gras 	if (status)
982639ae9bSBen Gras 		dbtretkey.data = NULL;
992639ae9bSBen Gras 	retkey.dptr = dbtretkey.data;
100*f14fb602SLionel Sambuc 	retkey.dsize = datum_truncate(dbtretkey.size);
1012639ae9bSBen Gras 	return (retkey);
1022639ae9bSBen Gras }
1032639ae9bSBen Gras 
1042639ae9bSBen Gras /*
1052639ae9bSBen Gras  * Returns:
1062639ae9bSBen Gras  *	DATUM on success
1072639ae9bSBen Gras  *	NULL on failure
1082639ae9bSBen Gras  */
1092639ae9bSBen Gras datum
dbm_nextkey(DBM * db)1102639ae9bSBen Gras dbm_nextkey(DBM *db)
1112639ae9bSBen Gras {
1122639ae9bSBen Gras 	int status;
1132639ae9bSBen Gras 	datum retkey;
1142639ae9bSBen Gras 	DBT dbtretkey, dbtretdata;
1152639ae9bSBen Gras 
1162639ae9bSBen Gras 	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT);
1172639ae9bSBen Gras 	if (status)
1182639ae9bSBen Gras 		dbtretkey.data = NULL;
1192639ae9bSBen Gras 	retkey.dptr = dbtretkey.data;
120*f14fb602SLionel Sambuc 	retkey.dsize = datum_truncate(dbtretkey.size);
1212639ae9bSBen Gras 	return (retkey);
1222639ae9bSBen Gras }
1232639ae9bSBen Gras 
1242639ae9bSBen Gras /*
1252639ae9bSBen Gras  * Returns:
1262639ae9bSBen Gras  *	 0 on success
1272639ae9bSBen Gras  *	<0 failure
1282639ae9bSBen Gras  */
1292639ae9bSBen Gras int
dbm_delete(DBM * db,datum key)1302639ae9bSBen Gras dbm_delete(DBM *db, datum key)
1312639ae9bSBen Gras {
1322639ae9bSBen Gras 	int status;
1332639ae9bSBen Gras 	DBT dbtkey;
1342639ae9bSBen Gras 
1352639ae9bSBen Gras 	dbtkey.data = key.dptr;
1362639ae9bSBen Gras 	dbtkey.size = key.dsize;
1372639ae9bSBen Gras 	status = (db->del)(db, &dbtkey, 0);
1382639ae9bSBen Gras 	if (status)
1392639ae9bSBen Gras 		return (-1);
1402639ae9bSBen Gras 	else
1412639ae9bSBen Gras 		return (0);
1422639ae9bSBen Gras }
1432639ae9bSBen Gras 
1442639ae9bSBen Gras /*
1452639ae9bSBen Gras  * Returns:
1462639ae9bSBen Gras  *	 0 on success
1472639ae9bSBen Gras  *	<0 failure
1482639ae9bSBen Gras  *	 1 if DBM_INSERT and entry exists
1492639ae9bSBen Gras  */
1502639ae9bSBen Gras int
dbm_store(DBM * db,datum key,datum data,int flags)1512639ae9bSBen Gras dbm_store(DBM *db, datum key, datum data, int flags)
1522639ae9bSBen Gras {
1532639ae9bSBen Gras 	DBT dbtkey, dbtdata;
1542639ae9bSBen Gras 
1552639ae9bSBen Gras 	dbtkey.data = key.dptr;
1562639ae9bSBen Gras 	dbtkey.size = key.dsize;
1572639ae9bSBen Gras 	dbtdata.data = data.dptr;
1582639ae9bSBen Gras 	dbtdata.size = data.dsize;
1592639ae9bSBen Gras 	return ((db->put)(db, &dbtkey, &dbtdata,
1602639ae9bSBen Gras 	    (u_int)((flags == DBM_INSERT) ? R_NOOVERWRITE : 0)));
1612639ae9bSBen Gras }
162