]> git.sur5r.net Git - openldap/commitdiff
Store entryIDs in big-endian order, no more custom sort function.
authorHoward Chu <hyc@openldap.org>
Mon, 6 Dec 2004 07:28:47 +0000 (07:28 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 6 Dec 2004 07:28:47 +0000 (07:28 +0000)
back-hdb still needs work.

servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/dbcache.c
servers/slapd/back-bdb/dn2id.c
servers/slapd/back-bdb/id2entry.c
servers/slapd/back-bdb/idl.c
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/nextid.c
servers/slapd/back-bdb/tools.c

index ceb3eda2ab1d1a45757698f390e651420e7cc118..7b39a8e4046734a53dc92c64f10048cb8638de76 100644 (file)
@@ -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"
index 38d7b9ef0b11c3a0e306d63f2d09b94132df87df..60725caa326bd1a017e9829e29482422ff4863f5 100644 (file)
@@ -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 );
index 4509062ab1672c0482036ada584aced4355f0e4c..ef19457e58aecd68cd0830a65b0f12e17e5c8181 100644 (file)
@@ -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;
index 6157522192847c536a1157f8756aaebda4681c70..0bb1ced380fd8300800f23ccd1605dce625f57d5 100644 (file)
@@ -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 );
index 74cfdc277da0dd3749d0e426fe37342e598346fb..f190b5ef44c93210259a1441b69f8a4e345b6618 100644 (file)
@@ -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";
index b4f752df9b5f564f1f172bac47f0584e1f98c5ad..c8a351ca1d9d9792e849af3b37cc2e1baf427d43 100644 (file)
@@ -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 {
index 5737f0f9c913fbe8cff0b637365f4bff852ed140..a42280707987c4e7b1806b1d1cb2ac46dd330fdd 100644 (file)
@@ -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:
index 97836e1f17d30a1e01600167260e3b00baad27b7..d76aef4dc1365de56ee27f558b9e97b972c1c993 100644 (file)
@@ -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;
 }