- if( pdn.bv_len != 0 ) {
- Entry *matched = NULL;
-
-#if 0
- if ( ltid ) {
- DBT obj;
- obj.data = pdn.bv_val-1;
- obj.size = pdn.bv_len+1;
- rc = LOCK_GET( bdb->bi_dbenv, lockid, 0, &obj,
- DB_LOCK_WRITE, &lock);
- }
-#endif
-
- /* get parent */
- rc = bdb_dn2entry_r( be, ltid, &pdn, &p, &matched, 0 );
-
- switch( rc ) {
- case 0:
- case DB_NOTFOUND:
- break;
- case DB_LOCK_DEADLOCK:
- case DB_LOCK_NOTGRANTED:
- goto retry;
- default:
- rc = LDAP_OTHER;
- text = "internal error";
- goto return_results;
- }
-
- if ( p == NULL ) {
- char *matched_dn = NULL;
- BerVarray refs;
-
- if ( matched != NULL ) {
- matched_dn = ch_strdup( matched->e_dn );
- refs = is_entry_referral( matched )
- ? get_entry_referrals( be, conn, op, matched )
- : NULL;
- bdb_cache_return_entry_r(&bdb->bi_cache, matched);
- matched = NULL;
-
- } else {
- refs = referral_rewrite( default_referral,
- NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
- }
+ /* get entry or parent */
+ rs->sr_err = bdb_dn2entry( op->o_bd, ltid, &op->ora_e->e_nname, &ei,
+ 1, locker, &lock, op->o_tmpmemctx );
+ switch( rs->sr_err ) {
+ case 0:
+ rs->sr_err = LDAP_ALREADY_EXISTS;
+ goto return_results;
+ case DB_NOTFOUND:
+ break;
+ case DB_LOCK_DEADLOCK:
+ case DB_LOCK_NOTGRANTED:
+ goto retry;
+ case LDAP_BUSY:
+ rs->sr_text = "ldap server busy";
+ goto return_results;
+ default:
+ rs->sr_err = LDAP_OTHER;
+ rs->sr_text = "internal error";
+ goto return_results;
+ }