mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-24 00:29:35 -05:00
Store entryIDs in big-endian order, no more custom sort function.
back-hdb still needs work.
This commit is contained in:
parent
a518895b72
commit
89912db91e
8 changed files with 88 additions and 38 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue