static unsigned nhmax = HOLE_SIZE;
static unsigned nholes;
-Avlnode *index_attrs, index_dummy;
+static Avlnode *index_attrs, index_dummy;
int bdb_tool_entry_open(
BackendDB *be, int mode )
{
Operation op = {0};
Opheader ohdr = {0};
- EntryInfo ei = {0};
+ EntryInfo *ei = NULL;
+ int rc;
+
+ if ( BER_BVISEMPTY(dn) )
+ return 0;
op.o_hdr = &ohdr;
op.o_bd = be;
op.o_tmpmemctx = NULL;
op.o_tmpmfuncs = &ch_mfuncs;
- ei.bei_id = NOID;
-
- bdb_dn2id( &op, NULL, dn, &ei );
+ rc = bdb_cache_find_ndn( &op, NULL, dn, &ei );
+ if ( ei ) bdb_cache_entryinfo_unlock( ei );
+ if ( rc == DB_NOTFOUND )
+ return NOID;
- return ei.bei_id;
+ return ei->bei_id;
}
int bdb_tool_id2entry_get(
Entry **e
)
{
- return bdb_id2entry( be, NULL, id, e );
+ int rc = bdb_id2entry( be, NULL, id, e );
+
+ if ( rc == DB_NOTFOUND && id == 0 ) {
+ Entry *dummy = ch_calloc( 1, sizeof(Entry) );
+ struct berval gluebv = BER_BVC("glue");
+ dummy->e_name.bv_val = ch_strdup( "" );
+ dummy->e_nname.bv_val = ch_strdup( "" );
+ attr_merge_one( dummy, slap_schema.si_ad_objectClass, &gluebv, NULL );
+ attr_merge_one( dummy, slap_schema.si_ad_structuralObjectClass,
+ &gluebv, NULL );
+ *e = dummy;
+ rc = LDAP_SUCCESS;
+ }
+ return rc;
}
Entry* bdb_tool_entry_get( BackendDB *be, ID id )
{
int rc;
Entry *e = NULL;
+#ifndef BDB_HIER
struct berval bv;
+#endif
assert( be != NULL );
assert( slapMode & SLAP_TOOL_MODE );
EntryInfo *ei = NULL, eidummy;
int rc;
- if (ndn.bv_len == 0) return 0;
+ if (ndn.bv_len == 0) {
+ e->e_id = 0;
+ return 0;
+ }
rc = bdb_cache_find_ndn( op, tid, &ndn, &ei );
if ( ei ) bdb_cache_entryinfo_unlock( ei );
if ( rc ) {
return rc;
}
+ /* If parent didn't exist, it was created just now
+ * and its ID is now in e->e_id. Make sure the current
+ * entry gets added under the new parent ID.
+ */
if ( eid != e->e_id ) {
eidummy.bei_id = e->e_id;
ei = &eidummy;
assert( be != NULL );
assert( slapMode & SLAP_TOOL_MODE );
- assert( text );
- assert( text->bv_val );
+ assert( text != NULL );
+ assert( text->bv_val != NULL );
assert( text->bv_val[0] == '\0' ); /* overconservative? */
Debug( LDAP_DEBUG_TRACE, "=> " LDAP_XSTRING(bdb_tool_entry_put)
assert( be != NULL );
assert( slapMode & SLAP_TOOL_MODE );
- assert( text );
- assert( text->bv_val );
+ assert( text != NULL );
+ assert( text->bv_val != NULL );
assert( text->bv_val[0] == '\0' ); /* overconservative? */
assert ( e->e_id != NOID );
- assert ( e->e_id != 0 );
Debug( LDAP_DEBUG_TRACE,
"=> " LDAP_XSTRING(bdb_tool_entry_modify) "( %ld, \"%s\" )\n",
goto done;
}
+#if 0
+ /* FIXME: this is bogus, we don't have the old values to delete
+ * from the index because the given entry has already been modified.
+ */
rc = bdb_index_entry_del( &op, tid, e );
if( rc != 0 ) {
snprintf( text->bv_val, text->bv_len,
text->bv_val, 0, 0 );
goto done;
}
+#endif
rc = bdb_index_entry_add( &op, tid, e );
if( rc != 0 ) {