]> git.sur5r.net Git - openldap/commitdiff
More for #4884, helper for #5173
authorHoward Chu <hyc@openldap.org>
Mon, 8 Oct 2007 12:31:24 +0000 (12:31 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 8 Oct 2007 12:31:24 +0000 (12:31 +0000)
servers/slapd/bconfig.c

index 7576a2c2f75e3bccbefd1f13cfafeb86c14ca823..0cf122727fbe5758de85612820d2b0f85ce65f5c 100644 (file)
@@ -4187,11 +4187,26 @@ config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs,
                rc = LDAP_SUCCESS;
        }
 
+       colst = count_ocs( oc_at, &nocs );
+
        /* Check whether the Add is allowed by its parent, and do
         * any necessary arg setup
         */
        if ( last ) {
                rc = config_add_oc( &coptr, last, e, ca );
+               if ( rc == LDAP_CONSTRAINT_VIOLATION ) {
+                       for ( i = 0; i<nocs; i++ ) {
+                               /* Already checked these */
+                               if ( colst[i]->co_oc->soc_kind == LDAP_SCHEMA_STRUCTURAL )
+                                       continue;
+                               if ( colst[i]->co_ldadd &&
+                                       ( rc = colst[i]->co_ldadd( last, e, ca ))
+                                               != LDAP_CONSTRAINT_VIOLATION ) {
+                                       coptr = colst[i];
+                                       break;
+                               }
+                       }
+               }
                if ( rc == LDAP_CONSTRAINT_VIOLATION ) {
                        Debug( LDAP_DEBUG_TRACE, "%s: config_add_internal: "
                                "DN=\"%s\" no structural objectClass add function\n",
@@ -4200,8 +4215,6 @@ config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs,
                }
        }
 
-       colst = count_ocs( oc_at, &nocs );
-
        /* Add the entry but don't parse it, we already have its contents */
        if ( rc == LDAP_COMPARE_TRUE ) {
                rc = LDAP_SUCCESS;
@@ -4300,6 +4313,8 @@ ok:
                                rc = ca->bi->bi_db_open( ca->be, &ca->reply );
                                ca->be->bd_info = bi_orig;
                        }
+               } else if ( ca->cleanup ) {
+                       rc = ca->cleanup( ca );
                }
                if ( rc ) {
                        if (ca->cr_msg[0] == '\0')