]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/add.c
ITS#2864 don't use sl_mark/release.
[openldap] / servers / slapd / add.c
index 165fd576de5e84574aa7d7e42f35309cd4216e9e..4058b43ebab4471bbaf0858f640a0610683b6df8 100644 (file)
@@ -1,10 +1,18 @@
 /* $OpenLDAP$ */
-/*
- * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2003 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
  */
-/*
- * Copyright (c) 1995 Regents of the University of Michigan.
+/* Portions Copyright (c) 1995 Regents of the University of Michigan.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
@@ -231,7 +239,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 +251,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 ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ) &&
+                       ( !op->o_bd->be_update_ndn.bv_len || repl_user ))
+#else
+               if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ))
 #endif
                {
                        int update = op->o_bd->be_update_ndn.bv_len;
@@ -292,10 +298,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 +319,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 +327,25 @@ 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 ( !LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
+                               syncinfo_t *si;
+                               LDAP_STAILQ_FOREACH( si, &op->o_bd->be_syncinfo, si_next ) {
+                                       struct berval tmpbv;
+                                       ber_dupbv( &tmpbv, &si->si_provideruri_bv[0] );
+                                       ber_bvarray_add( &defref, &tmpbv );
+                               }
+                       } 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 +366,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 +385,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 +421,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 );
@@ -579,15 +588,15 @@ int
 slap_entry2mods(
        Entry *e,
        Modifications **mods,
-       const char **text
-)
+       const char **text,
+       char *textbuf, size_t textlen )
 {
        Modifications   *modhead = NULL;
        Modifications   *mod;
        Modifications   **modtail = &modhead;
        Attribute               *a_new;
        AttributeDescription    *a_new_desc;
-       int                             i, count, rc;
+       int                             i, count;
 
        a_new = e->e_attrs;
 
@@ -595,35 +604,29 @@ slap_entry2mods(
                a_new_desc = a_new->a_desc;
                mod = (Modifications *) malloc( sizeof( Modifications ));
                
-               if ( a_new_desc != slap_schema.si_ad_queryid )
-                       mod->sml_op = LDAP_MOD_REPLACE;
-               else
-                       mod->sml_op = LDAP_MOD_ADD;
+               mod->sml_op = LDAP_MOD_REPLACE;
 
-               ber_dupbv( &mod->sml_type, &a_new_desc->ad_cname );
+               mod->sml_type = a_new_desc->ad_cname;
 
                for ( count = 0; a_new->a_vals[count].bv_val; count++ );
 
                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 +634,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;
 }