X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fdn2entry.c;h=6cc9fe2aa4b565913df28a93613fc739259ea138;hb=3bf9998d7885ef6bbc4690d4229e5cb5068a35de;hp=497514113050e57a51ed8ceefc2739dff0c994da;hpb=09a2a8fbcee2406090542e37c5c8246d5d37e1ed;p=openldap diff --git a/servers/slapd/back-bdb/dn2entry.c b/servers/slapd/back-bdb/dn2entry.c index 4975141130..6cc9fe2aa4 100644 --- a/servers/slapd/back-bdb/dn2entry.c +++ b/servers/slapd/back-bdb/dn2entry.c @@ -1,8 +1,17 @@ /* dn2entry.c - routines to deal with the dn2id / id2entry glue */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 2000-2008 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -14,49 +23,62 @@ /* * dn2entry - look up dn in the cache/indexes and return the corresponding - * entry. + * entry. If the requested DN is not found and matched is TRUE, return info + * for the closest ancestor of the DN. Otherwise e is NULL. */ int -bdb_dn2entry_rw( - BackendDB *be, +bdb_dn2entry( + Operation *op, DB_TXN *tid, struct berval *dn, - Entry **e, - Entry **matched, - int flags, - int rw, - u_int32_t locker, + EntryInfo **e, + int matched, + BDB_LOCKER locker, DB_LOCK *lock ) { - int rc; - ID id, id2 = 0; - -#ifdef NEW_LOGGING - LDAP_LOG (( "db2entry", LDAP_LEVEL_ARGS, "bdb_dn2entry_rw(\"%s\")\n", - dn->bv_val )); -#else - Debug(LDAP_DEBUG_TRACE, "bdb_dn2entry_rw(\"%s\")\n", + EntryInfo *ei = NULL; + int rc, rc2; + + Debug(LDAP_DEBUG_TRACE, "bdb_dn2entry(\"%s\")\n", dn->bv_val, 0, 0 ); -#endif *e = NULL; - if( matched != NULL ) { - *matched = NULL; - rc = bdb_dn2id_matched( be, tid, dn, &id, &id2, flags ); - } else { - rc = bdb_dn2id( be, tid, dn, &id, flags ); - } - - if( rc != 0 ) { - return rc; - } - - if( id2 == 0 ) { - rc = bdb_id2entry_rw( be, tid, id, e, rw, locker, lock ); + rc = bdb_cache_find_ndn( op, locker, dn, &ei ); + if ( rc ) { + if ( matched && rc == DB_NOTFOUND ) { + /* Set the return value, whether we have its entry + * or not. + */ + *e = ei; + if ( ei && ei->bei_id ) { + rc2 = bdb_cache_find_id( op, tid, ei->bei_id, + &ei, ID_LOCKED, locker, lock ); + if ( rc2 ) rc = rc2; + } else if ( ei ) { + bdb_cache_entryinfo_unlock( ei ); + memset( lock, 0, sizeof( *lock )); + lock->mode = DB_LOCK_NG; + } + } else if ( ei ) { + bdb_cache_entryinfo_unlock( ei ); + } } else { - rc = bdb_id2entry_r( be, tid, id2, matched, locker, lock ); + rc = bdb_cache_find_id( op, tid, ei->bei_id, &ei, ID_LOCKED, + locker, lock ); + if ( rc == 0 ) { + *e = ei; + } else if ( matched && rc == DB_NOTFOUND ) { + /* always return EntryInfo */ + if ( ei->bei_parent ) { + ei = ei->bei_parent; + rc2 = bdb_cache_find_id( op, tid, ei->bei_id, &ei, 0, + locker, lock ); + if ( rc2 ) rc = rc2; + } + *e = ei; + } } return rc;