From 50e151684755cd47eaa4d2c82d8fc5c6d867d46b Mon Sep 17 00:00:00 2001
From: Rich Megginson <rmeggins@redhat.com>
Date: Fri, 27 Jan 2012 17:09:06 -0700
Subject: [PATCH] Ticket #273 - ruv tombstone searches don't work after reindex entryrdn

https://fedorahosted.org/389/ticket/273
Resolves: Ticket #273
Bug Description: ruv tombstone searches don't work after reindex entryrdn
Reviewed by: ???
Branch: master
Fix Description: When indexing entryrdn, if there is no parentid in the
entry, assume the parent is the suffix entry.  It appears the only case
where there was no parentid in the entry is the ruv tombstone case.
Bump the database rdn-format version to 2.
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: no
---
 ldap/admin/src/scripts/91subtreereindex.pl |   14 ++++++++++----
 ldap/servers/slapd/back-ldbm/back-ldbm.h   |    2 +-
 ldap/servers/slapd/back-ldbm/ldif2ldbm.c   |   21 ++++++++++++++++++---
 3 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/ldap/admin/src/scripts/91subtreereindex.pl b/ldap/admin/src/scripts/91subtreereindex.pl
index f5aee9f..c512435 100644
--- a/ldap/admin/src/scripts/91subtreereindex.pl
+++ b/ldap/admin/src/scripts/91subtreereindex.pl
@@ -51,11 +51,14 @@ sub runinst {
                 if ($_ =~ /rdn-format-1/) {
                     $is_rdn_format = 2;
                 }
+                if ($_ =~ /rdn-format-2/) {
+                    $is_rdn_format = 3;
+                }
             }
         }
         close DBVERSION;
 
-        if (2 == $is_rdn_format) {
+        if (3 == $is_rdn_format) {
             return (); # DB already has the new rdn format.
         }
 
@@ -95,11 +98,14 @@ sub runinst {
                     if ($_ =~ /rdn-format-1/) {
                         $is_rdn_format = 2;
                     }
+                    if ($_ =~ /rdn-format-2/) {
+                        $is_rdn_format = 3;
+                    }
                 }
             }
             close DBVERSION;
     
-            if (2 == $is_rdn_format) {
+            if (3 == $is_rdn_format) {
                 # DB already has the new rdn format.
                 goto NEXT;
             }
@@ -117,7 +123,7 @@ sub runinst {
                 if (!open(DBVERSION, "> $dbversion1")) {
                     push @errs, ['error_opening_file', $dbversion1, $!];
                 } else {
-                    $versionstr =~ y/rdn\-format/rdn\-format\-1/;
+                    $versionstr =~ y/rdn\-format/rdn\-format\-2/;
                     print DBVERSION $versionstr . "\n";
                     close DBVERSION;
                 }
@@ -131,7 +137,7 @@ NEXT:
     if (!open(DBVERSION, "$dbversion0")) {
         push @errs, ['error_opening_file', $dbversion0, $!];
     } else {
-        $dbversionstr = y/rdn\-format/rdn\-format\-1/;
+        $dbversionstr = y/rdn\-format/rdn\-format\-2/;
         print DBVERSION $versionstr . "\n";
         close DBVERSION;
     }
diff --git a/ldap/servers/slapd/back-ldbm/back-ldbm.h b/ldap/servers/slapd/back-ldbm/back-ldbm.h
index 3a92f59..f11ec82 100644
--- a/ldap/servers/slapd/back-ldbm/back-ldbm.h
+++ b/ldap/servers/slapd/back-ldbm/back-ldbm.h
@@ -167,7 +167,7 @@ typedef unsigned short u_int16_t;
 #define BDB_BACKEND     "libback-ldbm" /* This backend plugin */
 #define BDB_NEWIDL      "newidl"       /* new idl format */
 #define BDB_RDNFORMAT   "rdn-format"   /* Subtree rename enabled */
-#define BDB_RDNFORMAT_VERSION   "1"    /* rdn-format version (by default, 0) */
+#define BDB_RDNFORMAT_VERSION   "2"    /* rdn-format version (by default, 0) */
 #define BDB_DNFORMAT    "dn-4514"      /* DN format RFC 4514 compliant */
 
 #define DBVERSION_NEWIDL      0x1
diff --git a/ldap/servers/slapd/back-ldbm/ldif2ldbm.c b/ldap/servers/slapd/back-ldbm/ldif2ldbm.c
index b430f9a..b4bdc52 100644
--- a/ldap/servers/slapd/back-ldbm/ldif2ldbm.c
+++ b/ldap/servers/slapd/back-ldbm/ldif2ldbm.c
@@ -1678,6 +1678,7 @@ ldbm_back_ldbm2index(Slapi_PBlock *pb)
     int              index_ext = 0;
     struct vlvIndex  *vlvip = NULL;
     back_txn         txn;
+    ID               suffixid = NOID; /* holds the id of the suffix entry */
 
     LDAPDebug( LDAP_DEBUG_TRACE, "=> ldbm_back_ldbm2index\n", 0, 0, 0 );
     if ( g_get_shutdown() || c_get_shutdown() ) {
@@ -2021,9 +2022,23 @@ ldbm_back_ldbm2index(Slapi_PBlock *pb)
                 /* get a parent pid */
                 rc = get_value_from_string((const char *)data.dptr,
                                                    LDBM_PARENTID_STR, &pid_str);
-                if (rc) {
-                    rc = 0; /* assume this is a suffix */
-                } else {
+                if (rc || !pid_str) {
+                    /* see if this is a suffix or some entry without a parent id
+                       e.g. a tombstone entry */
+                    Slapi_DN sufdn;
+
+                    slapi_sdn_init_dn_byref(&sufdn, rdn);
+                    if (slapi_be_issuffix(be, &sufdn)) {
+                        rc = 0; /* is a suffix */
+                        suffixid = temp_id; /* this is the ID of a suffix entry */
+                    } else {
+                        /* assume the parent entry is the suffix entry for this backend
+                           set pid to the id of that entry */
+                        pid = suffixid;
+                    }
+                    slapi_sdn_done(&sufdn);
+                }
+                if (pid_str) {
                     pid = (ID)strtol(pid_str, (char **)NULL, 10);
                     slapi_ch_free_string(&pid_str);
                     /* if pid is larger than the current pid temp_id,
-- 
1.7.1

