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