]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/id2entry.c
Move MSVC port to the Attic
[openldap] / servers / slapd / back-bdb / id2entry.c
index 13f958dd467e89d2d3074c9ac5c5772f847d1301..05501b0e421fb05aabd51ac94c74fc800e581110 100644 (file)
@@ -32,9 +32,7 @@ static int bdb_id2entry_put(
        DB *db = bdb->bi_id2entry->bdi_db;
        DBT key, data;
        struct berval bv;
-       char buf[sizeof(ID)];
-       ID tmp;
-       int i, rc;
+       int rc;
 #ifdef BDB_HIER
        struct berval odn, ondn;
 
@@ -46,16 +44,9 @@ static int bdb_id2entry_put(
        e->e_nname = slap_empty_bv;
 #endif
        DBTzero( &key );
-       key.data = buf;
+       key.data = (char *) &e->e_id;
        key.size = sizeof(ID);
 
-       /* Set key in BigEndian order */
-       tmp = e->e_id;
-       for ( i=sizeof(ID)-1; i>=0; i-- ) {
-               buf[i] = tmp & 0xff;
-               tmp >>= 8;
-       }
-
        rc = entry_encode( e, &bv );
 #ifdef BDB_HIER
        e->e_name = odn; e->e_nname = ondn;
@@ -105,20 +96,13 @@ int bdb_id2entry(
        DB *db = bdb->bi_id2entry->bdi_db;
        DBT key, data;
        struct berval bv;
-       char buf[sizeof(ID)];
-       ID tmp;
-       int i, rc = 0, ret = 0;
+       int rc = 0, ret = 0;
 
        *e = NULL;
 
        DBTzero( &key );
-       key.data = buf;
+       key.data = (char *) &id;
        key.size = sizeof(ID);
-       tmp = id;
-       for ( i=sizeof(ID)-1; i>=0; i-- ) {
-               buf[i] = tmp & 0xff;
-               tmp >>= 8;
-       }
 
        DBTzero( &data );
        data.flags = DB_DBT_MALLOC;
@@ -154,18 +138,11 @@ int bdb_id2entry_delete(
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        DB *db = bdb->bi_id2entry->bdi_db;
        DBT key;
-       char buf[sizeof(ID)];
-       ID tmp;
-       int i, rc;
+       int rc;
 
        DBTzero( &key );
-       key.data = buf;
+       key.data = (char *) &e->e_id;
        key.size = sizeof(ID);
-       tmp = e->e_id;
-       for ( i=sizeof(ID)-1; i>=0; i-- ) {
-               buf[i] = tmp & 0xff;
-               tmp >>= 8;
-       }
 
        /* delete from database */
        rc = db->del( db, tid, &key, 0 );
@@ -225,6 +202,10 @@ int bdb_entry_release(
                        SLAP_TRUNCATE_MODE, SLAP_UNDEFINED_MODE */
  
        if ( slapMode == SLAP_SERVER_MODE ) {
+               /* If not in our cache, just free it */
+               if ( !e->e_private ) {
+                       return bdb_entry_return( e );
+               }
                /* free entry and reader or writer lock */
                if ( o ) {
                        boi = (struct bdb_op_info *)o->o_private;
@@ -284,7 +265,7 @@ int bdb_entry_get(
 #endif
 
        if( op ) boi = (struct bdb_op_info *) op->o_private;
-       if( boi != NULL && op->o_bd == boi->boi_bdb ) {
+       if( boi != NULL && op->o_bd->be_private == boi->boi_bdb->be_private ) {
                txn = boi->boi_txn;
                locker = boi->boi_locker;
        }
@@ -395,15 +376,23 @@ return_results:
        if( rc != LDAP_SUCCESS ) {
                /* free entry */
                bdb_cache_return_entry_rw(bdb->bi_dbenv, &bdb->bi_cache, e, rw, &lock);
+
        } else {
-               *ent = e;
-               /* big drag. we need a place to store a read lock so we can
-                * release it later??
-                */
-               if ( op && !boi ) {
-                       boi = op->o_tmpcalloc(1,sizeof(struct bdb_op_info),op->o_tmpmemctx);
-                       boi->boi_lock = lock;
-                       op->o_private = boi;
+               if ( slapMode == SLAP_SERVER_MODE ) {
+                       *ent = e;
+                       /* big drag. we need a place to store a read lock so we can
+                        * release it later??
+                        */
+                       if ( op && !boi ) {
+                               boi = op->o_tmpcalloc(1,sizeof(struct bdb_op_info),op->o_tmpmemctx);
+                               boi->boi_lock = lock;
+                               boi->boi_bdb = op->o_bd;
+                               op->o_private = boi;
+                       }
+
+               } else {
+                       *ent = entry_dup( e );
+                       bdb_cache_return_entry_rw(bdb->bi_dbenv, &bdb->bi_cache, e, rw, &lock);
                }
        }