]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/add.c
Berkeley DB 4.2 support (DB 4.2 required by default)
[openldap] / servers / slapd / add.c
index 165fd576de5e84574aa7d7e42f35309cd4216e9e..323fd00bdc989e18b25011e0e0d33fe5f0ce074e 100644 (file)
@@ -231,7 +231,7 @@ do_add( Operation *op, SlapReply *rs )
        }
 
 #ifdef LDAP_SLAPI
-       initAddPlugin( op, &dn, e, manageDSAit );
+       if ( op->o_pb ) initAddPlugin( op, &dn, e, manageDSAit );
 #endif /* LDAP_SLAPI */
 
        /*
@@ -243,13 +243,11 @@ do_add( Operation *op, SlapReply *rs )
        if ( op->o_bd->be_add ) {
                /* do the update here */
                int repl_user = be_isupdate(op->o_bd, &op->o_ndn );
-#if defined(LDAP_SYNCREPL) && !defined(SLAPD_MULTIMASTER)
-               if ( !op->o_bd->syncinfo &&
-                                               ( !op->o_bd->be_update_ndn.bv_len || repl_user ))
-#elif defined(LDAP_SYNCREPL) && defined(SLAPD_MULTIMASTER)
-               if ( !op->o_bd->syncinfo )      /* LDAP_SYNCREPL overrides MM */
-#elif !defined(LDAP_SYNCREPL) && !defined(SLAPD_MULTIMASTER)
-               if ( !op->o_bd->be_update_ndn.bv_len || repl_user )
+#ifndef SLAPD_MULTIMASTER
+               if ( !op->o_bd->be_syncinfo &&
+                       ( !op->o_bd->be_update_ndn.bv_len || repl_user ))
+#else
+               if ( !op->o_bd->be_syncinfo )
 #endif
                {
                        int update = op->o_bd->be_update_ndn.bv_len;
@@ -292,10 +290,12 @@ do_add( Operation *op, SlapReply *rs )
                         * Call the preoperation plugin here, because the entry
                         * will actually contain something.
                         */
-                       rs->sr_err = doPreAddPluginFNs( op );
-                       if ( rs->sr_err != LDAP_SUCCESS ) {
-                               /* plugin will have sent result */
-                               goto done;
+                       if ( op->o_pb ) {
+                               rs->sr_err = doPreAddPluginFNs( op );
+                               if ( rs->sr_err != LDAP_SUCCESS ) {
+                                       /* plugin will have sent result */
+                                       goto done;
+                               }
                        }
 #endif /* LDAP_SLAPI */
 
@@ -311,7 +311,7 @@ do_add( Operation *op, SlapReply *rs )
                                e = NULL;
                        }
 
-#if defined(LDAP_SYNCREPL) || !defined(SLAPD_MULTIMASTER)
+#ifndef SLAPD_MULTIMASTER
                } else {
                        BerVarray defref = NULL;
 #ifdef LDAP_SLAPI
@@ -319,21 +319,20 @@ do_add( Operation *op, SlapReply *rs )
                         * SLAPI_ADD_ENTRY will be empty, but this may be acceptable
                         * on replicas (for now, it involves the minimum code intrusion).
                         */
-                       rs->sr_err = doPreAddPluginFNs( op );
-                       if ( rs->sr_err != LDAP_SUCCESS ) {
-                               /* plugin will have sent result */
-                               goto done;
+                       if ( op->o_pb ) {
+                               rs->sr_err = doPreAddPluginFNs( op );
+                               if ( rs->sr_err != LDAP_SUCCESS ) {
+                                       /* plugin will have sent result */
+                                       goto done;
+                               }
                        }
 #endif /* LDAP_SLAPI */
 
-#ifdef LDAP_SYNCREPL
-                       if ( op->o_bd->syncinfo ) {
-                               defref = op->o_bd->syncinfo->provideruri_bv;
-                       } else
-#endif
-                       {
+                       if ( op->o_bd->be_syncinfo ) {
+                               defref = op->o_bd->be_syncinfo->si_provideruri_bv;
+                       } else {
                                defref = op->o_bd->be_update_refs
-                                                       ? op->o_bd->be_update_refs : default_referral;
+                                       ? op->o_bd->be_update_refs : default_referral;
                        }
 
                        if ( defref != NULL ) {
@@ -354,10 +353,12 @@ do_add( Operation *op, SlapReply *rs )
                }
        } else {
 #ifdef LDAP_SLAPI
-           rs->sr_err = doPreAddPluginFNs( op );
-           if ( rs->sr_err != LDAP_SUCCESS ) {
-                       /* plugin will have sent result */
-                       goto done;
+               if ( op->o_pb ) {
+                       rs->sr_err = doPreAddPluginFNs( op );
+                       if ( rs->sr_err != LDAP_SUCCESS ) {
+                               /* plugin will have sent result */
+                               goto done;
+                       }
                }
 #endif
 #ifdef NEW_LOGGING
@@ -371,14 +372,12 @@ do_add( Operation *op, SlapReply *rs )
        }
 
 #ifdef LDAP_SLAPI
-       doPostAddPluginFNs( op );
+       if ( op->o_pb ) doPostAddPluginFNs( op );
 #endif /* LDAP_SLAPI */
 
 done:
 
-#ifdef LDAP_SYNC
-       graduate_commit_csn( op );
-#endif
+       slap_graduate_commit_csn( op );
 
        if( modlist != NULL ) {
                slap_mods_free( modlist );
@@ -409,10 +408,7 @@ slap_mods2entry(
        for( ; mods != NULL; mods = mods->sml_next ) {
                Attribute *attr;
 
-#ifdef LDAP_SYNCREPL
-               if ( !repl_user )
-#endif
-               {
+               if ( !repl_user ) {
                        assert( mods->sml_op == LDAP_MOD_ADD );
                }
                assert( mods->sml_desc != NULL );
@@ -607,23 +603,20 @@ slap_entry2mods(
                mod->sml_bvalues = (struct berval*) malloc(
                                (count+1) * sizeof( struct berval) );
 
-               mod->sml_nvalues = (struct berval*) malloc(
+               /* see slap_mods_check() comments...
+                * if a_vals == a_nvals, there is no normalizer.
+                * in this case, mod->sml_nvalues must be left NULL.
+                */
+               if ( a_new->a_vals != a_new->a_nvals ) {
+                       mod->sml_nvalues = (struct berval*) malloc(
                                (count+1) * sizeof( struct berval) );
+               } else {
+                       mod->sml_nvalues = NULL;
+               }
 
                for ( i = 0; i < count; i++ ) {
                        ber_dupbv(mod->sml_bvalues+i, a_new->a_vals+i); 
-                       if ( a_new->a_desc->ad_type->sat_equality &&
-                               a_new->a_desc->ad_type->sat_equality->smr_normalize ) {
-                               rc = a_new->a_desc->ad_type->sat_equality->smr_normalize(
-                                       0,
-                                       a_new->a_desc->ad_type->sat_syntax,
-                                       a_new->a_desc->ad_type->sat_equality,
-                                       a_new->a_vals+i, mod->sml_nvalues+i, NULL );
-                               if (rc) {
-                                       return rc; 
-                               } 
-                       }
-                       else {  
+                       if ( mod->sml_nvalues ) {
                                ber_dupbv( mod->sml_nvalues+i, a_new->a_vals+i ); 
                        } 
                }
@@ -631,18 +624,19 @@ slap_entry2mods(
                mod->sml_bvalues[count].bv_val = 0; 
                mod->sml_bvalues[count].bv_len = 0; 
 
-               mod->sml_nvalues[count].bv_val = 0; 
-               mod->sml_nvalues[count].bv_len = 0; 
+               if ( mod->sml_nvalues ) {
+                       mod->sml_nvalues[count].bv_val = 0; 
+                       mod->sml_nvalues[count].bv_len = 0; 
+               }
 
-               mod->sml_desc = NULL;
-               slap_bv2ad(&mod->sml_type, &mod->sml_desc, text);
+               mod->sml_desc = a_new_desc;
                mod->sml_next =NULL;
                *modtail = mod;
                modtail = &mod->sml_next;
                a_new = a_new->a_next; 
        }
 
-       mods = &modhead;
+       *mods = modhead;
 
        return LDAP_SUCCESS;
 }