s4-ldb: fixed ldbdel with -r (recursive deletion)
authorAndrew Tridgell <tridge@samba.org>
Tue, 8 Dec 2009 03:40:20 +0000 (14:40 +1100)
committerAndrew Tridgell <tridge@samba.org>
Tue, 8 Dec 2009 03:43:50 +0000 (14:43 +1100)
We need to delete the deepest DNs first

source4/lib/ldb/tools/ldbdel.c

index ddf168d5746321bf872843a59bf5bb47d499cd9d..5740f22503afecb1bab536e5947a9b26729afa27 100644 (file)
 #include "ldb.h"
 #include "tools/cmdline.h"
 
+static int dn_cmp(const void *p1, const void *p2)
+{
+       const struct ldb_message *msg1, *msg2;
+       msg1 = *(const struct ldb_message * const *)p1;
+       msg2 = *(const struct ldb_message * const *)p2;
+       return ldb_dn_compare(msg1->dn, msg2->dn);
+}
+
 static int ldb_delete_recursive(struct ldb_context *ldb, struct ldb_dn *dn)
 {
        int ret, i, total=0;
@@ -43,9 +51,16 @@ static int ldb_delete_recursive(struct ldb_context *ldb, struct ldb_dn *dn)
        ret = ldb_search(ldb, ldb, &res, dn, LDB_SCOPE_SUBTREE, attrs, "distinguishedName=*");
        if (ret != LDB_SUCCESS) return -1;
 
+       /* sort the DNs, deepest first */
+       qsort(res->msgs, res->count, sizeof(res->msgs[0]), dn_cmp);
+
        for (i = 0; i < res->count; i++) {
                if (ldb_delete(ldb, res->msgs[i]->dn) == 0) {
                        total++;
+               } else {
+                       printf("Failed to delete '%s' - %s\n",
+                              ldb_dn_get_linearized(res->msgs[i]->dn),
+                              ldb_errstring(ldb));
                }
        }