]> git.sur5r.net Git - openldap/commitdiff
Experimental index management. Uncomment BDB_IDL_MULTI in back-bdb.h
authorHoward Chu <hyc@openldap.org>
Thu, 6 Dec 2001 13:20:18 +0000 (13:20 +0000)
committerHoward Chu <hyc@openldap.org>
Thu, 6 Dec 2001 13:20:18 +0000 (13:20 +0000)
to activate. Needs to check limits in bdb_idl_insert_key, will get to
that later.

servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/dbcache.c
servers/slapd/back-bdb/dn2id.c
servers/slapd/back-bdb/idl.c
servers/slapd/back-bdb/proto-bdb.h

index e8f3a6ae8393f200a691824c2e1e817762bb42f5..60bbe60b9b4a7a5dd746d33f7cb074f677707f4c 100644 (file)
@@ -16,6 +16,7 @@
 LDAP_BEGIN_DECL
 
 #define BDB_FILTER_INDICES 1
+/* #define BDB_IDL_MULTI               1 */
 
 #define DN_BASE_PREFIX         SLAP_INDEX_EQUALITY_PREFIX
 #define DN_ONE_PREFIX          '%'
index 4490c105ccedd2593fff9871b8b330a3fa0fb63d..3156408e41af3895c7562e06d10e8c529b9caf25 100644 (file)
@@ -69,6 +69,10 @@ bdb_db_cache(
        }
 
        rc = db->bdi_db->set_pagesize( db->bdi_db, BDB_PAGESIZE );
+#ifdef BDB_IDL_MULTI
+       rc = db->bdi_db->set_flags( db->bdi_db, DB_DUPSORT );
+       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 5f7af6f317476c33b2cac62110faa6da79da80f1..3ed169445f3313b88c0fd32b2e9ae989184db91a 100644 (file)
@@ -117,6 +117,7 @@ bdb_dn2id_delete(
        DBTzero( &key );
        key.size = strlen( dn ) + 2;
        key.data = ch_malloc( key.size );
+       key.flags = DB_DBT_USERMEM;
        ((char *)key.data)[0] = DN_BASE_PREFIX;
        AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
 
index b3b11458a3c71ecefa7d7f4e970dae2b8631b2df..37848f09a03f80fc61b5ee1a7dc0d7370604009d 100644 (file)
@@ -227,13 +227,44 @@ bdb_idl_fetch_key(
        assert( ids != NULL );
 
        DBTzero( &data );
+
+#ifdef BDB_IDL_MULTI
+       {
+               ID buf[BDB_IDL_UM_SIZE];
+               ID *i, *j;
+               void *ptr;
+               size_t len;
+               data.data = buf;
+               data.ulen = BDB_IDL_UM_SIZEOF;
+               data.flags = DB_DBT_USERMEM;
+               rc = db->get( db, tid, key, &data, bdb->bi_db_opflags |
+                       DB_MULTIPLE );
+               if (rc == 0) {
+                       DB_MULTIPLE_INIT( ptr, &data );
+                       i = ids;
+                       while (ptr) {
+                               DB_MULTIPLE_NEXT(ptr, &data, j, len);
+                               if (j) {
+                                       ++i;
+                                       AC_MEMCPY( i, j, sizeof(ID) );
+                               }
+                       }
+                       if (ids[1] == 0) {
+                               BDB_IDL_RANGE( ids, ids[2], ids[3] );
+                       } else {
+                               ids[0] = (i - ids);
+                       }
+                       data.size = BDB_IDL_SIZEOF(ids);
+               }
+       }
+#else
        data.data = ids;
        data.ulen = BDB_IDL_UM_SIZEOF;
        data.flags = DB_DBT_USERMEM;
-
        /* fetch it */
        rc = db->get( db, tid, key, &data, bdb->bi_db_opflags );
 
+#endif
        if( rc == DB_NOTFOUND ) {
                return rc;
 
@@ -271,8 +302,10 @@ bdb_idl_insert_key(
 {
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        int     rc;
-       ID ids[BDB_IDL_DB_SIZE];
        DBT data;
+#ifndef BDB_IDL_MULTI
+       ID ids[BDB_IDL_DB_SIZE];
+#endif
 
        /* for printable keys only */
        Debug( LDAP_DEBUG_ARGS,
@@ -281,6 +314,12 @@ bdb_idl_insert_key(
 
        assert( id != NOID );
 
+       DBTzero( &data );
+#ifdef BDB_IDL_MULTI
+       data.data = &id;
+       data.size = sizeof(id);
+       data.flags = DB_DBT_USERMEM;
+#else
        data.data = ids;
        data.ulen = sizeof ids;
        data.flags = DB_DBT_USERMEM;
@@ -340,10 +379,13 @@ bdb_idl_insert_key(
 
                data.size = BDB_IDL_SIZEOF( ids );
        }
+#endif
 
        /* store the key */
        rc = db->put( db, tid, key, &data, 0 );
 
+       if( rc == DB_KEYEXIST ) rc = 0;
+
        if( rc != 0 ) {
                Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: "
                        "put failed: %s (%d)\n",
@@ -362,8 +404,10 @@ bdb_idl_delete_key(
 {
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        int     rc;
-       ID ids[BDB_IDL_DB_SIZE];
        DBT data;
+#ifndef BDB_IDL_MULTI
+       ID ids[BDB_IDL_DB_SIZE];
+#endif
 
        /* for printable keys only */
        Debug( LDAP_DEBUG_ARGS,
@@ -372,6 +416,23 @@ bdb_idl_delete_key(
 
        assert( id != NOID );
 
+       DBTzero( &data );
+#ifdef BDB_IDL_MULTI
+       {
+               DBC *cursor;
+
+               data.data = &id;
+               data.size = sizeof( id );
+               data.ulen = data.size;
+               data.flags = DB_DBT_USERMEM;
+
+               rc = db->cursor( db, tid, &cursor, bdb->bi_db_opflags );
+               rc = cursor->c_get( cursor, key, &data, bdb->bi_db_opflags |
+                       DB_GET_BOTH | DB_RMW  );
+               rc = cursor->c_del( cursor, 0 );
+               rc = cursor->c_close( cursor );
+       }
+#else
        data.data = ids;
        data.ulen = sizeof( ids );
        data.flags = DB_DBT_USERMEM;
@@ -429,6 +490,8 @@ bdb_idl_delete_key(
        /* store the key */
        rc = db->put( db, tid, key, &data, 0 );
 
+#endif /* BDB_IDL_MULTI */
+
        if( rc != 0 ) {
                Debug( LDAP_DEBUG_ANY,
                        "=> bdb_idl_delete_key: put failed: %s (%d)\n",
index 57d3b8f57a3b3d3598cabc6de0e8d1d347710ede..ed31f363f5c105b57f44324a1fe1771151c3a0d8 100644 (file)
@@ -167,6 +167,11 @@ int bdb_id2entry(
  */
 unsigned bdb_idl_search( ID *ids, ID id );
 
+int bdb_bt_compare(
+       DB *db,
+       const DBT *a,
+       const DBT *b );
+
 int bdb_idl_fetch_key(
        BackendDB *be,
        DB *db,