/* id2entry.c - routines to deal with the id2entry database */
/* $OpenLDAP$ */
-/*
- * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 2000-2004 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
+ * <http://www.OpenLDAP.org/license.html>.
*/
#include "portable.h"
SLAP_TRUNCATE_MODE, SLAP_UNDEFINED_MODE */
if ( slapMode == SLAP_SERVER_MODE ) {
+ /* If not in our cache, just free it */
+ if ( !e->e_private ) {
+ return bdb_entry_return( e );
+ }
/* free entry and reader or writer lock */
if ( o ) {
boi = (struct bdb_op_info *)o->o_private;
bdb_unlocked_cache_return_entry_rw( &bdb->bi_cache, e, rw );
} else {
bdb_cache_return_entry_rw( bdb->bi_dbenv, &bdb->bi_cache, e, rw, &boi->boi_lock );
- sl_free( boi, o->o_tmpmemctx );
+ o->o_tmpfree( boi, o->o_tmpmemctx );
o->o_private = NULL;
}
} else {
Entry *e = NULL;
EntryInfo *ei;
int rc;
- const char *at_name = at->ad_cname.bv_val;
+ const char *at_name = at ? at->ad_cname.bv_val : "(null)";
u_int32_t locker = 0;
DB_LOCK lock;
#endif
if( op ) boi = (struct bdb_op_info *) op->o_private;
- if( boi != NULL && op->o_bd == boi->boi_bdb ) {
+ if( boi != NULL && op->o_bd->be_private == boi->boi_bdb->be_private ) {
txn = boi->boi_txn;
locker = boi->boi_locker;
}
dn2entry_retry:
/* can we find entry */
- rc = bdb_dn2entry( op->o_bd, txn, ndn, &ei, 0, locker, &lock, op->o_tmpmemctx );
+ rc = bdb_dn2entry( op, txn, ndn, &ei, 0, locker, &lock );
switch( rc ) {
case DB_NOTFOUND:
case 0:
if( rc != LDAP_SUCCESS ) {
/* free entry */
bdb_cache_return_entry_rw(bdb->bi_dbenv, &bdb->bi_cache, e, rw, &lock);
+
} else {
- *ent = e;
- /* big drag. we need a place to store a read lock so we can
- * release it later??
- */
- if ( op && !boi ) {
- boi = sl_calloc(1,sizeof(struct bdb_op_info),op->o_tmpmemctx);
- boi->boi_lock = lock;
- op->o_private = boi;
+ if ( slapMode == SLAP_SERVER_MODE ) {
+ *ent = e;
+ /* big drag. we need a place to store a read lock so we can
+ * release it later??
+ */
+ if ( op && !boi ) {
+ boi = op->o_tmpcalloc(1,sizeof(struct bdb_op_info),op->o_tmpmemctx);
+ boi->boi_lock = lock;
+ op->o_private = boi;
+ }
+
+ } else {
+ *ent = entry_dup( e );
+ bdb_cache_return_entry_rw(bdb->bi_dbenv, &bdb->bi_cache, e, rw, &lock);
}
}