1/*	$NetBSD: ndbmdatum.c,v 1.4 2008/09/11 12:58:00 joerg 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#if HAVE_NBTOOL_CONFIG_H
37#include "nbtool_config.h"
38#endif
39
40#include <sys/cdefs.h>
41__RCSID("$NetBSD: ndbmdatum.c,v 1.4 2008/09/11 12:58:00 joerg Exp $");
42
43/*
44 * This package provides a dbm compatible interface to the new hashing
45 * package described in db(3).
46 */
47#include "namespace.h"
48#include <sys/param.h>
49
50#include <fcntl.h>
51#include <stdio.h>
52#include <string.h>
53
54#include <ndbm.h>
55#include "hash.h"
56
57#ifndef datum_truncate
58#define datum_truncate(a) (a)
59#endif
60/*
61 * Returns:
62 *	DATUM on success
63 *	NULL on failure
64 */
65datum
66dbm_fetch(DBM *db, datum key)
67{
68	datum retdata;
69	int status;
70	DBT dbtkey, dbtretdata;
71
72	dbtkey.data = key.dptr;
73	dbtkey.size = key.dsize;
74	status = (db->get)(db, &dbtkey, &dbtretdata, 0);
75	if (status) {
76		dbtretdata.data = NULL;
77		dbtretdata.size = 0;
78	}
79	retdata.dptr = dbtretdata.data;
80	retdata.dsize = datum_truncate(dbtretdata.size);
81	return (retdata);
82}
83
84/*
85 * Returns:
86 *	DATUM on success
87 *	NULL on failure
88 */
89datum
90dbm_firstkey(DBM *db)
91{
92	int status;
93	datum retkey;
94	DBT dbtretkey, dbtretdata;
95
96	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST);
97	if (status)
98		dbtretkey.data = NULL;
99	retkey.dptr = dbtretkey.data;
100	retkey.dsize = datum_truncate(dbtretkey.size);
101	return (retkey);
102}
103
104/*
105 * Returns:
106 *	DATUM on success
107 *	NULL on failure
108 */
109datum
110dbm_nextkey(DBM *db)
111{
112	int status;
113	datum retkey;
114	DBT dbtretkey, dbtretdata;
115
116	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT);
117	if (status)
118		dbtretkey.data = NULL;
119	retkey.dptr = dbtretkey.data;
120	retkey.dsize = datum_truncate(dbtretkey.size);
121	return (retkey);
122}
123
124/*
125 * Returns:
126 *	 0 on success
127 *	<0 failure
128 */
129int
130dbm_delete(DBM *db, datum key)
131{
132	int status;
133	DBT dbtkey;
134
135	dbtkey.data = key.dptr;
136	dbtkey.size = key.dsize;
137	status = (db->del)(db, &dbtkey, 0);
138	if (status)
139		return (-1);
140	else
141		return (0);
142}
143
144/*
145 * Returns:
146 *	 0 on success
147 *	<0 failure
148 *	 1 if DBM_INSERT and entry exists
149 */
150int
151dbm_store(DBM *db, datum key, datum data, int flags)
152{
153	DBT dbtkey, dbtdata;
154
155	dbtkey.data = key.dptr;
156	dbtkey.size = key.dsize;
157	dbtdata.data = data.dptr;
158	dbtdata.size = data.dsize;
159	return ((db->put)(db, &dbtkey, &dbtdata,
160	    (u_int)((flags == DBM_INSERT) ? R_NOOVERWRITE : 0)));
161}
162