1/* $OpenLDAP$ */
2/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3 *
4 * Copyright 2000-2011 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
19LDAP_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
42AttrInfo *bdb_attr_mask( struct bdb_info *bdb,
43	AttributeDescription *desc );
44
45void bdb_attr_flush( struct bdb_info *bdb );
46
47int bdb_attr_slot( struct bdb_info *bdb,
48	AttributeDescription *desc, int *insert );
49
50int 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
54void bdb_attr_index_unparse LDAP_P(( struct bdb_info *bdb, BerVarray *bva ));
55void bdb_attr_index_destroy LDAP_P(( struct bdb_info *bdb ));
56void bdb_attr_index_free LDAP_P(( struct bdb_info *bdb,
57	AttributeDescription *ad ));
58
59void 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
67int 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
75int
76bdb_db_cache(
77    Backend	*be,
78    struct berval *name,
79	DB **db );
80
81int
82bdb_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
91int 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
104int bdb_dn2id(
105	Operation *op,
106	struct berval *dn,
107	EntryInfo *ei,
108	DB_TXN *txn,
109	DBC **cursor );
110
111int bdb_dn2id_add(
112	Operation *op,
113	DB_TXN *tid,
114	EntryInfo *eip,
115	Entry *e );
116
117int bdb_dn2id_delete(
118	Operation *op,
119	DB_TXN *tid,
120	EntryInfo *eip,
121	Entry *e );
122
123int bdb_dn2id_children(
124	Operation *op,
125	DB_TXN *tid,
126	Entry *e );
127
128int 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
141int bdb_dn2id_parent(
142	Operation *op,
143	DB_TXN *txn,
144	EntryInfo *ei,
145	ID *idp );
146
147int bdb_dup_compare(
148	DB *db,
149	const DBT *usrkey,
150	const DBT *curkey );
151
152int 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
162void bdb_errcall( const char *pfx, char * msg );
163#else
164#define bdb_msgcall					BDB_SYMBOL(msgcall)
165void bdb_errcall( const DB_ENV *env, const char *pfx, const char * msg );
166void 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
172char *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
181int 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
197int bdb_id2entry_add(
198	BackendDB *be,
199	DB_TXN *tid,
200	Entry *e );
201
202int bdb_id2entry_update(
203	BackendDB *be,
204	DB_TXN *tid,
205	Entry *e );
206
207int bdb_id2entry_delete(
208	BackendDB *be,
209	DB_TXN *tid,
210	Entry *e);
211
212#ifdef SLAP_ZONE_ALLOC
213#else
214int 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
226void bdb_entry_free ( Entry *e );
227#ifdef SLAP_ZONE_ALLOC
228int bdb_entry_return( struct bdb_info *bdb, Entry *e, int seqno );
229#else
230int bdb_entry_return( Entry *e );
231#endif
232BI_entry_release_rw bdb_entry_release;
233BI_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
246int bdb_idl_cache_get(
247	struct bdb_info *bdb,
248	DB *db,
249	DBT *key,
250	ID *ids );
251
252void
253bdb_idl_cache_put(
254	struct bdb_info	*bdb,
255	DB		*db,
256	DBT		*key,
257	ID		*ids,
258	int		rc );
259
260void
261bdb_idl_cache_del(
262	struct bdb_info	*bdb,
263	DB		*db,
264	DBT		*key );
265
266void
267bdb_idl_cache_add_id(
268	struct bdb_info	*bdb,
269	DB		*db,
270	DBT		*key,
271	ID		id );
272
273void
274bdb_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
295unsigned bdb_idl_search( ID *ids, ID id );
296
297int 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
306int bdb_idl_insert( ID *ids, ID id );
307int bdb_idl_delete( 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#define bdb_cache_deref				BDB_SYMBOL(cache_deref)
513
514int bdb_cache_children(
515	Operation *op,
516	DB_TXN *txn,
517	Entry *e
518);
519int 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);
527int 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);
536int bdb_cache_modify(
537	struct bdb_info *bdb,
538	Entry *e,
539	Attribute *newAttrs,
540	DB_TXN *txn,
541	DB_LOCK *lock
542);
543int 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
554int 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);
562int
563bdb_cache_find_parent(
564	Operation *op,
565	DB_TXN *txn,
566	ID id,
567	EntryInfo **res
568);
569int bdb_cache_delete(
570	struct bdb_info *bdb,
571	Entry	*e,
572	DB_TXN *txn,
573	DB_LOCK	*lock
574);
575void bdb_cache_delete_cleanup(
576	Cache	*cache,
577	EntryInfo *ei
578);
579void bdb_cache_release_all( Cache *cache );
580void bdb_cache_deref( EntryInfo *ei );
581
582#ifdef BDB_HIER
583int 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)
591int 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
599int 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)
605int bdb_reader_get( Operation *op, DB_ENV *env, DB_TXN **txn );
606void bdb_reader_flush( DB_ENV *env );
607
608/*
609 * trans.c
610 */
611#define bdb_trans_backoff			BDB_SYMBOL(trans_backoff)
612
613void
614bdb_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
644extern BI_init				bdb_back_initialize;
645
646extern BI_db_config			bdb_db_config;
647
648extern BI_op_add			bdb_add;
649extern BI_op_bind			bdb_bind;
650extern BI_op_compare			bdb_compare;
651extern BI_op_delete			bdb_delete;
652extern BI_op_modify			bdb_modify;
653extern BI_op_modrdn			bdb_modrdn;
654extern BI_op_search			bdb_search;
655extern BI_op_extended			bdb_extended;
656
657extern BI_chk_referrals			bdb_referrals;
658
659extern BI_operational			bdb_operational;
660
661extern BI_has_subordinates 		bdb_hasSubordinates;
662
663/* tools.c */
664extern BI_tool_entry_open		bdb_tool_entry_open;
665extern BI_tool_entry_close		bdb_tool_entry_close;
666extern BI_tool_entry_first_x		bdb_tool_entry_first_x;
667extern BI_tool_entry_next		bdb_tool_entry_next;
668extern BI_tool_entry_get		bdb_tool_entry_get;
669extern BI_tool_entry_put		bdb_tool_entry_put;
670extern BI_tool_entry_reindex		bdb_tool_entry_reindex;
671extern BI_tool_dn2id_get		bdb_tool_dn2id_get;
672extern BI_tool_entry_modify		bdb_tool_entry_modify;
673
674int bdb_tool_idl_add( BackendDB *be, DB *db, DB_TXN *txn, DBT *key, ID id );
675
676LDAP_END_DECL
677
678#endif /* _PROTO_BDB_H */
679