/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2007 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
size_t textlen = sizeof( textbuf );
int rc = 0;
int freevals = 1;
+ OpExtraDB oex;
Debug( LDAP_DEBUG_TRACE, "%s do_add\n",
op->o_log_prefix, 0, 0 );
freevals = 0;
+ oex.oe.oe_key = (void *)do_add;
+ oex.oe_db = NULL;
+ LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next);
+
op->o_bd = frontendDB;
rc = frontendDB->be_add( op, rs );
+ LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next);
#ifdef LDAP_X_TXN
if ( rc == LDAP_X_TXN_SPECIFY_OKAY ) {
} else
#endif
if ( rc == 0 ) {
- if ( op->ora_e != NULL && op->o_private != NULL ) {
+ if ( op->ora_e != NULL && oex.oe_db != NULL ) {
BackendDB *bd = op->o_bd;
- op->o_bd = (BackendDB *)op->o_private;
- op->o_private = NULL;
+ op->o_bd = oex.oe_db;
be_entry_release_w( op, op->ora_e );
op->ora_e = NULL;
op->o_bd = bd;
- op->o_private = NULL;
}
}
rc = op->o_bd->be_add( op, rs );
if ( rc == LDAP_SUCCESS ) {
+ OpExtra *oex;
/* NOTE: be_entry_release_w() is
* called by do_add(), so that global
* overlays on the way back can
* at least read the entry */
- op->o_private = op->o_bd;
+ LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {
+ if ( oex->oe_key == (void *)do_add ) {
+ ((OpExtraDB *)oex)->oe_db = op->o_bd;
+ break;
+ }
+ }
}
} else {
} else {
attr->a_nvals = attr->a_vals;
}
- /* slap_mods_check() gives us sorted results */
- if ( attr->a_desc->ad_type->sat_flags & SLAP_AT_SORTED_VAL )
- attr->a_flags |= SLAP_ATTR_SORTED_VALS;
*tail = attr;
tail = &attr->a_next;
while ( a_new != NULL ) {
a_new_desc = a_new->a_desc;
- mod = (Modifications *) malloc( sizeof( Modifications ));
+ mod = (Modifications *) ch_malloc( sizeof( Modifications ));
mod->sml_op = LDAP_MOD_REPLACE;
mod->sml_flags = 0;
count = a_new->a_numvals;
mod->sml_numvals = a_new->a_numvals;
- mod->sml_values = (struct berval*) malloc(
+ mod->sml_values = (struct berval*) ch_malloc(
(count+1) * sizeof( struct berval) );
/* see slap_mods_check() comments...
* 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(
+ mod->sml_nvalues = (struct berval*) ch_malloc(
(count+1) * sizeof( struct berval) );
} else {
mod->sml_nvalues = NULL;
struct berval name, timestamp, csn = BER_BVNULL;
struct berval nname, tmp;
char timebuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
- char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
+ char csnbuf[ LDAP_PVT_CSNSTR_BUFSIZE ];
Attribute *a;
if ( SLAP_LASTMOD( op->o_bd ) ) {