]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/add.c
Removed unnecessary definition that is already in core.schema.
[openldap] / servers / slapd / back-ldbm / add.c
index fc592712db822e1f202398eb207842977a6c1252..dbb96e8f22dc89bafea411a2c5ce5986c42bfe1d 100644 (file)
@@ -20,19 +20,17 @@ ldbm_back_add(
 )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
-       char            *dn, *pdn;
+       char            *pdn;
        Entry           *p = NULL;
        int                     rootlock = 0;
-       int                     rc = -1
+       int                     rc; 
 
-       dn = e->e_ndn;
-
-       Debug(LDAP_DEBUG_ARGS, "==> ldbm_back_add: %s\n", dn, 0, 0);
+       Debug(LDAP_DEBUG_ARGS, "==> ldbm_back_add: %s\n", e->e_dn, 0, 0);
 
        /* nobody else can add until we lock our parent */
        ldap_pvt_thread_mutex_lock(&li->li_add_mutex);
 
-       if ( ( dn2id( be, dn ) ) != NOID ) {
+       if ( ( dn2id( be, e->e_ndn ) ) != NOID ) {
                ldap_pvt_thread_mutex_unlock(&li->li_add_mutex);
                entry_free( e );
                send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" );
@@ -57,7 +55,7 @@ ldbm_back_add(
         * add the entry.
         */
 
-       if ( (pdn = dn_parent( be, dn )) != NULL ) {
+       if ( (pdn = dn_parent( be, e->e_ndn )) != NULL ) {
                char *matched = NULL;
 
                /* get parent with writer lock */
@@ -123,39 +121,19 @@ ldbm_back_add(
                ldap_pvt_thread_mutex_unlock(&li->li_add_mutex);
        }
 
-       /* acquire required reader/writer lock */
-       if (entry_rdwr_lock(e, 1)) {
-               if( p != NULL) {
-                       /* free parent and writer lock */
-                       cache_return_entry_w( &li->li_cache, p ); 
-               }
-
-               if ( rootlock ) {
-                       /* release root lock */
-                       ldap_pvt_thread_mutex_unlock(&li->li_root_mutex);
-               }
-
-               Debug( LDAP_DEBUG_ANY, "add: could not lock entry\n",
-                       0, 0, 0 );
-
-               entry_free(e);
-
-               send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
-               return( -1 );
-       }
-
        e->e_id = next_id( be );
 
        /*
         * Try to add the entry to the cache, assign it a new dnid.
-        * This should only fail if the entry already exists.
         */
+       rc = cache_add_entry_rw(&li->li_cache, e, CACHE_WRITE_LOCK);
 
-       if ( cache_add_entry_lock( &li->li_cache, e, ENTRY_STATE_CREATING ) != 0 ) {
+       if ( rc != 0 ) {
                if( p != NULL) {
                        /* free parent and writer lock */
                        cache_return_entry_w( &li->li_cache, p ); 
                }
+
                if ( rootlock ) {
                        /* release root lock */
                        ldap_pvt_thread_mutex_unlock(&li->li_root_mutex);
@@ -163,15 +141,24 @@ ldbm_back_add(
 
                Debug( LDAP_DEBUG_ANY, "cache_add_entry_lock failed\n", 0, 0,
                    0 );
+
+               /* return the id */
                next_id_return( be, e->e_id );
-                
-               entry_rdwr_unlock(e, 1);;
+
+               /* free the entry */
                entry_free( e );
 
-               send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" );
+               if(rc > 0) {
+                       send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" );
+               } else {
+                       send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
+               }
+
                return( -1 );
        }
 
+       rc = -1;
+
        /*
         * add it to the id2children index for the parent
         */
@@ -199,7 +186,7 @@ ldbm_back_add(
        }
 
        /* dn2id index */
-       if ( dn2id_add( be, dn, e->e_id ) != 0 ) {
+       if ( dn2id_add( be, e->e_ndn, e->e_id ) != 0 ) {
                Debug( LDAP_DEBUG_TRACE, "dn2id_add failed\n", 0,
                    0, 0 );
                send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
@@ -211,7 +198,7 @@ ldbm_back_add(
        if ( id2entry_add( be, e ) != 0 ) {
                Debug( LDAP_DEBUG_TRACE, "id2entry_add failed\n", 0,
                    0, 0 );
-               (void) dn2id_delete( be, dn );
+               (void) dn2id_delete( be, e->e_ndn );
                send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
 
                goto return_results;
@@ -231,10 +218,10 @@ return_results:;
                ldap_pvt_thread_mutex_unlock(&li->li_root_mutex);
        }
 
-       cache_set_state( &li->li_cache, e, 0 );
-
-       /* free entry and writer lock */
-       cache_return_entry_w( &li->li_cache, e ); 
+       if ( rc ) {
+               /* free entry and writer lock */
+               cache_return_entry_w( &li->li_cache, e );
+       }
 
        return( rc );
 }