rdn.bv_len = ptr - rdn.bv_val;
}
ber_dupbv( &ei->bei_rdn, &rdn );
- pei->bei_ckids--;
- if ( pei->bei_dkids ) {
- pei->bei_dkids--;
- if ( pei->bei_kids < 2 )
- pei->bei_state |= CACHE_ENTRY_NO_KIDS | CACHE_ENTRY_NO_GRANDKIDS;
+
+ /* If new parent, decrement kid counts */
+ if ( ein ) {
+ pei->bei_ckids--;
+ if ( pei->bei_dkids ) {
+ pei->bei_dkids--;
+ if ( pei->bei_kids < 2 )
+ pei->bei_state |= CACHE_ENTRY_NO_KIDS | CACHE_ENTRY_NO_GRANDKIDS;
+ }
}
#endif
ei->bei_parent = ein;
bdb_cache_entryinfo_unlock( pei );
bdb_cache_entryinfo_lock( ein );
- }
- /* parent now has kids */
- if ( ein->bei_state & CACHE_ENTRY_NO_KIDS )
- ein->bei_state ^= CACHE_ENTRY_NO_KIDS;
- /* grandparent has grandkids */
- if ( ein->bei_parent )
- ein->bei_parent->bei_state &= ~CACHE_ENTRY_NO_GRANDKIDS;
+ /* new parent now has kids */
+ if ( ein->bei_state & CACHE_ENTRY_NO_KIDS )
+ ein->bei_state ^= CACHE_ENTRY_NO_KIDS;
+ /* grandparent has grandkids */
+ if ( ein->bei_parent )
+ ein->bei_parent->bei_state &= ~CACHE_ENTRY_NO_GRANDKIDS;
#ifdef BDB_HIER
- /* parent might now have grandkids */
- if ( ein->bei_state & CACHE_ENTRY_NO_GRANDKIDS &&
- !(ei->bei_state & CACHE_ENTRY_NO_KIDS))
- ein->bei_state ^= CACHE_ENTRY_NO_GRANDKIDS;
+ /* parent might now have grandkids */
+ if ( ein->bei_state & CACHE_ENTRY_NO_GRANDKIDS &&
+ !(ei->bei_state & CACHE_ENTRY_NO_KIDS))
+ ein->bei_state ^= CACHE_ENTRY_NO_GRANDKIDS;
+ ein->bei_ckids++;
+ if ( ein->bei_dkids ) ein->bei_dkids++;
+#endif
+ }
+
+#ifdef BDB_HIER
/* Record the generation number of this change */
ldap_pvt_thread_mutex_lock( &bdb->bi_modrdns_mutex );
bdb->bi_modrdns++;
ei->bei_modrdns = bdb->bi_modrdns;
ldap_pvt_thread_mutex_unlock( &bdb->bi_modrdns_mutex );
-
- ein->bei_ckids++;
- if ( ein->bei_dkids ) ein->bei_dkids++;
#endif
+
avl_insert( &ein->bei_kids, ei, bdb_rdn_cmp, avl_dup_error );
bdb_cache_entryinfo_unlock( ein );
return rc;