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