1/*	$NetBSD: proto-bdb.h,v 1.1.1.3 2010/12/12 15:22:59 adam Exp $	*/
2
3/* OpenLDAP: pkg/ldap/servers/slapd/back-bdb/proto-bdb.h,v 1.137.2.17 2010/04/14 22:59:10 quanah Exp */
4/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 2000-2010 The OpenLDAP Foundation.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted only as authorized by the OpenLDAP
11 * Public License.
12 *
13 * A copy of this license is available in the file LICENSE in the
14 * top-level directory of the distribution or, alternatively, at
15 * <http://www.OpenLDAP.org/license.html>.
16 */
17
18#ifndef _PROTO_BDB_H
19#define _PROTO_BDB_H
20
21LDAP_BEGIN_DECL
22
23#ifdef BDB_HIER
24#define	BDB_SYMBOL(x)	LDAP_CONCAT(hdb_,x)
25#define BDB_UCTYPE	"HDB"
26#else
27#define BDB_SYMBOL(x)	LDAP_CONCAT(bdb_,x)
28#define BDB_UCTYPE	"BDB"
29#endif
30
31/*
32 * attr.c
33 */
34
35#define bdb_attr_mask				BDB_SYMBOL(attr_mask)
36#define bdb_attr_flush				BDB_SYMBOL(attr_flush)
37#define bdb_attr_slot				BDB_SYMBOL(attr_slot)
38#define bdb_attr_index_config		BDB_SYMBOL(attr_index_config)
39#define bdb_attr_index_destroy		BDB_SYMBOL(attr_index_destroy)
40#define bdb_attr_index_free			BDB_SYMBOL(attr_index_free)
41#define bdb_attr_index_unparse		BDB_SYMBOL(attr_index_unparse)
42#define bdb_attr_info_free			BDB_SYMBOL(attr_info_free)
43
44AttrInfo *bdb_attr_mask( struct bdb_info *bdb,
45	AttributeDescription *desc );
46
47void bdb_attr_flush( struct bdb_info *bdb );
48
49int bdb_attr_slot( struct bdb_info *bdb,
50	AttributeDescription *desc, int *insert );
51
52int bdb_attr_index_config LDAP_P(( struct bdb_info *bdb,
53	const char *fname, int lineno,
54	int argc, char **argv, struct config_reply_s *cr ));
55
56void bdb_attr_index_unparse LDAP_P(( struct bdb_info *bdb, BerVarray *bva ));
57void bdb_attr_index_destroy LDAP_P(( struct bdb_info *bdb ));
58void bdb_attr_index_free LDAP_P(( struct bdb_info *bdb,
59	AttributeDescription *ad ));
60
61void bdb_attr_info_free( AttrInfo *ai );
62
63/*
64 * config.c
65 */
66
67#define bdb_back_init_cf				BDB_SYMBOL(back_init_cf)
68
69int bdb_back_init_cf( BackendInfo *bi );
70
71/*
72 * dbcache.c
73 */
74#define bdb_db_cache				BDB_SYMBOL(db_cache)
75#define bdb_db_findsize				BDB_SYMBOL(db_findsize)
76
77int
78bdb_db_cache(
79    Backend	*be,
80    struct berval *name,
81	DB **db );
82
83int
84bdb_db_findsize(
85	struct bdb_info *bdb,
86	struct berval *name );
87
88/*
89 * dn2entry.c
90 */
91#define bdb_dn2entry				BDB_SYMBOL(dn2entry)
92
93int bdb_dn2entry LDAP_P(( Operation *op, DB_TXN *tid,
94	struct berval *dn, EntryInfo **e, int matched,
95	DB_LOCK *lock ));
96
97/*
98 * dn2id.c
99 */
100#define bdb_dn2id					BDB_SYMBOL(dn2id)
101#define bdb_dn2id_add				BDB_SYMBOL(dn2id_add)
102#define bdb_dn2id_delete			BDB_SYMBOL(dn2id_delete)
103#define bdb_dn2id_children			BDB_SYMBOL(dn2id_children)
104#define bdb_dn2idl					BDB_SYMBOL(dn2idl)
105
106int bdb_dn2id(
107	Operation *op,
108	struct berval *dn,
109	EntryInfo *ei,
110	DB_TXN *txn,
111	DB_LOCK *lock );
112
113int bdb_dn2id_add(
114	Operation *op,
115	DB_TXN *tid,
116	EntryInfo *eip,
117	Entry *e );
118
119int bdb_dn2id_delete(
120	Operation *op,
121	DB_TXN *tid,
122	EntryInfo *eip,
123	Entry *e );
124
125int bdb_dn2id_children(
126	Operation *op,
127	DB_TXN *tid,
128	Entry *e );
129
130int bdb_dn2idl(
131	Operation *op,
132	DB_TXN *txn,
133	struct berval *ndn,
134	EntryInfo *ei,
135	ID *ids,
136	ID *stack );
137
138#ifdef BDB_HIER
139#define bdb_dn2id_parent			BDB_SYMBOL(dn2id_parent)
140#define bdb_dup_compare				BDB_SYMBOL(dup_compare)
141#define bdb_fix_dn					BDB_SYMBOL(fix_dn)
142
143int bdb_dn2id_parent(
144	Operation *op,
145	DB_TXN *txn,
146	EntryInfo *ei,
147	ID *idp );
148
149int bdb_dup_compare(
150	DB *db,
151	const DBT *usrkey,
152	const DBT *curkey );
153
154int bdb_fix_dn( Entry *e, int checkit );
155#endif
156
157
158/*
159 * error.c
160 */
161#define bdb_errcall					BDB_SYMBOL(errcall)
162
163#if DB_VERSION_FULL < 0x04030000
164void bdb_errcall( const char *pfx, char * msg );
165#else
166#define bdb_msgcall					BDB_SYMBOL(msgcall)
167void bdb_errcall( const DB_ENV *env, const char *pfx, const char * msg );
168void bdb_msgcall( const DB_ENV *env, const char * msg );
169#endif
170
171#ifdef HAVE_EBCDIC
172#define ebcdic_dberror				BDB_SYMBOL(ebcdic_dberror)
173
174char *ebcdic_dberror( int rc );
175#define db_strerror(x)	ebcdic_dberror(x)
176#endif
177
178/*
179 * filterentry.c
180 */
181#define bdb_filter_candidates		BDB_SYMBOL(filter_candidates)
182
183int bdb_filter_candidates(
184	Operation *op,
185	DB_TXN *txn,
186	Filter	*f,
187	ID *ids,
188	ID *tmp,
189	ID *stack );
190
191/*
192 * id2entry.c
193 */
194#define bdb_id2entry				BDB_SYMBOL(id2entry)
195#define bdb_id2entry_add			BDB_SYMBOL(id2entry_add)
196#define bdb_id2entry_update			BDB_SYMBOL(id2entry_update)
197#define bdb_id2entry_delete			BDB_SYMBOL(id2entry_delete)
198
199int bdb_id2entry_add(
200	BackendDB *be,
201	DB_TXN *tid,
202	Entry *e );
203
204int bdb_id2entry_update(
205	BackendDB *be,
206	DB_TXN *tid,
207	Entry *e );
208
209int bdb_id2entry_delete(
210	BackendDB *be,
211	DB_TXN *tid,
212	Entry *e);
213
214#ifdef SLAP_ZONE_ALLOC
215#else
216int bdb_id2entry(
217	BackendDB *be,
218	DB_TXN *tid,
219	ID id,
220	Entry **e);
221#endif
222
223#define bdb_entry_free				BDB_SYMBOL(entry_free)
224#define bdb_entry_return			BDB_SYMBOL(entry_return)
225#define bdb_entry_release			BDB_SYMBOL(entry_release)
226#define bdb_entry_get				BDB_SYMBOL(entry_get)
227
228void bdb_entry_free ( Entry *e );
229#ifdef SLAP_ZONE_ALLOC
230int bdb_entry_return( struct bdb_info *bdb, Entry *e, int seqno );
231#else
232int bdb_entry_return( Entry *e );
233#endif
234BI_entry_release_rw bdb_entry_release;
235BI_entry_get_rw bdb_entry_get;
236
237
238/*
239 * idl.c
240 */
241
242#define bdb_idl_cache_get			BDB_SYMBOL(idl_cache_get)
243#define bdb_idl_cache_put			BDB_SYMBOL(idl_cache_put)
244#define bdb_idl_cache_del			BDB_SYMBOL(idl_cache_del)
245#define bdb_idl_cache_add_id		BDB_SYMBOL(idl_cache_add_id)
246#define bdb_idl_cache_del_id		BDB_SYMBOL(idl_cache_del_id)
247
248int bdb_idl_cache_get(
249	struct bdb_info *bdb,
250	DB *db,
251	DBT *key,
252	ID *ids );
253
254void
255bdb_idl_cache_put(
256	struct bdb_info	*bdb,
257	DB		*db,
258	DBT		*key,
259	ID		*ids,
260	int		rc );
261
262void
263bdb_idl_cache_del(
264	struct bdb_info	*bdb,
265	DB		*db,
266	DBT		*key );
267
268void
269bdb_idl_cache_add_id(
270	struct bdb_info	*bdb,
271	DB		*db,
272	DBT		*key,
273	ID		id );
274
275void
276bdb_idl_cache_del_id(
277	struct bdb_info	*bdb,
278	DB		*db,
279	DBT		*key,
280	ID		id );
281
282#define bdb_idl_first				BDB_SYMBOL(idl_first)
283#define bdb_idl_next				BDB_SYMBOL(idl_next)
284#define bdb_idl_search				BDB_SYMBOL(idl_search)
285#define bdb_idl_insert				BDB_SYMBOL(idl_insert)
286#define bdb_idl_intersection		BDB_SYMBOL(idl_intersection)
287#define bdb_idl_union				BDB_SYMBOL(idl_union)
288#define bdb_idl_sort				BDB_SYMBOL(idl_sort)
289#define bdb_idl_append				BDB_SYMBOL(idl_append)
290#define bdb_idl_append_one			BDB_SYMBOL(idl_append_one)
291
292#define bdb_idl_fetch_key			BDB_SYMBOL(idl_fetch_key)
293#define bdb_idl_insert_key			BDB_SYMBOL(idl_insert_key)
294#define bdb_idl_delete_key			BDB_SYMBOL(idl_delete_key)
295
296unsigned bdb_idl_search( ID *ids, ID id );
297
298int bdb_idl_fetch_key(
299	BackendDB	*be,
300	DB			*db,
301	DB_TXN		*txn,
302	DBT			*key,
303	ID			*ids,
304	DBC                     **saved_cursor,
305	int                     get_flag );
306
307int bdb_idl_insert( ID *ids, ID id );
308
309int bdb_idl_insert_key(
310	BackendDB *be,
311	DB *db,
312	DB_TXN *txn,
313	DBT *key,
314	ID id );
315
316int bdb_idl_delete_key(
317	BackendDB *be,
318	DB *db,
319	DB_TXN *txn,
320	DBT *key,
321	ID id );
322
323int
324bdb_idl_intersection(
325	ID *a,
326	ID *b );
327
328int
329bdb_idl_union(
330	ID *a,
331	ID *b );
332
333ID bdb_idl_first( ID *ids, ID *cursor );
334ID bdb_idl_next( ID *ids, ID *cursor );
335
336void bdb_idl_sort( ID *ids, ID *tmp );
337int bdb_idl_append( ID *a, ID *b );
338int bdb_idl_append_one( ID *ids, ID id );
339
340
341/*
342 * index.c
343 */
344#define bdb_index_mask				BDB_SYMBOL(index_mask)
345#define bdb_index_param				BDB_SYMBOL(index_param)
346#define bdb_index_values			BDB_SYMBOL(index_values)
347#define bdb_index_entry				BDB_SYMBOL(index_entry)
348#define bdb_index_recset			BDB_SYMBOL(index_recset)
349#define bdb_index_recrun			BDB_SYMBOL(index_recrun)
350
351extern AttrInfo *
352bdb_index_mask LDAP_P((
353	Backend *be,
354	AttributeDescription *desc,
355	struct berval *name ));
356
357extern int
358bdb_index_param LDAP_P((
359	Backend *be,
360	AttributeDescription *desc,
361	int ftype,
362	DB **db,
363	slap_mask_t *mask,
364	struct berval *prefix ));
365
366extern int
367bdb_index_values LDAP_P((
368	Operation *op,
369	DB_TXN *txn,
370	AttributeDescription *desc,
371	BerVarray vals,
372	ID id,
373	int opid ));
374
375extern int
376bdb_index_recset LDAP_P((
377	struct bdb_info *bdb,
378	Attribute *a,
379	AttributeType *type,
380	struct berval *tags,
381	IndexRec *ir ));
382
383extern int
384bdb_index_recrun LDAP_P((
385	Operation *op,
386	struct bdb_info *bdb,
387	IndexRec *ir,
388	ID id,
389	int base ));
390
391int bdb_index_entry LDAP_P(( Operation *op, DB_TXN *t, int r, Entry *e ));
392
393#define bdb_index_entry_add(op,t,e) \
394	bdb_index_entry((op),(t),SLAP_INDEX_ADD_OP,(e))
395#define bdb_index_entry_del(op,t,e) \
396	bdb_index_entry((op),(t),SLAP_INDEX_DELETE_OP,(e))
397
398/*
399 * key.c
400 */
401#define bdb_key_read				BDB_SYMBOL(key_read)
402#define bdb_key_change				BDB_SYMBOL(key_change)
403
404extern int
405bdb_key_read(
406    Backend	*be,
407	DB *db,
408	DB_TXN *txn,
409    struct berval *k,
410	ID *ids,
411    DBC **saved_cursor,
412        int get_flags );
413
414extern int
415bdb_key_change(
416    Backend	 *be,
417    DB *db,
418	DB_TXN *txn,
419    struct berval *k,
420    ID id,
421    int	op );
422
423/*
424 * nextid.c
425 */
426#define bdb_next_id					BDB_SYMBOL(next_id)
427#define bdb_last_id					BDB_SYMBOL(last_id)
428
429int bdb_next_id( BackendDB *be, ID *id );
430int bdb_last_id( BackendDB *be, DB_TXN *tid );
431
432/*
433 * modify.c
434 */
435#define bdb_modify_internal			BDB_SYMBOL(modify_internal)
436
437int bdb_modify_internal(
438	Operation *op,
439	DB_TXN *tid,
440	Modifications *modlist,
441	Entry *e,
442	const char **text,
443	char *textbuf,
444	size_t textlen );
445
446/*
447 * monitor.c
448 */
449
450#define bdb_monitor_db_init	BDB_SYMBOL(monitor_db_init)
451#define bdb_monitor_db_open	BDB_SYMBOL(monitor_db_open)
452#define bdb_monitor_db_close	BDB_SYMBOL(monitor_db_close)
453#define bdb_monitor_db_destroy	BDB_SYMBOL(monitor_db_destroy)
454
455int bdb_monitor_db_init( BackendDB *be );
456int bdb_monitor_db_open( BackendDB *be );
457int bdb_monitor_db_close( BackendDB *be );
458int bdb_monitor_db_destroy( BackendDB *be );
459
460#ifdef BDB_MONITOR_IDX
461#define bdb_monitor_idx_add	BDB_SYMBOL(monitor_idx_add)
462int
463bdb_monitor_idx_add(
464	struct bdb_info		*bdb,
465	AttributeDescription	*desc,
466	slap_mask_t		type );
467#endif /* BDB_MONITOR_IDX */
468
469/*
470 * cache.c
471 */
472#define bdb_cache_entry_db_unlock	BDB_SYMBOL(cache_entry_db_unlock)
473#define bdb_cache_return_entry_rw	BDB_SYMBOL(cache_return_entry_rw)
474
475#define	bdb_cache_entryinfo_lock(e) \
476	ldap_pvt_thread_mutex_lock( &(e)->bei_kids_mutex )
477#define	bdb_cache_entryinfo_unlock(e) \
478	ldap_pvt_thread_mutex_unlock( &(e)->bei_kids_mutex )
479#define	bdb_cache_entryinfo_trylock(e) \
480	ldap_pvt_thread_mutex_trylock( &(e)->bei_kids_mutex )
481
482/* What a mess. Hopefully the current cache scheme will stabilize
483 * and we can trim out all of this stuff.
484 */
485void bdb_cache_return_entry_rw( struct bdb_info *bdb, Entry *e,
486	int rw, DB_LOCK *lock );
487#define bdb_cache_return_entry_r(bdb, e, l) \
488	bdb_cache_return_entry_rw((bdb), (e), 0, (l))
489#define bdb_cache_return_entry_w(bdb, e, l) \
490	bdb_cache_return_entry_rw((bdb), (e), 1, (l))
491#if 0
492void bdb_unlocked_cache_return_entry_rw( struct bdb_info *bdb, Entry *e, int rw );
493#else
494#define	bdb_unlocked_cache_return_entry_rw( a, b, c )	((void)0)
495#endif
496#define bdb_unlocked_cache_return_entry_r( c, e ) \
497	bdb_unlocked_cache_return_entry_rw((c), (e), 0)
498#define bdb_unlocked_cache_return_entry_w( c, e ) \
499	bdb_unlocked_cache_return_entry_rw((c), (e), 1)
500
501#define bdb_cache_add				BDB_SYMBOL(cache_add)
502#define bdb_cache_children			BDB_SYMBOL(cache_children)
503#define bdb_cache_delete			BDB_SYMBOL(cache_delete)
504#define bdb_cache_delete_cleanup	BDB_SYMBOL(cache_delete_cleanup)
505#define bdb_cache_find_id			BDB_SYMBOL(cache_find_id)
506#define bdb_cache_find_ndn			BDB_SYMBOL(cache_find_ndn)
507#define bdb_cache_find_parent		BDB_SYMBOL(cache_find_parent)
508#define bdb_cache_modify			BDB_SYMBOL(cache_modify)
509#define bdb_cache_modrdn			BDB_SYMBOL(cache_modrdn)
510#define bdb_cache_release_all		BDB_SYMBOL(cache_release_all)
511#define bdb_cache_delete_entry		BDB_SYMBOL(cache_delete_entry)
512
513int bdb_cache_children(
514	Operation *op,
515	DB_TXN *txn,
516	Entry *e
517);
518int bdb_cache_add(
519	struct bdb_info *bdb,
520	EntryInfo *pei,
521	Entry   *e,
522	struct berval *nrdn,
523	DB_TXN *txn,
524	DB_LOCK *lock
525);
526int bdb_cache_modrdn(
527	struct bdb_info *bdb,
528	Entry	*e,
529	struct berval *nrdn,
530	Entry	*new,
531	EntryInfo *ein,
532	DB_TXN *txn,
533	DB_LOCK *lock
534);
535int bdb_cache_modify(
536	struct bdb_info *bdb,
537	Entry *e,
538	Attribute *newAttrs,
539	DB_TXN *txn,
540	DB_LOCK *lock
541);
542int bdb_cache_find_ndn(
543	Operation *op,
544	DB_TXN *txn,
545	struct berval   *ndn,
546	EntryInfo	**res
547);
548
549#define	ID_LOCKED	1
550#define	ID_NOCACHE	2
551#define	ID_NOENTRY	4
552int bdb_cache_find_id(
553	Operation *op,
554	DB_TXN	*tid,
555	ID		id,
556	EntryInfo **eip,
557	int	flag,
558	DB_LOCK		*lock
559);
560int
561bdb_cache_find_parent(
562	Operation *op,
563	DB_TXN *txn,
564	ID id,
565	EntryInfo **res
566);
567int bdb_cache_delete(
568	struct bdb_info *bdb,
569	Entry	*e,
570	DB_TXN *txn,
571	DB_LOCK	*lock
572);
573void bdb_cache_delete_cleanup(
574	Cache	*cache,
575	EntryInfo *ei
576);
577void bdb_cache_release_all( Cache *cache );
578
579#ifdef BDB_HIER
580int hdb_cache_load(
581	struct bdb_info *bdb,
582	EntryInfo *ei,
583	EntryInfo **res
584);
585#endif
586
587#define bdb_cache_entry_db_relock		BDB_SYMBOL(cache_entry_db_relock)
588int bdb_cache_entry_db_relock(
589	struct bdb_info *bdb,
590	DB_TXN *txn,
591	EntryInfo *ei,
592	int rw,
593	int tryOnly,
594	DB_LOCK *lock );
595
596int bdb_cache_entry_db_unlock(
597	struct bdb_info *bdb,
598	DB_LOCK *lock );
599
600#define bdb_reader_get				BDB_SYMBOL(reader_get)
601#define bdb_reader_flush			BDB_SYMBOL(reader_flush)
602int bdb_reader_get( Operation *op, DB_ENV *env, DB_TXN **txn );
603void bdb_reader_flush( DB_ENV *env );
604
605/*
606 * trans.c
607 */
608#define bdb_trans_backoff			BDB_SYMBOL(trans_backoff)
609
610void
611bdb_trans_backoff( int num_retries );
612
613/*
614 * former external.h
615 */
616
617#define bdb_back_initialize		BDB_SYMBOL(back_initialize)
618#define bdb_db_config			BDB_SYMBOL(db_config)
619#define bdb_add				BDB_SYMBOL(add)
620#define bdb_bind			BDB_SYMBOL(bind)
621#define bdb_compare			BDB_SYMBOL(compare)
622#define bdb_delete			BDB_SYMBOL(delete)
623#define bdb_modify			BDB_SYMBOL(modify)
624#define bdb_modrdn			BDB_SYMBOL(modrdn)
625#define bdb_search			BDB_SYMBOL(search)
626#define bdb_extended			BDB_SYMBOL(extended)
627#define bdb_referrals			BDB_SYMBOL(referrals)
628#define bdb_operational			BDB_SYMBOL(operational)
629#define bdb_hasSubordinates		BDB_SYMBOL(hasSubordinates)
630#define bdb_tool_entry_open		BDB_SYMBOL(tool_entry_open)
631#define bdb_tool_entry_close		BDB_SYMBOL(tool_entry_close)
632#define bdb_tool_entry_first_x		BDB_SYMBOL(tool_entry_first_x)
633#define bdb_tool_entry_next		BDB_SYMBOL(tool_entry_next)
634#define bdb_tool_entry_get		BDB_SYMBOL(tool_entry_get)
635#define bdb_tool_entry_put		BDB_SYMBOL(tool_entry_put)
636#define bdb_tool_entry_reindex		BDB_SYMBOL(tool_entry_reindex)
637#define bdb_tool_dn2id_get		BDB_SYMBOL(tool_dn2id_get)
638#define bdb_tool_entry_modify		BDB_SYMBOL(tool_entry_modify)
639#define bdb_tool_idl_add		BDB_SYMBOL(tool_idl_add)
640
641extern BI_init				bdb_back_initialize;
642
643extern BI_db_config			bdb_db_config;
644
645extern BI_op_add			bdb_add;
646extern BI_op_bind			bdb_bind;
647extern BI_op_compare			bdb_compare;
648extern BI_op_delete			bdb_delete;
649extern BI_op_modify			bdb_modify;
650extern BI_op_modrdn			bdb_modrdn;
651extern BI_op_search			bdb_search;
652extern BI_op_extended			bdb_extended;
653
654extern BI_chk_referrals			bdb_referrals;
655
656extern BI_operational			bdb_operational;
657
658extern BI_has_subordinates 		bdb_hasSubordinates;
659
660/* tools.c */
661extern BI_tool_entry_open		bdb_tool_entry_open;
662extern BI_tool_entry_close		bdb_tool_entry_close;
663extern BI_tool_entry_first_x		bdb_tool_entry_first_x;
664extern BI_tool_entry_next		bdb_tool_entry_next;
665extern BI_tool_entry_get		bdb_tool_entry_get;
666extern BI_tool_entry_put		bdb_tool_entry_put;
667extern BI_tool_entry_reindex		bdb_tool_entry_reindex;
668extern BI_tool_dn2id_get		bdb_tool_dn2id_get;
669extern BI_tool_entry_modify		bdb_tool_entry_modify;
670
671int bdb_tool_idl_add( BackendDB *be, DB *db, DB_TXN *txn, DBT *key, ID id );
672
673LDAP_END_DECL
674
675#endif /* _PROTO_BDB_H */
676