X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Fid2children.c;h=69a5d7c58978bda4b3a2f67763c40546ac12a2e7;hb=ab620c46541dd9b8306008a170cc5a5be0f12eb2;hp=3b2c55d202170c4f13ef836525b711037b752502;hpb=42e0d83cb3a1a1c5b25183f1ab74ce7edbe25de7;p=openldap diff --git a/servers/slapd/back-ldbm/id2children.c b/servers/slapd/back-ldbm/id2children.c index 3b2c55d202..69a5d7c589 100644 --- a/servers/slapd/back-ldbm/id2children.c +++ b/servers/slapd/back-ldbm/id2children.c @@ -1,15 +1,15 @@ /* id2children.c - routines to deal with the id2children index */ +#include "portable.h" + #include -#include -#include +#include + +#include + #include "slap.h" #include "back-ldbm.h" -struct dbcache *ldbm_cache_open(); -extern Datum ldbm_cache_fetch(); -IDList *idl_fetch(); - int id2children_add( Backend *be, @@ -18,13 +18,15 @@ id2children_add( ) { struct dbcache *db; - Datum key, data; + Datum key; int len, rc; - IDList *idl; + ID_BLOCK *idl; char buf[20]; - Debug( LDAP_DEBUG_TRACE, "=> id2children_add( %d, %d )\n", p ? p->e_id - : 0, e->e_id, 0 ); + ldbm_datum_init( key ); + + Debug( LDAP_DEBUG_TRACE, "=> id2children_add( %lu, %lu )\n", + p ? p->e_id : 0, e->e_id, 0 ); if ( (db = ldbm_cache_open( be, "id2children", LDBM_SUFFIX, LDBM_WRCREAT )) == NULL ) { @@ -34,7 +36,7 @@ id2children_add( return( -1 ); } - sprintf( buf, "%c%d", EQ_PREFIX, p ? p->e_id : 0 ); + sprintf( buf, "%c%ld", EQ_PREFIX, p ? p->e_id : 0 ); key.dptr = buf; key.dsize = strlen( buf ) + 1; @@ -51,6 +53,49 @@ id2children_add( return( 0 ); } + +int +id2children_remove( + Backend *be, + Entry *p, + Entry *e +) +{ + struct dbcache *db; + Datum key; + int len, rc; + ID_BLOCK *idl; + char buf[20]; + + Debug( LDAP_DEBUG_TRACE, "=> id2children_remove( %lu, %lu )\n", p ? p->e_id + : 0, e->e_id, 0 ); + + if ( (db = ldbm_cache_open( be, "id2children", LDBM_SUFFIX, + LDBM_WRCREAT )) == NULL ) { + Debug( LDAP_DEBUG_ANY, + "<= id2children_remove -1 could not open \"id2children%s\"\n", + LDBM_SUFFIX, 0, 0 ); + return( -1 ); + } + + ldbm_datum_init( key ); + sprintf( buf, "%c%ld", EQ_PREFIX, p ? p->e_id : 0 ); + key.dptr = buf; + key.dsize = strlen( buf ) + 1; + + if ( idl_delete_key( be, db, key, e->e_id ) != 0 ) { + Debug( LDAP_DEBUG_TRACE, "<= id2children_remove -1 (idl_delete)\n", + 0, 0, 0 ); + ldbm_cache_close( be, db ); + return( -1 ); + } + + ldbm_cache_close( be, db ); + + Debug( LDAP_DEBUG_TRACE, "<= id2children_remove 0\n", 0, 0, 0 ); + return( 0 ); +} + int has_children( Backend *be, @@ -59,11 +104,13 @@ has_children( { struct dbcache *db; Datum key; - int rc; - IDList *idl; + int rc = 0; + ID_BLOCK *idl; char buf[20]; - Debug( LDAP_DEBUG_TRACE, "=> has_children( %d )\n", p->e_id , 0, 0 ); + ldbm_datum_init( key ); + + Debug( LDAP_DEBUG_TRACE, "=> has_children( %lu )\n", p->e_id , 0, 0 ); if ( (db = ldbm_cache_open( be, "id2children", LDBM_SUFFIX, LDBM_WRCREAT )) == NULL ) { @@ -73,16 +120,20 @@ has_children( return( 0 ); } - sprintf( buf, "%c%d", EQ_PREFIX, p->e_id ); + sprintf( buf, "%c%ld", EQ_PREFIX, p->e_id ); key.dptr = buf; key.dsize = strlen( buf ) + 1; idl = idl_fetch( be, db, key ); ldbm_cache_close( be, db ); - rc = idl ? 1 : 0; - idl_free( idl ); - Debug( LDAP_DEBUG_TRACE, "<= has_children %d\n", rc, 0, 0 ); + if( idl != NULL ) { + idl_free( idl ); + rc = 1; + } + + Debug( LDAP_DEBUG_TRACE, "<= has_children( %lu ): %s\n", + p->e_id, rc ? "yes" : "no", 0 ); return( rc ); }