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