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