smdb.h revision 261363
1/*
2 * Copyright (c) 1999-2002 Proofpoint, Inc. and its suppliers.
3 *	All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 *	$Id: smdb.h,v 8.42 2013/11/22 20:51:28 ca Exp $
10 *
11 */
12
13#ifndef _SMDB_H_
14# define _SMDB_H_
15
16# include <sys/types.h>
17# include <sys/stat.h>
18# include <sm/gen.h>
19# include <sm/errstring.h>
20
21# ifdef NDBM
22#  include <ndbm.h>
23# endif /* NDBM */
24
25# ifdef NEWDB
26#  include "sm/bdb.h"
27# endif /* NEWDB */
28
29/*
30**  Some size constants
31*/
32
33#define SMDB_MAX_USER_NAME_LEN	1024
34
35/*
36**  This file defines the abstraction for database lookups. It is pretty
37**  much a copy of the db2 interface with the exception that every function
38**  returns 0 on success and non-zero on failure. The non-zero return code
39**  is meaningful.
40**
41**  I'm going to put the function comments in this file since the interface
42**  MUST be the same for all inheritors of this interface.
43*/
44
45typedef struct database_struct SMDB_DATABASE;
46typedef struct cursor_struct SMDB_CURSOR;
47typedef struct entry_struct SMDB_DBENT;
48
49/*
50**  DB_CLOSE_FUNC -- close the database
51**
52**	Parameters:
53**		db -- The database to close.
54**
55**	Returns:
56**		0 - Success, otherwise errno.
57**
58*/
59
60typedef int (*db_close_func) __P((SMDB_DATABASE *db));
61
62/*
63**  DB_DEL_FUNC -- removes a key and data pair from the database
64**
65**	Parameters:
66**		db -- The database to close.
67**		key -- The key to remove.
68**		flags -- delete options. There are currently no defined
69**			 flags for delete.
70**
71**	Returns:
72**		0 - Success, otherwise errno.
73**
74*/
75
76typedef int (*db_del_func) __P((SMDB_DATABASE *db,
77			   SMDB_DBENT *key, unsigned int flags));
78
79/*
80**  DB_FD_FUNC -- Returns a pointer to a file used for the database.
81**
82**	Parameters:
83**		db -- The database to close.
84**		fd -- A pointer to store the returned fd in.
85**
86**	Returns:
87**		0 - Success, otherwise errno.
88**
89*/
90
91typedef int (*db_fd_func) __P((SMDB_DATABASE *db, int* fd));
92
93/*
94**  DB_GET_FUNC -- Gets the data associated with a key.
95**
96**	Parameters:
97**		db -- The database to close.
98**		key -- The key to access.
99**		data -- A place to store the returned data.
100**		flags -- get options. There are currently no defined
101**			 flags for get.
102**
103**	Returns:
104**		0 - Success, otherwise errno.
105**
106*/
107
108typedef int (*db_get_func) __P((SMDB_DATABASE *db,
109			   SMDB_DBENT *key,
110			   SMDB_DBENT *data, unsigned int flags));
111
112/*
113**  DB_PUT_FUNC -- Sets some data according to the key.
114**
115**	Parameters:
116**		db -- The database to close.
117**		key -- The key to use.
118**		data -- The data to store.
119**		flags -- put options:
120**			SMDBF_NO_OVERWRITE - Return an error if key alread
121**					     exists.
122**			SMDBF_ALLOW_DUP - Allow duplicates in btree maps.
123**
124**	Returns:
125**		0 - Success, otherwise errno.
126**
127*/
128
129typedef int (*db_put_func) __P((SMDB_DATABASE *db,
130			   SMDB_DBENT *key,
131			   SMDB_DBENT *data, unsigned int flags));
132
133/*
134**  DB_SYNC_FUNC -- Flush any cached information to disk.
135**
136**	Parameters:
137**		db -- The database to sync.
138**		flags -- sync options:
139**
140**	Returns:
141**		0 - Success, otherwise errno.
142**
143*/
144
145typedef int (*db_sync_func) __P((SMDB_DATABASE *db, unsigned int flags));
146
147/*
148**  DB_SET_OWNER_FUNC -- Set the owner and group of the database files.
149**
150**	Parameters:
151**		db -- The database to set.
152**		uid -- The UID for the new owner (-1 for no change)
153**		gid -- The GID for the new owner (-1 for no change)
154**
155**	Returns:
156**		0 - Success, otherwise errno.
157**
158*/
159
160typedef int (*db_set_owner_func) __P((SMDB_DATABASE *db, uid_t uid, gid_t gid));
161
162/*
163**  DB_CURSOR -- Obtain a cursor for sequential access
164**
165**	Parameters:
166**		db -- The database to use.
167**		cursor -- The address of a cursor pointer.
168**		flags -- sync options:
169**
170**	Returns:
171**		0 - Success, otherwise errno.
172**
173*/
174
175typedef int (*db_cursor_func) __P((SMDB_DATABASE *db,
176			      SMDB_CURSOR **cursor, unsigned int flags));
177
178typedef int (*db_lockfd_func) __P((SMDB_DATABASE *db));
179
180struct database_struct
181{
182	db_close_func		smdb_close;
183	db_del_func		smdb_del;
184	db_fd_func		smdb_fd;
185	db_get_func		smdb_get;
186	db_put_func		smdb_put;
187	db_sync_func		smdb_sync;
188	db_set_owner_func	smdb_set_owner;
189	db_cursor_func		smdb_cursor;
190	db_lockfd_func		smdb_lockfd;
191	void			*smdb_impl;
192};
193/*
194**  DB_CURSOR_CLOSE -- Close a cursor
195**
196**	Parameters:
197**		cursor -- The cursor to close.
198**
199**	Returns:
200**		0 - Success, otherwise errno.
201**
202*/
203
204typedef int (*db_cursor_close_func) __P((SMDB_CURSOR *cursor));
205
206/*
207**  DB_CURSOR_DEL -- Delete the key/value pair of this cursor
208**
209**	Parameters:
210**		cursor -- The cursor.
211**		flags -- flags
212**
213**	Returns:
214**		0 - Success, otherwise errno.
215**
216*/
217
218typedef int (*db_cursor_del_func) __P((SMDB_CURSOR *cursor,
219					unsigned int flags));
220
221/*
222**  DB_CURSOR_GET -- Get the key/value of this cursor.
223**
224**	Parameters:
225**		cursor -- The cursor.
226**		key -- The current key.
227**		value -- The current value
228**		flags -- flags
229**
230**	Returns:
231**		0 - Success, otherwise errno.
232**		SMDBE_LAST_ENTRY - This is a success condition that
233**				   gets returned when the end of the
234**				   database is hit.
235**
236*/
237
238typedef int (*db_cursor_get_func) __P((SMDB_CURSOR *cursor,
239				  SMDB_DBENT *key,
240				  SMDB_DBENT *data,
241				  unsigned int flags));
242
243/*
244**  Flags for DB_CURSOR_GET
245*/
246
247#define SMDB_CURSOR_GET_FIRST	0
248#define SMDB_CURSOR_GET_LAST	1
249#define SMDB_CURSOR_GET_NEXT	2
250#define SMDB_CURSOR_GET_RANGE	3
251
252/*
253**  DB_CURSOR_PUT -- Put the key/value at this cursor.
254**
255**	Parameters:
256**		cursor -- The cursor.
257**		key -- The current key.
258**		value -- The current value
259**		flags -- flags
260**
261**	Returns:
262**		0 - Success, otherwise errno.
263**
264*/
265
266typedef int (*db_cursor_put_func) __P((SMDB_CURSOR *cursor,
267				  SMDB_DBENT *key,
268				  SMDB_DBENT *data,
269				  unsigned int flags));
270
271
272
273struct cursor_struct
274{
275	db_cursor_close_func	smdbc_close;
276	db_cursor_del_func	smdbc_del;
277	db_cursor_get_func	smdbc_get;
278	db_cursor_put_func	smdbc_put;
279	void			*smdbc_impl;
280};
281
282
283struct database_params_struct
284{
285	unsigned int	smdbp_num_elements;
286	unsigned int	smdbp_cache_size;
287	bool		smdbp_allow_dup;
288};
289
290typedef struct database_params_struct SMDB_DBPARAMS;
291
292struct database_user_struct
293{
294	uid_t	smdbu_id;
295	gid_t	smdbu_group_id;
296	char	smdbu_name[SMDB_MAX_USER_NAME_LEN];
297};
298
299typedef struct database_user_struct SMDB_USER_INFO;
300
301struct entry_struct
302{
303	void	*data;
304	size_t	size;
305};
306
307typedef char *SMDB_DBTYPE;
308typedef unsigned int SMDB_FLAG;
309
310/*
311**  These are types of databases.
312*/
313
314# define SMDB_TYPE_DEFAULT	NULL
315# define SMDB_TYPE_DEFAULT_LEN	0
316# define SMDB_TYPE_HASH		"hash"
317# define SMDB_TYPE_HASH_LEN	5
318# define SMDB_TYPE_BTREE	"btree"
319# define SMDB_TYPE_BTREE_LEN	6
320# define SMDB_TYPE_NDBM		"dbm"
321# define SMDB_TYPE_NDBM_LEN	4
322
323/*
324**  These are flags
325*/
326
327/* Flags for put */
328# define SMDBF_NO_OVERWRITE	0x00000001
329# define SMDBF_ALLOW_DUP	0x00000002
330
331
332extern SMDB_DATABASE	*smdb_malloc_database __P((void));
333extern void		smdb_free_database __P((SMDB_DATABASE *));
334extern int		smdb_open_database __P((SMDB_DATABASE **, char *, int,
335						int, long, SMDB_DBTYPE,
336						SMDB_USER_INFO *,
337						SMDB_DBPARAMS *));
338# ifdef NEWDB
339extern int		smdb_db_open __P((SMDB_DATABASE **, char *, int, int,
340					  long, SMDB_DBTYPE, SMDB_USER_INFO *,
341					  SMDB_DBPARAMS *));
342# endif /* NEWDB */
343# ifdef NDBM
344extern int		smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int,
345					    long, SMDB_DBTYPE,
346					    SMDB_USER_INFO *,
347					    SMDB_DBPARAMS *));
348# endif /* NDBM */
349extern int		smdb_add_extension __P((char *, int, char *, char *));
350extern int		smdb_setup_file __P((char *, char *, int, long,
351					     SMDB_USER_INFO *, struct stat *));
352extern int		smdb_lock_file __P((int *, char *, int, long, char *));
353extern int		smdb_unlock_file __P((int));
354extern int		smdb_filechanged __P((char *, char *, int,
355					      struct stat *));
356extern void		smdb_print_available_types __P((void));
357extern char		*smdb_db_definition __P((SMDB_DBTYPE));
358extern int		smdb_lock_map __P((SMDB_DATABASE *, int));
359extern int		smdb_unlock_map __P((SMDB_DATABASE *));
360#endif /* ! _SMDB_H_ */
361