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