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