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