From 25c99ee6904138def559d544ff1048bf85a1ec1a Mon Sep 17 00:00:00 2001 From: Ondrej Kuznik Date: Thu, 19 Apr 2012 15:53:49 +0200 Subject: [PATCH] ITS#7256 mplement bi_tool_entry_delete for back-ldif --- servers/slapd/back-ldif/ldif.c | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/servers/slapd/back-ldif/ldif.c b/servers/slapd/back-ldif/ldif.c index f4671a4ac3..71b5865691 100644 --- a/servers/slapd/back-ldif/ldif.c +++ b/servers/slapd/back-ldif/ldif.c @@ -1891,6 +1891,63 @@ ldif_tool_entry_modify( BackendDB *be, Entry *e, struct berval *text ) return NOID; } +static int +ldif_tool_entry_delete( BackendDB *be, ID id, struct berval *text ) +{ + struct ldif_tool *tl = &((struct ldif_info *) be->be_private)->li_tool; + int rc = LDAP_SUCCESS; + const char *errmsg = NULL; + struct berval path; + Entry *e; + Operation op = {0}; + + id--; + if ( id >= tl->ecount || tl->entries[id] == NULL ) + return LDAP_OTHER; + e = tl->entries[id]; + + op.o_bd = be; + ndn2path( &op, &e->e_nname, &path, 0 ); + + ldif2dir_len( path ); + ldif2dir_name( path ); + if ( rmdir( path.bv_val ) < 0 ) { + switch ( errno ) { + case ENOTEMPTY: + rc = LDAP_NOT_ALLOWED_ON_NONLEAF; + break; + case ENOENT: + /* is leaf, go on */ + break; + default: + rc = LDAP_OTHER; + errmsg = "internal error (cannot delete subtree directory)"; + break; + } + } + + if ( rc == LDAP_SUCCESS ) { + dir2ldif_name( path ); + if ( unlink( path.bv_val ) < 0 ) { + rc = LDAP_NO_SUCH_OBJECT; + if ( errno != ENOENT ) { + rc = LDAP_OTHER; + errmsg = "internal error (cannot delete entry file)"; + } + } + } + + SLAP_FREE( path.bv_val ); + entry_free( e ); + tl->entries[id] = NULL; + + if ( errmsg == NULL && rc != LDAP_OTHER ) + errmsg = ldap_err2string( rc ); + if ( errmsg != NULL ) + snprintf( text->bv_val, text->bv_len, "%s", errmsg ); + return rc; +} + /* Setup */ @@ -1990,6 +2047,7 @@ ldif_back_initialize( BackendInfo *bi ) bi->bi_tool_entry_get = ldif_tool_entry_get; bi->bi_tool_entry_put = ldif_tool_entry_put; bi->bi_tool_entry_modify = ldif_tool_entry_modify; + bi->bi_tool_entry_delete = ldif_tool_entry_delete; bi->bi_tool_entry_reindex = 0; bi->bi_tool_sync = 0; -- 2.39.5