]> git.sur5r.net Git - openldap/commitdiff
replace ALLIDS with RANGE IDLs
authorKurt Zeilenga <kurt@openldap.org>
Tue, 26 Sep 2000 22:22:42 +0000 (22:22 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 26 Sep 2000 22:22:42 +0000 (22:22 +0000)
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/backbdb.dsp
servers/slapd/back-bdb/idl.c
servers/slapd/back-bdb/proto-bdb.h
servers/slapd/back-bdb/search.c

index 7859119d811a01abf35e580c151f2a2f69058fe7..c9fa58d905d3e358d0072477c696a524a19efaa7 100644 (file)
@@ -23,7 +23,8 @@ LDAP_BEGIN_DECL
 #define BDB_IDL_MAX                    (BDB_IDL_DB_SIZE-32)
 /* #define BDB_IDL_DB_ALLOC    (BDB_IDL_DB_SIZE * sizeof(ID)) */
 
-#define BDB_IS_ALLIDS(ids)     ((ids)[0] == NOID)
+#define BDB_IDL_RANGE_SIZE     (3 * sizeof(ID))
+#define BDB_IDL_IS_RANGE(ids)  ((ids)[0] == NOID)
 
 #define DN_BASE_PREFIX         SLAP_INDEX_EQUALITY_PREFIX
 #define DN_ONE_PREFIX          '%'
index 968c4c710cd8a91d2f25f54bc417edef91c6727a..49b043fc9d210a3d082c938248489b8d94c92df1 100644 (file)
@@ -187,6 +187,10 @@ SOURCE=".\proto-bdb.h"
 # End Source File
 # Begin Source File
 
+SOURCE=.\referral.c
+# End Source File
+# Begin Source File
+
 SOURCE=.\search.c
 # End Source File
 # Begin Source File
index eff46e62fd5b36872f76d4caf9cf15cb13456c54..16146d12e5acb57fbd9ffaea31445615e7c4b935 100644 (file)
@@ -14,7 +14,7 @@
 
 #define IDL_CMP(x,y)   ( x < y ? -1 : ( x > y ? 1 : 0 ) )
 
-int bdb_idl_search( ID *ids, ID id )
+unsigned bdb_idl_search( ID *ids, ID id )
 {
 #if BDB_IDL_BINARY_SEARCH
        /*
@@ -22,10 +22,10 @@ int bdb_idl_search( ID *ids, ID id )
         * if found, returns position of id
         * if not found, returns first postion greater than id
         */
-       int base = 0;
-       int cursor = 0;
+       unsigned base = 0;
+       unsigned cursor = 0;
        int val;
-       int n = ids[0];
+       unsigned n = ids[0];
 
        while( 0 < n ) {
                int pivot = n >> 1;
@@ -64,7 +64,7 @@ int bdb_idl_search( ID *ids, ID id )
 
 static int idl_insert( ID *ids, ID id )
 {
-       int x = bdb_idl_search( ids, id );
+       unsigned x = bdb_idl_search( ids, id );
 
        assert( x > 0 );
 
@@ -79,6 +79,14 @@ static int idl_insert( ID *ids, ID id )
        }
 
        if ( ++ids[0] >= BDB_IDL_DB_MAX ) {
+               if( id < ids[1] ) {
+                       ids[1] = id;
+                       ids[2] = ids[ids[0]-1];
+               } else if ( ids[ids[0]-1] < id ) {
+                       ids[2] = id;
+               } else {
+                       ids[2] = ids[ids[0]-1];
+               }
                ids[0] = NOID;
        
        } else {
@@ -93,7 +101,7 @@ static int idl_insert( ID *ids, ID id )
 
 static int idl_delete( ID *ids, ID id )
 {
-       int x = bdb_idl_search( ids, id );
+       unsigned x = bdb_idl_search( ids, id );
 
        assert( x > 0 );
 
@@ -162,8 +170,14 @@ bdb_idl_insert_key(
                        (long) sizeof( ID ), (long) data.size, 0 );
                return -1;
        
-       } else if ( BDB_IS_ALLIDS(ids) ) {
-               return 0;
+       } else if ( BDB_IDL_IS_RANGE(ids) ) {
+               if( id < ids[1] ) {
+                       ids[1] = id;
+               } else if ( ids[2] > id ) {
+                       ids[2] = id;
+               } else {
+                       return 0;
+               }
 
        } else if ( data.size != (1 + ids[0]) * sizeof( ID ) ) {
                /* size mismatch */
@@ -182,8 +196,8 @@ bdb_idl_insert_key(
                        return rc;
                }
 
-               if( BDB_IS_ALLIDS( ids ) ) {
-                       data.size = sizeof( ID );
+               if( BDB_IDL_IS_RANGE( ids ) ) {
+                       data.size = BDB_IDL_RANGE_SIZE;
                } else {
                        data.size = (ids[0]+1) * sizeof( ID );
                }
@@ -239,7 +253,7 @@ bdb_idl_delete_key(
                        (long) sizeof( ID ), (long) data.size, 0 );
                return -1;
        
-       } else if ( BDB_IS_ALLIDS(ids) ) {
+       } else if ( BDB_IDL_IS_RANGE(ids) ) {
                return 0;
 
        } else if ( data.size != (1 + ids[0]) * sizeof( ID ) ) {
index d64ce7c1724b6f6ab9eeb4a2c183a24c67b105f5..111b51685d1783f865f692d0c460abfcd3651c36 100644 (file)
@@ -102,7 +102,7 @@ int bdb_id2entry(
 /*
  * idl.c
  */
-int bdb_idl_search( ID *ids, ID id );
+unsigned bdb_idl_search( ID *ids, ID id );
 
 int bdb_idl_insert_key(
        BackendDB *be,
index a4687be4018f90cacbca8e3f4b0d8329a683aeac..7c748142fb8fcfe9c482e7e6ab063d03af3ba881 100644 (file)
@@ -381,7 +381,11 @@ static int search_candidates(
        Debug(LDAP_DEBUG_TRACE, "subtree_candidates: base: \"%s\" (0x%08lx)\n",
                e->e_dn, (long) e->e_id, 0);
 
+       /* return a RANGE IDL for now */
        ids[0] = NOID;
+       ids[1] = e->e_id;
+       ids[2] = e->e_id+128;
+
        return 0;
 }
 
@@ -394,9 +398,10 @@ static ID idl_first( ID *ids, ID *cursor )
                return NOID;
        }
 
-       if ( BDB_IS_ALLIDS( ids ) ) {
-               /* XXYYZ: quick hack for testing */
-               ids[1] = 100;
+       if ( BDB_IDL_IS_RANGE( ids ) ) {
+               if( *cursor < ids[1] ) {
+                       *cursor = ids[1];
+               }
                return *cursor;
        }
 
@@ -412,8 +417,8 @@ static ID idl_first( ID *ids, ID *cursor )
 
 static ID idl_next( ID *ids, ID *cursor )
 {
-       if ( BDB_IS_ALLIDS( ids ) ) {
-               if( ++(*cursor) <= ids[1] ) {
+       if ( BDB_IDL_IS_RANGE( ids ) ) {
+               if( ids[2] <= ++(*cursor) ) {
                        return *cursor;
                }
                return NOID;