lineno=nextline+1 )
{
BackendDB *bd;
- Entry *e;
+ Entry *e_orig = NULL, *e = NULL;
struct berval rbuf;
LDIFRecord lr;
struct berval ndn;
break;
}
- /* get entry */
- id = be->be_dn2id_get( be, &ndn );
- e = be->be_entry_get( be, id );
- if ( e != NULL ) {
- Entry *e_tmp = entry_dup( e );
- /* FIXME: release? */
- e = e_tmp;
+ /* get id and/or entry */
+ switch ( lr.lr_op ) {
+ case LDAP_REQ_ADD:
+ e = entry_alloc();
+ ber_dupbv( &e->e_name, &lr.lr_dn );
+ ber_dupbv( &e->e_nname, &ndn );
+ break;
+
+ //case LDAP_REQ_MODRDN:
+ case LDAP_REQ_DELETE:
+ case LDAP_REQ_MODIFY:
+ id = be->be_dn2id_get( be, &ndn );
+ rc = (id == NOID);
+ if ( rc == LDAP_SUCCESS && lr.lr_op != LDAP_REQ_DELETE ) {
+ e_orig = be->be_entry_get( be, id );
+ e = entry_dup( e_orig );
+ }
+ break;
+ }
+
+ if ( rc != LDAP_SUCCESS ) {
+ fprintf( stderr, "%s: no such entry \"%s\" in database (lineno=%d)\n",
+ progname, ndn.bv_val, lineno );
+ rc = EXIT_FAILURE;
+ SLAP_FREE( ndn.bv_val );
+ if( continuemode ) continue;
+ goto done;
}
if ( lr.lrop_mods ) {
SLAP_FREE( ndn.bv_val );
ldap_ldif_record_done( &lr );
entry_free( e );
+ be_entry_release_w( op, e_orig );
goto done;
}
SLAP_FREE( ndn.bv_val );
ldap_ldif_record_done( &lr );
entry_free( e );
+ be_entry_release_w( op, e_orig );
goto done;
}
SLAP_FREE( ndn.bv_val );
ldap_ldif_record_done( &lr );
entry_free( e );
+ be_entry_release_w( op, e_orig );
goto done;
}
}
SLAP_FREE( ndn.bv_val );
ldap_ldif_record_done( &lr );
entry_free( e );
+ be_entry_release_w( op, e_orig );
goto done;
}
}
}
}
- if ( SLAP_LASTMOD(be) ) {
+ if ( SLAP_LASTMOD(be) && e != NULL ) {
time_t now = slap_get_time();
char uuidbuf[ LDAP_LUTIL_UUIDSTR_BUFSIZE ];
struct berval vals[ 2 ];
case LDAP_REQ_DELETE:
rc = be->be_entry_delete( be, id, &bvtext );
+ e_orig = NULL;
break;
}
request, e->e_dn );
}
- entry_free( e );
+ ldap_ldif_record_done( &lr );
+ if ( e ) entry_free( e );
+ if ( e_orig ) be_entry_release_w( op, e_orig );
+ if ( rc != LDAP_SUCCESS && !continuemode ) break;
}
done:;