#include <ac/string.h>
#include "back-bdb.h"
-#include "external.h"
int
bdb_add(Operation *op, SlapReply *rs )
{
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
struct berval pdn;
- Entry *p;
+ Entry *p = NULL;
EntryInfo *ei;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
Entry *ctxcsn_e;
int ctxcsn_added = 0;
+ LDAPControl **postread_ctrl = NULL;
LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS];
int num_ctrls = 0;
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ARGS, "==> bdb_add: %s\n",
- op->oq_add.rs_e->e_name.bv_val, 0, 0 );
-#else
- Debug(LDAP_DEBUG_ARGS, "==> bdb_add: %s\n",
+ Debug(LDAP_DEBUG_ARGS, "==> " LDAP_XSTRING(bdb_add) ": %s\n",
op->oq_add.rs_e->e_name.bv_val, 0, 0);
-#endif
+
+ ctrls[num_ctrls] = 0;
/* check entry's schema */
rs->sr_err = entry_schema_check( op->o_bd, op->oq_add.rs_e,
NULL, &rs->sr_text, textbuf, textlen );
if ( rs->sr_err != LDAP_SUCCESS ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR,
- "bdb_add: entry failed schema check: %s (%d)\n",
- rs->sr_text, rs->sr_err, 0 );
-#else
Debug( LDAP_DEBUG_TRACE,
- "bdb_add: entry failed schema check: %s (%d)\n",
- rs->sr_text, rs->sr_err, 0 );
-#endif
+ LDAP_XSTRING(bdb_add) ": entry failed schema check: "
+ "%s (%d)\n", rs->sr_text, rs->sr_err, 0 );
goto return_results;
}
*/
rs->sr_err = bdb_next_id( op->o_bd, NULL, &op->oq_add.rs_e->e_id );
if( rs->sr_err != 0 ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR,
- "bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
-#else
Debug( LDAP_DEBUG_TRACE,
- "bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
-#endif
+ LDAP_XSTRING(bdb_add) ": next_id failed (%d)\n",
+ rs->sr_err, 0, 0 );
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
goto return_results;
bdb->bi_db_opflags );
rs->sr_text = NULL;
if( rs->sr_err != 0 ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR,
- "bdb_add: txn_begin failed: %s (%d)\n",
- db_strerror(rs->sr_err), rs->sr_err, 0 );
-#else
Debug( LDAP_DEBUG_TRACE,
- "bdb_add: txn_begin failed: %s (%d)\n",
+ LDAP_XSTRING(bdb_add) ": txn_begin failed: %s (%d)\n",
db_strerror(rs->sr_err), rs->sr_err, 0 );
-#endif
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
goto return_results;
: NULL;
bdb_unlocked_cache_return_entry_r( &bdb->bi_cache, p );
p = NULL;
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1, "bdb_add: parent does not exist\n",
- 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: parent does not exist\n",
- 0, 0, 0 );
-#endif
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": parent "
+ "does not exist\n", 0, 0, 0 );
rs->sr_err = LDAP_REFERRAL;
send_ldap_result( op, rs );
goto retry;
}
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1,
- "bdb_add: no write access to parent\n", 0, 0, 0 );
-#else
Debug( LDAP_DEBUG_TRACE,
- "bdb_add: no write access to parent\n", 0, 0, 0 );
-#endif
+ LDAP_XSTRING(bdb_add) ": no write access "
+ "to parent\n", 0, 0, 0 );
rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
rs->sr_text = "no write access to parent";
goto return_results;;
#ifdef BDB_SUBENTRIES
if ( is_entry_subentry( p ) ) {
/* parent is a subentry, don't allow add */
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1,
- "bdb_add: parent is subentry\n", 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: parent is subentry\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": parent is subentry\n",
0, 0, 0 );
-#endif
rs->sr_err = LDAP_OBJECT_CLASS_VIOLATION;
rs->sr_text = "parent is a subentry";
goto return_results;;
}
#endif
-#ifdef BDB_ALIASES
if ( is_entry_alias( p ) ) {
/* parent is an alias, don't allow add */
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1,
- "bdb_add: parent is alias\n", 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: parent is alias\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": parent is alias\n",
0, 0, 0 );
-#endif
rs->sr_err = LDAP_ALIAS_PROBLEM;
rs->sr_text = "parent is an alias";
goto return_results;;
}
-#endif
if ( is_entry_referral( p ) ) {
/* parent is a referral, don't allow add */
rs->sr_matched = p->e_name.bv_val;
rs->sr_ref = get_entry_referrals( op, p );
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1,
- "bdb_add: parent is referral\n", 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: parent is referral\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": parent is referral\n",
0, 0, 0 );
-#endif
rs->sr_err = LDAP_REFERRAL;
send_ldap_result( op, rs );
if ((( !be_isroot( op ) && !be_shadow_update(op) )
|| pdn.bv_len > 0 ) && !is_entry_glue( op->oq_add.rs_e ))
{
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1, "bdb_add: %s denied\n",
- pdn.bv_len == 0 ? "suffix" : "entry at root", 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: %s denied\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": %s denied\n",
pdn.bv_len == 0 ? "suffix" : "entry at root",
0, 0 );
-#endif
rs->sr_err = LDAP_NO_SUCH_OBJECT;
goto return_results;
}
goto retry;
}
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1,
- "bdb_add: no write access to entry\n", 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: no write access to entry\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": no write access to entry\n",
0, 0, 0 );
-#endif
rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
rs->sr_text = "no write access to entry";
goto return_results;;
}
- /* post-read */
- if( op->o_postread ) {
- if ( slap_read_controls( op, rs, op->oq_add.rs_e,
- &slap_post_read_bv, &ctrls[num_ctrls] ) )
- {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, DETAIL1,
- "<=- bdb_add: post-read failed!\n", 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE,
- "<=- bdb_add: post-read failed!\n", 0, 0, 0 );
-#endif
- goto return_results;
- }
- ctrls[++num_ctrls] = NULL;
- }
-
/* nested transaction */
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, ltid, <2,
bdb->bi_db_opflags );
rs->sr_text = NULL;
if( rs->sr_err != 0 ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR,
- "bdb_add: txn_begin(2) failed: %s (%d)\n",
- db_strerror(rs->sr_err), rs->sr_err, 0 );
-#else
Debug( LDAP_DEBUG_TRACE,
- "bdb_add: txn_begin(2) failed: %s (%d)\n",
- db_strerror(rs->sr_err), rs->sr_err, 0 );
-#endif
+ LDAP_XSTRING(bdb_add) ": txn_begin(2) failed: "
+ "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 );
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
goto return_results;
/* dn2id index */
rs->sr_err = bdb_dn2id_add( op, lt2, ei, op->oq_add.rs_e );
if ( rs->sr_err != 0 ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR,
- "bdb_add: dn2id_add failed: %s (%d)\n",
- db_strerror(rs->sr_err), rs->sr_err, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: dn2id_add failed: %s (%d)\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": dn2id_add failed: %s (%d)\n",
db_strerror(rs->sr_err), rs->sr_err, 0 );
-#endif
switch( rs->sr_err ) {
case DB_LOCK_DEADLOCK:
/* id2entry index */
rs->sr_err = bdb_id2entry_add( op->o_bd, lt2, op->oq_add.rs_e );
if ( rs->sr_err != 0 ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR, "bdb_add: id2entry_add failed\n", 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: id2entry_add failed\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": id2entry_add failed\n",
0, 0, 0 );
-#endif
switch( rs->sr_err ) {
case DB_LOCK_DEADLOCK:
case DB_LOCK_NOTGRANTED:
/* attribute indexes */
rs->sr_err = bdb_index_entry_add( op, lt2, op->oq_add.rs_e );
if ( rs->sr_err != LDAP_SUCCESS ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR,
- "bdb_add: index_entry_add failed\n", 0, 0, 0 );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: index_entry_add failed\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": index_entry_add failed\n",
0, 0, 0 );
-#endif
switch( rs->sr_err ) {
case DB_LOCK_DEADLOCK:
case DB_LOCK_NOTGRANTED:
}
}
+ /* post-read */
+ if( op->o_postread ) {
+ if( postread_ctrl == NULL ) {
+ postread_ctrl = &ctrls[num_ctrls++];
+ ctrls[num_ctrls] = NULL;
+ }
+ if ( slap_read_controls( op, rs, op->oq_add.rs_e,
+ &slap_post_read_bv, postread_ctrl ) )
+ {
+ Debug( LDAP_DEBUG_TRACE,
+ "<=- " LDAP_XSTRING(bdb_add) ": post-read "
+ "failed!\n", 0, 0, 0 );
+ goto return_results;
+ }
+ }
+
if ( op->o_noop ) {
if (( rs->sr_err=TXN_ABORT( ltid )) != 0 ) {
rs->sr_text = "txn_abort (no-op) failed";
ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock );
assert( BEI(e) );
LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
- bdb_psearch( op, rs, ps_list, e,
- LDAP_PSEARCH_BY_ADD );
+ rc = bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_ADD );
+ if ( rc ) {
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add)
+ ": persistent search failed "
+ "(%d,%d)\n",
+ rc, rs->sr_err, 0 );
+ }
}
ldap_pvt_thread_rdwr_wunlock( &bdb->bi_pslist_rwlock );
}
op->o_private = NULL;
if ( rs->sr_err != LDAP_SUCCESS ) {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, ERR, "bdb_add: %s : %s (%d)\n",
- rs->sr_text, db_strerror(rs->sr_err), rs->sr_err );
-#else
- Debug( LDAP_DEBUG_TRACE, "bdb_add: %s : %s (%d)\n",
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": %s : %s (%d)\n",
rs->sr_text, db_strerror(rs->sr_err), rs->sr_err );
-#endif
rs->sr_err = LDAP_OTHER;
goto return_results;
}
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, RESULTS,
- "bdb_add: added%s id=%08lx dn=\"%s\"\n",
+ Debug(LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(bdb_add) ": added%s id=%08lx dn=\"%s\"\n",
op->o_noop ? " (no-op)" : "",
op->oq_add.rs_e->e_id, op->oq_add.rs_e->e_dn );
-#else
- Debug(LDAP_DEBUG_TRACE, "bdb_add: added%s id=%08lx dn=\"%s\"\n",
- op->o_noop ? " (no-op)" : "",
- op->oq_add.rs_e->e_id, op->oq_add.rs_e->e_dn );
-#endif
rs->sr_text = NULL;
if( num_ctrls ) rs->sr_ctrls = ctrls;
op->o_private = NULL;
}
+ if( postread_ctrl != NULL ) {
+ slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );
+ slap_sl_free( *postread_ctrl, op->o_tmpmemctx );
+ }
return rs->sr_err;
}