From 89912db91ee00475cbbfffc255fa7ff83dc1c50f Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 6 Dec 2004 07:28:47 +0000 Subject: [PATCH] Store entryIDs in big-endian order, no more custom sort function. back-hdb still needs work. --- servers/slapd/back-bdb/back-bdb.h | 18 +++++++++ servers/slapd/back-bdb/dbcache.c | 2 + servers/slapd/back-bdb/dn2id.c | 14 ++++--- servers/slapd/back-bdb/id2entry.c | 14 +++++-- servers/slapd/back-bdb/idl.c | 61 +++++++++++++++++++------------ servers/slapd/back-bdb/init.c | 4 ++ servers/slapd/back-bdb/nextid.c | 11 +++--- servers/slapd/back-bdb/tools.c | 2 +- 8 files changed, 88 insertions(+), 38 deletions(-) diff --git a/servers/slapd/back-bdb/back-bdb.h b/servers/slapd/back-bdb/back-bdb.h index ceb3eda2ab..7b39a8e404 100644 --- a/servers/slapd/back-bdb/back-bdb.h +++ b/servers/slapd/back-bdb/back-bdb.h @@ -252,6 +252,24 @@ struct bdb_op_info { #define BDB_CSN_ABORT 1 #define BDB_CSN_RETRY 2 +/* Copy an ID "src" to pointer "dst" in big-endian byte order */ +#define BDB_ID2DISK( src, dst ) \ + do { int i0; ID tmp; char *ptr; \ + tmp = (src); ptr = (char *)(dst); \ + for ( i0=sizeof(ID)-1; i0>=0; i0-- ) { \ + ptr[i0] = tmp & 0xff; tmp >>= 8; \ + } \ + } while(0); + +/* Copy a pointer "src" to a pointer "dst" from big-endian to native order */ +#define BDB_DISK2ID( src, dst ) \ + do { int i0; ID tmp = 0; unsigned char *ptr; \ + ptr = (unsigned char *)(src); \ + for ( i0=0; i0bdi_db->set_h_hash( db->bdi_db, bdb_db_hash ); #endif rc = db->bdi_db->set_flags( db->bdi_db, DB_DUP | DB_DUPSORT ); +#if 0 rc = db->bdi_db->set_dup_compare( db->bdi_db, bdb_bt_compare ); +#endif file = ch_malloc( strlen( name ) + sizeof(BDB_SUFFIX) ); sprintf( file, "%s" BDB_SUFFIX, name ); diff --git a/servers/slapd/back-bdb/dn2id.c b/servers/slapd/back-bdb/dn2id.c index 4509062ab1..ef19457e58 100644 --- a/servers/slapd/back-bdb/dn2id.c +++ b/servers/slapd/back-bdb/dn2id.c @@ -35,6 +35,7 @@ bdb_dn2id_add( DB *db = bdb->bi_dn2id->bdi_db; int rc; DBT key, data; + ID nid; char *buf; struct berval ptr, pdn; @@ -55,8 +56,9 @@ bdb_dn2id_add( ptr.bv_val[ptr.bv_len] = '\0'; DBTzero( &data ); - data.data = (char *) &e->e_id; - data.size = sizeof( e->e_id ); + data.data = &nid; + data.size = sizeof( nid ); + BDB_ID2DISK( e->e_id, &nid ); /* store it -- don't override */ rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE ); @@ -246,10 +248,11 @@ bdb_dn2id( struct berval *dn, EntryInfo *ei ) { - int rc; - DBT key, data; struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private; DB *db = bdb->bi_dn2id->bdi_db; + int rc; + DBT key, data; + ID nid; Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id(\"%s\")\n", dn->bv_val, 0, 0 ); DBTzero( &key ); @@ -260,7 +263,7 @@ bdb_dn2id( /* store the ID */ DBTzero( &data ); - data.data = &ei->bei_id; + data.data = &nid; data.ulen = sizeof(ID); data.flags = DB_DBT_USERMEM; @@ -274,6 +277,7 @@ bdb_dn2id( Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: got id=0x%08lx\n", ei->bei_id, 0, 0 ); } + BDB_DISK2ID( &nid, &ei->bei_id ); op->o_tmpfree( key.data, op->o_tmpmemctx ); return rc; diff --git a/servers/slapd/back-bdb/id2entry.c b/servers/slapd/back-bdb/id2entry.c index 6157522192..0bb1ced380 100644 --- a/servers/slapd/back-bdb/id2entry.c +++ b/servers/slapd/back-bdb/id2entry.c @@ -32,6 +32,7 @@ static int bdb_id2entry_put( DBT key, data; struct berval bv; int rc; + ID nid; #ifdef BDB_HIER struct berval odn, ondn; @@ -43,8 +44,11 @@ static int bdb_id2entry_put( e->e_nname = slap_empty_bv; #endif DBTzero( &key ); - key.data = (char *) &e->e_id; + + /* Store ID in BigEndian format */ + key.data = &nid; key.size = sizeof(ID); + BDB_ID2DISK( e->e_id, &nid ); rc = entry_encode( e, &bv ); #ifdef BDB_HIER @@ -96,12 +100,14 @@ int bdb_id2entry( DBT key, data; struct berval bv; int rc = 0, ret = 0; + ID nid; *e = NULL; DBTzero( &key ); - key.data = (char *) &id; + key.data = &nid; key.size = sizeof(ID); + BDB_ID2DISK( id, &nid ); DBTzero( &data ); data.flags = DB_DBT_MALLOC; @@ -138,10 +144,12 @@ int bdb_id2entry_delete( DB *db = bdb->bi_id2entry->bdi_db; DBT key; int rc; + ID nid; DBTzero( &key ); - key.data = (char *) &e->e_id; + key.data = &nid; key.size = sizeof(ID); + BDB_ID2DISK( e->e_id, &nid ); /* delete from database */ rc = db->del( db, tid, &key, 0 ); diff --git a/servers/slapd/back-bdb/idl.c b/servers/slapd/back-bdb/idl.c index 74cfdc277d..f190b5ef44 100644 --- a/servers/slapd/back-bdb/idl.c +++ b/servers/slapd/back-bdb/idl.c @@ -527,7 +527,7 @@ bdb_idl_fetch_key( DB_MULTIPLE_NEXT(ptr, &data, j, len); if (j) { ++i; - AC_MEMCPY( i, j, sizeof(ID) ); + BDB_DISK2ID( j, i ); } } rc = cursor->c_get( cursor, key, &data, flags | DB_NEXT_DUP ); @@ -605,7 +605,7 @@ bdb_idl_insert_key( int rc; DBT data; DBC *cursor; - ID lo, hi, tmp; + ID lo, hi, tmp, nlo, nhi, nid; char *err; { @@ -626,20 +626,22 @@ bdb_idl_insert_key( data.ulen = data.size; data.flags = DB_DBT_USERMEM; + BDB_ID2DISK( id, &nid ); + rc = db->cursor( db, tid, &cursor, bdb->bi_db_opflags ); if ( rc != 0 ) { Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "cursor failed: %s (%d)\n", db_strerror(rc), rc, 0 ); return rc; } - data.data = &tmp; + data.data = &nlo; /* Fetch the first data item for this key, to see if it * exists and if it's a range. */ rc = cursor->c_get( cursor, key, &data, DB_SET | DB_RMW ); err = "c_get"; if ( rc == 0 ) { - if ( tmp != 0 ) { + if ( nlo != 0 ) { /* not a range, count the number of items */ db_recno_t count; rc = cursor->c_count( cursor, &count, 0 ); @@ -654,8 +656,9 @@ bdb_idl_insert_key( key2.dlen = key2.ulen; key2.flags |= DB_DBT_PARTIAL; - lo = tmp; - data.data = &hi; + BDB_DISK2ID( &nlo, &lo ); + data.data = &nhi; + rc = cursor->c_get( cursor, &key2, &data, DB_NEXT_NODUP ); if ( rc != 0 && rc != DB_NOTFOUND ) { err = "c_get next_nodup"; @@ -674,29 +677,33 @@ bdb_idl_insert_key( goto fail; } } - if ( id < lo ) + BDB_DISK2ID( &nhi, &hi ); + if ( id < lo ) { lo = id; - else if ( id > hi ) + nlo = nid; + } else if ( id > hi ) { hi = id; + nhi = nid; + } rc = db->del( db, tid, key, 0 ); if ( rc != 0 ) { err = "del"; goto fail; } - data.data = &id; - id = 0; + data.data = &nid; + nid = 0; rc = cursor->c_put( cursor, key, &data, DB_KEYFIRST ); if ( rc != 0 ) { err = "c_put 0"; goto fail; } - id = lo; + nid = nlo; rc = cursor->c_put( cursor, key, &data, DB_KEYLAST ); if ( rc != 0 ) { err = "c_put lo"; goto fail; } - id = hi; + nid = nhi; rc = cursor->c_put( cursor, key, &data, DB_KEYLAST ); if ( rc != 0 ) { err = "c_put hi"; @@ -711,19 +718,21 @@ bdb_idl_insert_key( * the boundaries */ hi = id; - data.data = &lo; + data.data = &nlo; rc = cursor->c_get( cursor, key, &data, DB_NEXT_DUP ); if ( rc != 0 ) { err = "c_get lo"; goto fail; } + BDB_DISK2ID( &nlo, &lo ); if ( id > lo ) { - data.data = &hi; + data.data = &nhi; rc = cursor->c_get( cursor, key, &data, DB_NEXT_DUP ); if ( rc != 0 ) { err = "c_get hi"; goto fail; } + BDB_DISK2ID( &nhi, &hi ); } if ( id < lo || id > hi ) { /* Delete the current lo/hi */ @@ -732,7 +741,7 @@ bdb_idl_insert_key( err = "c_del"; goto fail; } - data.data = &id; + data.data = &nid; rc = cursor->c_put( cursor, key, &data, DB_KEYFIRST ); if ( rc != 0 ) { err = "c_put lo/hi"; @@ -741,7 +750,7 @@ bdb_idl_insert_key( } } } else if ( rc == DB_NOTFOUND ) { -put1: data.data = &id; +put1: data.data = &nid; rc = cursor->c_put( cursor, key, &data, DB_NODUPDATA ); /* Don't worry if it's already there */ if ( rc != 0 && rc != DB_KEYEXIST ) { @@ -777,7 +786,7 @@ bdb_idl_delete_key( int rc; DBT data; DBC *cursor; - ID lo, hi, tmp; + ID lo, hi, tmp, nid, nlo, nhi; char *err; { @@ -792,6 +801,8 @@ bdb_idl_delete_key( bdb_idl_cache_del( bdb, db, key ); } + BDB_ID2DISK( id, &nid ); + DBTzero( &data ); data.data = &tmp; data.size = sizeof( id ); @@ -812,9 +823,9 @@ bdb_idl_delete_key( if ( rc == 0 ) { if ( tmp != 0 ) { /* Not a range, just delete it */ - if (tmp != id) { + if (tmp != nid) { /* position to correct item */ - tmp = id; + tmp = nid; rc = cursor->c_get( cursor, key, &data, DB_GET_BOTH | DB_RMW ); if ( rc != 0 ) { @@ -831,18 +842,20 @@ bdb_idl_delete_key( /* It's a range, see if we need to rewrite * the boundaries */ - data.data = &lo; + data.data = &nlo; rc = cursor->c_get( cursor, key, &data, DB_NEXT_DUP ); if ( rc != 0 ) { err = "c_get lo"; goto fail; } - data.data = &hi; + BDB_DISK2ID( &nlo, &lo ); + data.data = &nhi; rc = cursor->c_get( cursor, key, &data, DB_NEXT_DUP ); if ( rc != 0 ) { err = "c_get hi"; goto fail; } + BDB_DISK2ID( &nhi, &hi ); if ( id == lo || id == hi ) { if ( id == lo ) { id++; @@ -861,9 +874,8 @@ bdb_idl_delete_key( } else { if ( id == lo ) { /* reposition on lo slot */ - data.data = &lo; + data.data = &nlo; cursor->c_get( cursor, key, &data, DB_PREV ); - lo = id; } rc = cursor->c_del( cursor, 0 ); if ( rc != 0 ) { @@ -872,7 +884,8 @@ bdb_idl_delete_key( } } if ( lo <= hi ) { - data.data = &id; + BDB_ID2DISK( id, &nid ); + data.data = &nid; rc = cursor->c_put( cursor, key, &data, DB_KEYFIRST ); if ( rc != 0 ) { err = "c_put lo/hi"; diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index b4f752df9b..c8a351ca1d 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -311,8 +311,10 @@ bdb_db_open( BackendDB *be ) } if( i == BDB_ID2ENTRY ) { +#if 0 rc = db->bdi_db->set_bt_compare( db->bdi_db, bdb_bt_compare ); +#endif rc = db->bdi_db->set_pagesize( db->bdi_db, BDB_ID2ENTRY_PAGESIZE ); if ( slapMode & SLAP_TOOL_READMAIN ) { @@ -324,8 +326,10 @@ bdb_db_open( BackendDB *be ) rc = db->bdi_db->set_flags( db->bdi_db, DB_DUP | DB_DUPSORT ); #ifndef BDB_HIER +#if 0 rc = db->bdi_db->set_dup_compare( db->bdi_db, bdb_bt_compare ); +#endif if ( slapMode & SLAP_TOOL_READONLY ) { flags |= DB_RDONLY; } else { diff --git a/servers/slapd/back-bdb/nextid.c b/servers/slapd/back-bdb/nextid.c index 5737f0f9c9..a422807079 100644 --- a/servers/slapd/back-bdb/nextid.c +++ b/servers/slapd/back-bdb/nextid.c @@ -35,15 +35,16 @@ int bdb_next_id( BackendDB *be, DB_TXN *tid, ID *out ) int bdb_last_id( BackendDB *be, DB_TXN *tid ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; - int rc; + int i, rc; ID id = 0; + unsigned char idbuf[sizeof(ID)]; DBT key, data; DBC *cursor; DBTzero( &key ); key.flags = DB_DBT_USERMEM; - key.data = (char *) &id; - key.ulen = sizeof( id ); + key.data = (char *) idbuf; + key.ulen = sizeof( idbuf ); DBTzero( &data ); data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL; @@ -59,10 +60,10 @@ int bdb_last_id( BackendDB *be, DB_TXN *tid ) switch(rc) { case DB_NOTFOUND: - id = 0; rc = 0; - /* FALLTHROUGH */ + break; case 0: + BDB_DISK2ID( idbuf, &id ); break; default: diff --git a/servers/slapd/back-bdb/tools.c b/servers/slapd/back-bdb/tools.c index 97836e1f17..d76aef4dc1 100644 --- a/servers/slapd/back-bdb/tools.c +++ b/servers/slapd/back-bdb/tools.c @@ -129,7 +129,7 @@ ID bdb_tool_entry_next( return NOID; } - AC_MEMCPY( &id, key.data, key.size ); + BDB_DISK2ID( key.data, &id ); return id; } -- 2.39.5