/* $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-2004 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
#include "slap.h"
#ifdef LDAP_SLAPI
-#include "slapi.h"
-static void initAddPlugin( Operation *op,
- struct berval *dn, Entry *e, int manageDSAit );
-static int doPreAddPluginFNs( Operation *op );
-static void doPostAddPluginFNs( Operation *op );
+#include "slapi/slapi.h"
+
+static void init_add_pblock( Operation *op, struct berval *dn, Entry *e, int manageDSAit );
+static int call_add_preop_plugins( Operation *op );
+static void call_add_postop_plugins( Operation *op );
#endif /* LDAP_SLAPI */
int
}
#ifdef LDAP_SLAPI
- initAddPlugin( op, &dn, e, manageDSAit );
+ if ( op->o_pb ) init_add_pblock( op, &dn, e, manageDSAit );
#endif /* LDAP_SLAPI */
/*
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;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
+ slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
rs->sr_err = slap_mods_check( modlist, update, &rs->sr_text,
textbuf, textlen, NULL );
* 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 = call_add_preop_plugins( op );
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ /* plugin will have sent result */
+ goto done;
+ }
}
#endif /* LDAP_SLAPI */
op->ora_e = e;
- if ( (op->o_bd->be_add)( op, rs ) == 0 ) {
#ifdef SLAPD_MULTIMASTER
- if ( !repl_user )
+ if ( !repl_user )
#endif
- {
- replog( op );
- }
+ {
+ cb.sc_next = op->o_callback;
+ op->o_callback = &cb;
+ }
+ if ( (op->o_bd->be_add)( op, rs ) == 0 ) {
be_entry_release_w( op, e );
e = NULL;
}
-#if defined(LDAP_SYNCREPL) || !defined(SLAPD_MULTIMASTER)
+#ifndef SLAPD_MULTIMASTER
} else {
BerVarray defref = NULL;
#ifdef LDAP_SLAPI
* 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 = call_add_preop_plugins( 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 ) {
}
} 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 = call_add_preop_plugins( op );
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ /* plugin will have sent result */
+ goto done;
+ }
}
#endif
#ifdef NEW_LOGGING
}
#ifdef LDAP_SLAPI
- doPostAddPluginFNs( op );
+ if ( op->o_pb ) call_add_postop_plugins( op );
#endif /* LDAP_SLAPI */
done:
-#ifdef LDAP_SYNC
slap_graduate_commit_csn( op );
-#endif
if( modlist != NULL ) {
slap_mods_free( modlist );
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 );
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;
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 );
}
}
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;
}
#ifdef LDAP_SLAPI
-static void initAddPlugin( Operation *op,
+static void init_add_pblock( Operation *op,
struct berval *dn, Entry *e, int manageDSAit )
{
- slapi_x_pblock_set_operation( op->o_pb, op );
+ slapi_int_pblock_set_operation( op->o_pb, op );
slapi_pblock_set( op->o_pb, SLAPI_ADD_TARGET, (void *)dn->bv_val );
slapi_pblock_set( op->o_pb, SLAPI_ADD_ENTRY, (void *)e );
slapi_pblock_set( op->o_pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit );
}
-static int doPreAddPluginFNs( Operation *op )
+static int call_add_preop_plugins( Operation *op )
{
int rc;
- rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_ADD_FN, op->o_pb );
+ rc = slapi_int_call_plugins( op->o_bd, SLAPI_PLUGIN_PRE_ADD_FN, op->o_pb );
if ( rc < 0 ) {
/*
* A preoperation plugin failure will abort the
* entire operation.
*/
#ifdef NEW_LOGGING
- LDAP_LOG( OPERATION, INFO, "do_add: add preoperation plugin failed\n",
- 0, 0, 0);
+ LDAP_LOG( OPERATION, INFO,
+ "do_add: add preoperation plugin failed\n",
+ 0, 0, 0);
#else
- Debug(LDAP_DEBUG_TRACE, "do_add: add preoperation plugin failed.\n",
- 0, 0, 0);
- if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rc ) != 0 ) ||
- rc == LDAP_SUCCESS ) {
+ Debug(LDAP_DEBUG_TRACE,
+ "do_add: add preoperation plugin failed.\n",
+ 0, 0, 0);
+#endif
+
+ if (( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE,
+ (void *)&rc ) != 0 ) || rc == LDAP_SUCCESS )
+ {
rc = LDAP_OTHER;
}
-#endif
} else {
rc = LDAP_SUCCESS;
}
return rc;
}
-static void doPostAddPluginFNs( Operation *op )
+static void call_add_postop_plugins( Operation *op )
{
int rc;
- rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_ADD_FN, op->o_pb );
+ rc = slapi_int_call_plugins( op->o_bd, SLAPI_PLUGIN_POST_ADD_FN, op->o_pb );
if ( rc < 0 ) {
#ifdef NEW_LOGGING
- LDAP_LOG( OPERATION, INFO, "do_add: add postoperation plugin failed\n",
- 0, 0, 0);
+ LDAP_LOG( OPERATION, INFO,
+ "do_add: add postoperation plugin failed\n",
+ 0, 0, 0);
#else
- Debug(LDAP_DEBUG_TRACE, "do_add: add postoperation plugin failed.\n",
- 0, 0, 0);
+ Debug(LDAP_DEBUG_TRACE,
+ "do_add: add postoperation plugin failed\n",
+ 0, 0, 0);
#endif
}
}