From: Kurt Zeilenga Date: Sun, 24 Sep 2000 22:48:13 +0000 (+0000) Subject: Add dn2entry.c X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~1909 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=3874e8571d7173e7330dacc1f4dfa78994fcca8b;p=openldap Add dn2entry.c --- diff --git a/servers/slapd/back-bdb/add.c b/servers/slapd/back-bdb/add.c index c7c2a6ce77..059794e553 100644 --- a/servers/slapd/back-bdb/add.c +++ b/servers/slapd/back-bdb/add.c @@ -11,6 +11,7 @@ #include #include "back-bdb.h" +#include "external.h" int bdb_add( diff --git a/servers/slapd/back-bdb/backbdb.dsp b/servers/slapd/back-bdb/backbdb.dsp index 66395d7bb0..3543e5e5a5 100644 --- a/servers/slapd/back-bdb/backbdb.dsp +++ b/servers/slapd/back-bdb/backbdb.dsp @@ -143,6 +143,10 @@ SOURCE=.\delete.c # End Source File # Begin Source File +SOURCE=.\dn2entry.c +# End Source File +# Begin Source File + SOURCE=.\dn2id.c # End Source File # Begin Source File diff --git a/servers/slapd/back-bdb/compare.c b/servers/slapd/back-bdb/compare.c index ece33d08b9..3dc7e9fc61 100644 --- a/servers/slapd/back-bdb/compare.c +++ b/servers/slapd/back-bdb/compare.c @@ -11,6 +11,7 @@ #include #include "back-bdb.h" +#include "external.h" int bdb_compare( diff --git a/servers/slapd/back-bdb/delete.c b/servers/slapd/back-bdb/delete.c index 887e05afdd..e3617f08d1 100644 --- a/servers/slapd/back-bdb/delete.c +++ b/servers/slapd/back-bdb/delete.c @@ -11,6 +11,7 @@ #include #include "back-bdb.h" +#include "external.h" int bdb_delete( diff --git a/servers/slapd/back-bdb/dn2entry.c b/servers/slapd/back-bdb/dn2entry.c new file mode 100644 index 0000000000..77482ef3d4 --- /dev/null +++ b/servers/slapd/back-bdb/dn2entry.c @@ -0,0 +1,53 @@ +/* dn2entry.c - routines to deal with the dn2id / id2entry glue */ +/* $OpenLDAP$ */ +/* + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +#include "portable.h" + +#include +#include + +#include "back-bdb.h" + +/* + * dn2entry - look up dn in the cache/indexes and return the corresponding + * entry. + */ + +int +bdb_dn2entry( + Backend *be, + DB_TXN *tid, + const char *dn, + Entry **e, + Entry **matched, + int flags ) +{ + int rc; + ID id; + char *matchedDN = NULL; + + Debug(LDAP_DEBUG_TRACE, "bdb_dn2entry: dn: \"%s\"\n", + dn, 0, 0 ); + + if( matched != NULL ) { + rc = bdb_dn2id_matched( be, tid, dn, &id, &matchedDN ); + } else { + rc = bdb_dn2id( be, tid, dn, &id ); + } + + if( rc != 0 ) { + return rc; + } + + if( matchedDN == NULL ) { + rc = bdb_id2entry( be, tid, id, e ); + } else { + rc = bdb_id2entry( be, tid, id, matched ); + } + + return rc; +} \ No newline at end of file diff --git a/servers/slapd/back-bdb/dn2id.c b/servers/slapd/back-bdb/dn2id.c index 4b5c46e9b2..007c18866f 100644 --- a/servers/slapd/back-bdb/dn2id.c +++ b/servers/slapd/back-bdb/dn2id.c @@ -95,8 +95,7 @@ bdb_dn2id_delete( Backend *be, DB_TXN *txn, const char *dn, - ID id -) + ID id ) { int rc; DBT key; @@ -104,7 +103,6 @@ bdb_dn2id_delete( DB *db = bdb->bi_dn2id->bdi_db; Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_delete( \"%s\", %ld )\n", dn, id, 0 ); - assert( id != NOID ); DBTzero( &key ); key.size = strlen( dn ) + 2; @@ -165,188 +163,145 @@ done: } int -bdb_dn2id_children( +bdb_dn2id( Backend *be, DB_TXN *txn, - const char *dn -) + const char *dn, + ID *id ) { int rc; DBT key, data; struct bdb_info *bdb = (struct bdb_info *) be->be_private; DB *db = bdb->bi_dn2id->bdi_db; - ID id; - Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_children( %s )\n", - dn, 0, 0 ); + Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id( \"%s\" )\n", dn, 0, 0 ); DBTzero( &key ); key.size = strlen( dn ) + 2; key.data = ch_malloc( key.size ); - ((char *)key.data)[0] = DN_ONE_PREFIX; + ((char *)key.data)[0] = DN_BASE_PREFIX; AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 ); - /* we actually could do a empty get... */ + /* store the ID */ DBTzero( &data ); - data.data = &id; - data.ulen = sizeof(id); + data.data = id; + data.ulen = sizeof(ID); data.flags = DB_DBT_USERMEM; - data.doff = 0; - data.dlen = sizeof(id); + /* fetch it */ rc = db->get( db, txn, &key, &data, 0 ); - Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_children( %s ): %s (%d)\n", - dn, - rc == 0 ? "yes" : ( rc == DB_NOTFOUND ? "no" : - db_strerror(rc) ), rc ); + Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: id=%ld: %s (%d)\n", + id, db_strerror( rc ), rc ); + ch_free( key.data ); return rc; } -#if 0 -ID -dn2id( +int +bdb_dn2id_matched( Backend *be, - const char *dn -) + DB_TXN *txn, + const char *in, + ID *id, + char **matchedDN ) { - struct ldbminfo *li = (struct ldbminfo *) be->be_private; - DBCache *db; - ID id; - Datum key, data; - - Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 ); - - /* first check the cache */ - if ( (id = cache_find_entry_dn2id( be, &li->li_cache, dn )) != NOID ) { - Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld (in cache)\n", id, - 0, 0 ); - return( id ); - } - - if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT )) - == NULL ) { - Debug( LDAP_DEBUG_ANY, "<= dn2id could not open dn2id%s\n", - LDBM_SUFFIX, 0, 0 ); - return( NOID ); - } - - ldbm_datum_init( key ); - - key.dsize = strlen( dn ) + 2; - key.dptr = ch_malloc( key.dsize ); - sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn ); - - data = ldbm_cache_fetch( db, key ); + int rc; + DBT key, data; + struct bdb_info *bdb = (struct bdb_info *) be->be_private; + DB *db = bdb->bi_dn2id->bdi_db; + const char *dn = in; + char *tmp = NULL; - ldbm_cache_close( be, db ); + Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_matched( \"%s\" )\n", dn, 0, 0 ); - free( key.dptr ); + DBTzero( &key ); + key.size = strlen( dn ) + 2; + key.data = ch_malloc( key.size ); + ((char *)key.data)[0] = DN_BASE_PREFIX; - if ( data.dptr == NULL ) { - Debug( LDAP_DEBUG_TRACE, "<= dn2id NOID\n", 0, 0, 0 ); - return( NOID ); - } + /* store the ID */ + DBTzero( &data ); + data.data = id; + data.ulen = sizeof(ID); + data.flags = DB_DBT_USERMEM; - AC_MEMCPY( (char *) &id, data.dptr, sizeof(ID) ); + *matchedDN = NULL; - assert( id != NOID ); + while(1) { + AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 ); - ldbm_datum_free( db->dbc_db, data ); + /* fetch it */ + rc = db->get( db, txn, &key, &data, 0 ); - Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld\n", id, 0, 0 ); - return( id ); -} + if( rc == DB_NOTFOUND ) { + char *pdn = dn_parent( be, dn ); + ch_free( tmp ); + tmp = NULL; -ID_BLOCK * -dn2idl( - Backend *be, - const char *dn, - int prefix -) -{ - DBCache *db; - Datum key; - ID_BLOCK *idl; + if( pdn == NULL || *pdn == '\0' ) { + ch_free( pdn ); + break; + } - Debug( LDAP_DEBUG_TRACE, "=> dn2idl( \"%c%s\" )\n", prefix, dn, 0 ); + dn = pdn; + tmp = pdn; + key.size = strlen( dn ) + 2; - if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT )) - == NULL ) { - Debug( LDAP_DEBUG_ANY, "<= dn2idl could not open dn2id%s\n", - LDBM_SUFFIX, 0, 0 ); - return NULL; + } else if ( rc == 0 ) { + if( in != dn ) { + *matchedDN = (char *) dn; + } + Debug( LDAP_DEBUG_TRACE, + "<= bdb_dn2id_matched: id=%ld: %s\n", + id, dn, 0 ); + break; + + } else { + ch_free( tmp ); + break; + } } - ldbm_datum_init( key ); - - key.dsize = strlen( dn ) + 2; - key.dptr = ch_malloc( key.dsize ); - sprintf( key.dptr, "%c%s", prefix, dn ); - - idl = idl_fetch( be, db, key ); - - ldbm_cache_close( be, db ); - - free( key.dptr ); - - return( idl ); + ch_free( key.data ); + return rc; } - -/* - * dn2entry - look up dn in the cache/indexes and return the corresponding - * entry. - */ - -Entry * -dn2entry_rw( +int +bdb_dn2id_children( Backend *be, - const char *dn, - Entry **matched, - int rw -) + DB_TXN *txn, + const char *dn ) { + int rc; + DBT key, data; + struct bdb_info *bdb = (struct bdb_info *) be->be_private; + DB *db = bdb->bi_dn2id->bdi_db; ID id; - Entry *e = NULL; - char *pdn; - - Debug(LDAP_DEBUG_TRACE, "dn2entry_%s: dn: \"%s\"\n", - rw ? "w" : "r", dn, 0); - if( matched != NULL ) { - /* caller cares about match */ - *matched = NULL; - } + Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_children( %s )\n", + dn, 0, 0 ); - if ( (id = dn2id( be, dn )) != NOID && - (e = id2entry_rw( be, id, rw )) != NULL ) - { - return( e ); - } + DBTzero( &key ); + key.size = strlen( dn ) + 2; + key.data = ch_malloc( key.size ); + ((char *)key.data)[0] = DN_ONE_PREFIX; + AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 ); - if ( id != NOID ) { - Debug(LDAP_DEBUG_ANY, - "dn2entry_%s: no entry for valid id (%ld), dn \"%s\"\n", - rw ? "w" : "r", id, dn); - /* must have been deleted from underneath us */ - /* treat as if NOID was found */ - } + /* we actually could do a empty get... */ + DBTzero( &data ); + data.data = &id; + data.ulen = sizeof(id); + data.flags = DB_DBT_USERMEM; + data.doff = 0; + data.dlen = sizeof(id); - /* caller doesn't care about match */ - if( matched == NULL ) return NULL; + rc = db->get( db, txn, &key, &data, 0 ); - /* entry does not exist - see how much of the dn does exist */ - /* dn_parent checks returns NULL if dn is suffix */ - if ( (pdn = dn_parent( be, dn )) != NULL ) { - /* get entry with reader lock */ - if ( (e = dn2entry_r( be, pdn, matched )) != NULL ) { - *matched = e; - } - free( pdn ); - } + Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_children( %s ): %s (%d)\n", + dn, + rc == 0 ? "yes" : ( rc == DB_NOTFOUND ? "no" : + db_strerror(rc) ), rc ); - return NULL; + return rc; } -#endif \ No newline at end of file diff --git a/servers/slapd/back-bdb/external.h b/servers/slapd/back-bdb/external.h index fbbc8806bb..1adee5d1a5 100644 --- a/servers/slapd/back-bdb/external.h +++ b/servers/slapd/back-bdb/external.h @@ -11,6 +11,46 @@ LDAP_BEGIN_DECL extern int bdb_initialize LDAP_P(( BackendInfo *bi )); +extern int bdb_add LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, Entry *e )); + +extern int bdb_bind LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, + const char *dn, const char *ndn, int method, + struct berval *cred, char** edn )); + +extern int bdb_compare LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, + const char *dn, const char *ndn, + AttributeAssertion *ava )); + +extern int bdb_delete LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, + const char *dn, const char *ndn )); + +extern int bdb_abandon LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, ber_int_t msgid )); + +extern int bdb_modify LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, + const char *dn, const char *ndn, Modifications *ml )); + +extern int bdb_modrdn LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, + const char *dn, const char *ndn, + const char* newrdn, int deleteoldrdn, + const char *newSuperior )); + +extern int bdb_search LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op, + const char *base, const char *nbase, + int scope, int deref, int sizelimit, int timelimit, + Filter *filter, const char *filterstr, + char **attrs, int attrsonly )); + +extern int bdb_unbind LDAP_P(( BackendDB *bd, + Connection *conn, Operation *op )); + LDAP_END_DECL #endif /* _BDB_EXTERNAL_H */ diff --git a/servers/slapd/back-bdb/id2entry.c b/servers/slapd/back-bdb/id2entry.c index f613b910a3..2725c4e557 100644 --- a/servers/slapd/back-bdb/id2entry.c +++ b/servers/slapd/back-bdb/id2entry.c @@ -18,6 +18,7 @@ int bdb_id2entry_add( Entry *e ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; + DB *db = bdb->bi_id2entry->bdi_db; DBT key, data; struct berval *bv; int rc; @@ -34,9 +35,71 @@ int bdb_id2entry_add( DBTzero( &data ); bv2DBT( bv, &data ); - rc = bdb->bi_id2entry->bdi_db->put( bdb->bi_id2entry->bdi_db, - tid, &key, &data, DB_NOOVERWRITE ); + rc = db->put( db, tid, &key, &data, DB_NOOVERWRITE ); ber_bvfree( bv ); return rc; } + +int bdb_id2entry( + Backend *be, + DB_TXN *tid, + ID id, + Entry **e ) +{ + struct bdb_info *bdb = (struct bdb_info *) be->be_private; + DB *db = bdb->bi_id2entry->bdi_db; + DBT key, data; + struct berval bv; + int rc; + + DBTzero( &key ); + key.data = (char *) &id; + key.size = sizeof(ID); + + DBTzero( &data ); + data.flags = DB_DBT_MALLOC; + + /* fetch it */ + rc = db->get( db, tid, &key, &data, 0 ); + + if( rc != 0 ) { + return rc; + } + + DBT2bv( &data, &bv ); + + rc = entry_decode( &bv, e ); + + ch_free( data.data ); + return rc; +} + +int bdb_id2entry_delete( + Backend *be, + DB_TXN *tid, + ID id ) +{ + struct bdb_info *bdb = (struct bdb_info *) be->be_private; + DB *db = bdb->bi_id2entry->bdi_db; + DBT key; + struct berval *bv; + int rc; + + DBTzero( &key ); + key.data = (char *) &id; + key.size = sizeof(ID); + + rc = db->del( db, tid, &key, 0 ); + + ber_bvfree( bv ); + return rc; +} + +int bdb_entry_return( + Backend *be, + Entry *e ) +{ + entry_free( e ); + return 0; +} diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index 024660ac9f..c58987ebe0 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -11,6 +11,7 @@ #include #include "back-bdb.h" +#include "external.h" static struct bdbi_database { char *file; @@ -273,15 +274,15 @@ bdb_initialize( bi->bi_db_close = bdb_db_close; bi->bi_db_destroy = bdb_db_destroy; + bi->bi_op_add = bdb_add; + bi->bi_op_compare = bdb_compare; + bi->bi_op_delete = bdb_delete; #if 0 bi->bi_op_bind = bi_back_bind; bi->bi_op_unbind = bi_back_unbind; bi->bi_op_search = bi_back_search; - bi->bi_op_compare = bi_back_compare; bi->bi_op_modify = bi_back_modify; bi->bi_op_modrdn = bi_back_modrdn; - bi->bi_op_add = bi_back_add; - bi->bi_op_delete = bi_back_delete; bi->bi_op_abandon = bi_back_abandon; bi->bi_extended = bi_back_extended; diff --git a/servers/slapd/back-bdb/proto-bdb.h b/servers/slapd/back-bdb/proto-bdb.h index 780b275b87..e7a869ba4b 100644 --- a/servers/slapd/back-bdb/proto-bdb.h +++ b/servers/slapd/back-bdb/proto-bdb.h @@ -25,9 +25,34 @@ Entry *bdb_deref_internal_r LDAP_P(( #define deref_dn_r( be, dn, err, matched, text ) \ bdb_deref_internal_r( be, NULL, dn, err, matched, text) +/* + * dn2entry.c + */ +int bdb_dn2entry LDAP_P(( Backend *be, DB_TXN *tid, + const char *dn, Entry **e, Entry **matched, int flags )); + +#define dn2entry_r(be, tid, dn, p, m) \ + bdb_dn2entry((be), (tid), (dn), (p), (m), 0 ) + +#define dn2entry_w(be, tid, dn, p, m) \ + bdb_dn2entry((be), (tid), (dn), (p), (m), DB_RMW ) + /* * dn2id.c */ +int bdb_dn2id( + BackendDB *be, + DB_TXN *tid, + const char *dn, + ID *id ); + +int bdb_dn2id_matched( + BackendDB *be, + DB_TXN *tid, + const char *dn, + ID *id, + char **matchedDN ); + int bdb_dn2id_add( BackendDB *be, DB_TXN *tid, @@ -45,12 +70,6 @@ int bdb_dn2id_children( DB_TXN *tid, const char *dn ); -int bdb_dn2entry_rw LDAP_P(( Backend *be, DB_TXN *tid, - const char *dn, Entry **e, Entry **matched, int rw )); - -#define dn2entry_r(be, tid, dn, p, m) bdb_dn2entry_rw((be), (tid), (dn), (p), (m), 0) -#define dn2entry_w(be, tid, dn, p, m) bdb_dn2entry_rw((be), (tid), (dn), (p), (m), 1) - /* * entry.c */ @@ -74,6 +93,12 @@ int bdb_id2entry_delete( DB_TXN *tid, ID id ); +int bdb_id2entry( + Backend *be, + DB_TXN *tid, + ID id, + Entry **e ); + /* * idl.c */