Skip to content
Snippets Groups Projects
Commit 89912db9 authored by Howard Chu's avatar Howard Chu
Browse files

Store entryIDs in big-endian order, no more custom sort function.

back-hdb still needs work.
parent a518895b
No related branches found
No related tags found
No related merge requests found
......@@ -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; i0<sizeof(ID); i0++ ) { \
tmp <<= 8; tmp |= *ptr++; \
} *(dst) = tmp; \
} while (0);
LDAP_END_DECL
#include "proto-bdb.h"
......
......@@ -112,7 +112,9 @@ bdb_db_cache(
rc = db->bdi_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 );
......
......@@ -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;
......
......@@ -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 );
......
......@@ -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";
......
......@@ -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 {
......
......@@ -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:
......
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment