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