]> git.sur5r.net Git - openldap/commitdiff
Added support for SleepyCat DB2 DBI.
authorKurt Zeilenga <kurt@openldap.org>
Thu, 3 Sep 1998 00:50:13 +0000 (00:50 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Thu, 3 Sep 1998 00:50:13 +0000 (00:50 +0000)
Derived from public posting to ldap@umich.edu
by Kurt Spanier <kurt.spanier@zdv.uni-tuebingen.de>
See Make-common.dist for DB2 options

13 files changed:
Make-common.dist
include/ldbm.h
libraries/libldbm/ldbm.c
servers/slapd/back-ldbm/back-ldbm.h
servers/slapd/back-ldbm/dbcache.c
servers/slapd/back-ldbm/dn2id.c
servers/slapd/back-ldbm/id2children.c
servers/slapd/back-ldbm/id2entry.c
servers/slapd/back-ldbm/idl.c
servers/slapd/back-ldbm/index.c
servers/slapd/tools/centipede.c
servers/slapd/tools/ldbmcat.c
servers/slapd/tools/ldbmtest.c

index dec90d498af9cb6a7cf8357cd05c29ab7c07b2a1..997b722722648aab41643e34942347dcca9966d4 100644 (file)
@@ -144,6 +144,8 @@ SLAPD_BACKENDS= -DLDAP_LDBM -DLDAP_SHELL -DLDAP_PASSWD
 # standard unix ndbm
 
 # Fallback settings, defaults are set in build/*/Make-platform
+#   The NDBM interface may not work on some (any) platforms.
+#      You may be happier with Berkeley DB B-trees.
 LDBMBACKEND?=-DLDBM_USE_NDBM
 LDBMINCLUDE?=
 LDBMLIB?=
@@ -163,8 +165,13 @@ LDBMLIB?=
 #LDBMINCLUDE=-I/usr/local/gdbm/include
 #LDBMLIB=-lgdbm
 
-#undef these if you have SLEEPYCAT DB2 installed
-#LDBMBACKEND=-DLDBM_USE_DBBTREE -DHAVE_SLEEPYCAT_DB2
+#undef these if you have SleepyCat DB2 installed the updated DBI
+#LDBMBACKEND=-DLDBM_USE_DBBTREE -DLDBM_USE_DB2
+#LDBMINCLUDE=-I/usr/local/include
+#LDBMLIB=-L/usr/local/lib -ldb
+
+#undef these if you have SleepyCat DB2 installed (with compat185)
+#LDBMBACKEND=-DLDBM_USE_DBBTREE -DLDBM_USE_DB2_COMPAT185
 #LDBMINCLUDE=-I/usr/local/include
 #LDBMLIB=-L/usr/local/lib -ldb
 
index 1e3c61410c52a63442b7e8ab181bf0e5da32bc97..f31f135ff8504e284811fc99bcd5902d7e5a2fa9 100644 (file)
@@ -47,10 +47,14 @@ extern gdbm_error   gdbm_errno;
 #include <limits.h>
 #include <fcntl.h>
 
-#ifdef HAVE_SLEEPYCAT_DB2
+#ifdef LDBM_USE_DB2_COMPAT185
 #      include <db_185.h>
 #else
 #      include <db.h>
+#      ifdef LDBM_USE_DB2
+#              define R_NOOVERWRITE DB_NOOVERWRITE
+#              define DEFAULT_DB_PAGE_SIZE 1024
+#      endif
 #endif
 
 typedef DBT    Datum;
@@ -62,11 +66,18 @@ typedef DB  *LDBM;
 #define DB_TYPE                DB_HASH
 
 /* for ldbm_open */
-#define LDBM_READER    O_RDONLY
-#define LDBM_WRITER    O_RDWR
-#define LDBM_WRCREAT   (O_RDWR|O_CREAT)
-#define LDBM_NEWDB     (O_RDWR|O_TRUNC|O_CREAT)
-#define LDBM_FAST      0
+#ifdef LDBM_USE_DB2
+#      define LDBM_READER      DB_RDONLY
+#      define LDBM_WRITER      0x00000      /* hopefully */
+#      define LDBM_WRCREAT     (DB_NOMMAP|DB_CREATE|DB_THREAD)
+#      define LDBM_NEWDB       (DB_TRUNCATE|DB_CREATE|DB_THREAD)
+#else
+#      define LDBM_READER      O_RDONLY
+#      define LDBM_WRITER      O_RDWR
+#      define LDBM_WRCREAT     (O_RDWR|O_CREAT)
+#      define LDBM_NEWDB       (O_RDWR|O_TRUNC|O_CREAT)
+#      define LDBM_FAST        0
+#endif
 
 #define LDBM_SUFFIX    ".dbh"
 
@@ -90,12 +101,18 @@ extern int errno;
 #include <sys/types.h>
 #include <limits.h>
 #include <fcntl.h>
-#ifdef HAVE_SLEEPYCAT_DB2
+
+#ifdef LDBM_USE_DB2_COMPAT185
 #      include <db_185.h>
 #else
 #      include <db.h>
+#      ifdef LDBM_USE_DB2
+#              define R_NOOVERWRITE DB_NOOVERWRITE
+#              define DEFAULT_DB_PAGE_SIZE 1024
+#      endif
 #endif
 
+
 typedef DBT    Datum;
 #define dsize  size
 #define dptr   data
@@ -105,11 +122,19 @@ typedef DB        *LDBM;
 #define DB_TYPE                DB_BTREE
 
 /* for ldbm_open */
-#define LDBM_READER    O_RDONLY
-#define LDBM_WRITER    O_RDWR
-#define LDBM_WRCREAT   (O_RDWR|O_CREAT)
-#define LDBM_NEWDB     (O_RDWR|O_TRUNC|O_CREAT)
-#define LDBM_FAST      0
+#ifdef LDBM_USE_DB2
+#      define LDBM_READER      DB_RDONLY
+#      define LDBM_WRITER      0x00000      /* hopefully */
+#      define LDBM_WRCREAT     (DB_NOMMAP|DB_CREATE|DB_THREAD)
+#      define LDBM_NEWDB       (DB_TRUNCATE|DB_CREATE|DB_THREAD)
+#else
+#      define LDBM_READER      O_RDONLY
+#      define LDBM_WRITER      O_RDWR
+#      define LDBM_WRCREAT     (O_RDWR|O_CREAT)
+#      define LDBM_NEWDB       (O_RDWR|O_TRUNC|O_CREAT)
+#endif
+
+#  define LDBM_FAST    0
 
 #define LDBM_SUFFIX    ".dbb"
 #define LDBM_ORDERED   1
@@ -159,6 +184,7 @@ typedef DBM *LDBM;
 #endif /* db btree */
 #endif /* gdbm */
 
+int    ldbm_errno( LDBM ldbm );
 LDBM   ldbm_open( char *name, int rw, int mode, int dbcachesize );
 void   ldbm_close( LDBM ldbm );
 void   ldbm_sync( LDBM ldbm );
@@ -167,8 +193,14 @@ Datum      ldbm_datum_dup( LDBM ldbm, Datum data );
 Datum  ldbm_fetch( LDBM ldbm, Datum key );
 int    ldbm_store( LDBM ldbm, Datum key, Datum data, int flags );
 int    ldbm_delete( LDBM ldbm, Datum key );
-Datum  ldbm_firstkey( LDBM ldbm );
-Datum  ldbm_nextkey( LDBM ldbm, Datum key );
-int    ldbm_errno( LDBM ldbm );
+
+#if LDBM_USE_DB2
+       void   *ldbm_malloc( size_t size );
+       Datum   ldbm_firstkey( LDBM ldbm, DBC **dbch );
+       Datum   ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp );
+#else
+       Datum   ldbm_firstkey( LDBM ldbm );
+       Datum   ldbm_nextkey( LDBM ldbm, Datum key );
+#endif
 
 #endif /* _ldbm_h_ */
index 6d15e4629e8a3f6881c4893eedc2c9eee6f79b57..d4ff0d395cd6e0ce2f0d51ed2793baa11eaa8af3 100644 (file)
@@ -1,5 +1,11 @@
 /* ldbm.c - ldap dbm compatibility routines */
 
+/* Patched for Berkeley DB version 2.0; /KSp; 98/02/23
+ *
+ *   - basic implementation; 1998/02/23, /KSp
+ *   - DB_DBT_MALLOC       ; 1998/03/22, /KSp
+ */
+
 #include <stdio.h>
 #include "ldbm.h"
 
@@ -121,10 +127,41 @@ ldbm_errno( LDBM ldbm )
  *                                                               *
  *****************************************************************/
 
+#ifdef LDBM_USE_DB2
+/*************************************************
+ *                                               *
+ *  A malloc routine for use with DB_DBT_MALLOC  *
+ *                                               *
+ *************************************************/
+
+#include <stdlib.h>
+
+
+void *
+ldbm_malloc( size_t size )
+{
+       return( calloc( 1, size ));
+}
+
+#endif
+
+
 LDBM
 ldbm_open( char *name, int rw, int mode, int dbcachesize )
 {
-       LDBM            ret;
+       LDBM            ret = NULL;
+
+#ifdef LDBM_USE_DB2
+       DB_INFO         dbinfo;
+
+       memset( &dbinfo, 0, sizeof( dbinfo ));
+       dbinfo.db_cachesize = dbcachesize;
+       dbinfo.db_pagesize  = DEFAULT_DB_PAGE_SIZE;
+       dbinfo.db_malloc    = ldbm_malloc;
+
+       db_open( name, DB_TYPE, rw, mode, NULL, &dbinfo, &ret );
+
+#else
        void            *info;
        BTREEINFO       binfo;
        HASHINFO        hinfo;
@@ -140,14 +177,22 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
        } else {
                info = NULL;
        }
+
        ret = dbopen( name, rw, mode, DB_TYPE, info );
+
+#endif
+
        return( ret );
 }
 
 void
 ldbm_close( LDBM ldbm )
 {
+#ifdef LDBM_USE_DB2
+       (*ldbm->close)( ldbm, 0 );
+#else
        (*ldbm->close)( ldbm );
+#endif
 }
 
 void
@@ -167,6 +212,10 @@ ldbm_datum_dup( LDBM ldbm, Datum data )
 {
        Datum   dup;
 
+#ifdef LDBM_USE_DB2
+       memset( &dup, 0, sizeof( dup ));
+#endif
+
        if ( data.dsize == 0 ) {
                dup.dsize = 0;
                dup.dptr = NULL;
@@ -186,9 +235,18 @@ ldbm_fetch( LDBM ldbm, Datum key )
        Datum   data;
        int     rc;
 
+#ifdef LDBM_USE_DB2
+       memset( &data, 0, sizeof( data ));
+
+       data.flags = DB_DBT_MALLOC;
+
+       if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) {
+               if ( data.dptr ) free( data.dptr );
+#else
        if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) {
                data = ldbm_datum_dup( ldbm, data );
        } else {
+#endif
                data.dptr = NULL;
                data.dsize = 0;
        }
@@ -201,7 +259,12 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
 {
        int     rc;
 
+#ifdef LDBM_USE_DB2
+       rc = (*ldbm->put)( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC );
+       rc = (-1 ) * rc;
+#else
        rc = (*ldbm->put)( ldbm, &key, &data, flags & ~LDBM_SYNC );
+#endif
        if ( flags & LDBM_SYNC )
                (*ldbm->sync)( ldbm, 0 );
        return( rc );
@@ -212,38 +275,88 @@ ldbm_delete( LDBM ldbm, Datum key )
 {
        int     rc;
 
+#ifdef LDBM_USE_DB2
+       rc = (*ldbm->del)( ldbm, NULL, &key, 0 );
+       rc = (-1 ) * rc;
+#else
        rc = (*ldbm->del)( ldbm, &key, 0 );
+#endif
        (*ldbm->sync)( ldbm, 0 );
        return( rc );
 }
 
 Datum
+#ifdef LDBM_USE_DB2
+ldbm_firstkey( LDBM ldbm, DBC **dbch )
+#else
 ldbm_firstkey( LDBM ldbm )
+#endif
 {
        Datum   key, data;
        int     rc;
 
+#ifdef LDBM_USE_DB2
+       DBC  *dbci;
+
+       memset( &key, 0, sizeof( key ));
+       memset( &data, 0, sizeof( data ));
+
+       key.flags = data.flags = DB_DBT_MALLOC;
+
+       /* acquire a cursor for the DB */
+       if ( (*ldbm->cursor)( ldbm, NULL, &dbci )) {
+               return( key );
+       } else {
+               *dbch = dbci;
+               if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) {
+                       if ( data.dptr ) free( data.dptr );
+#else
        if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_FIRST )) == 0 ) {
                key = ldbm_datum_dup( ldbm, key );
+#endif
        } else {
                key.dptr = NULL;
                key.dsize = 0;
        }
+
+#ifdef LDBM_USE_DB2
+       }
+#endif
+
        return( key );
 }
 
 Datum
+#ifdef LDBM_USE_DB2
+ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp )
+#else
 ldbm_nextkey( LDBM ldbm, Datum key )
+#endif
 {
        Datum   data;
        int     rc;
 
+#ifdef LDBM_USE_DB2
+       void *oldKey = key.dptr;
+
+       memset( &data, 0, sizeof( data ));
+
+       data.flags = DB_DBT_MALLOC;
+
+       if ( (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ) == 0 ) {
+               if ( data.dptr ) free( data.dptr );
+#else
        if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_NEXT )) == 0 ) {
                key = ldbm_datum_dup( ldbm, key );
+#endif
        } else {
                key.dptr = NULL;
                key.dsize = 0;
        }
+#ifdef LDBM_USE_DB2
+       if ( oldKey ) free( oldKey );
+#endif
+
        return( key );
 }
 
index 4668e7554df5bc858f48766d06424f714ffb3feb..e3099ab21a154418c4275ee19dcad1ae480329ac 100644 (file)
@@ -6,7 +6,13 @@
 #include "ldbm.h"
 
 #define DEFAULT_CACHE_SIZE     1000
-#define DEFAULT_DBCACHE_SIZE   100000
+
+#ifdef LDBM_USE_DB2
+#      define DEFAULT_DBCACHE_SIZE (100 * DEFAULT_DB_PAGE_SIZE)
+#else
+#      define DEFAULT_DBCACHE_SIZE 100000
+#endif
+
 #define DEFAULT_DB_DIRECTORY   "/usr/tmp"
 #define DEFAULT_MODE           0600
 
index c16c8b160dfdfe210188465c5e9f19fe74636ad4..56c259c8698d6f1a4b2130f443076acacdb983c3 100644 (file)
@@ -176,6 +176,9 @@ ldbm_cache_fetch(
 )
 {
        Datum   data;
+#ifdef LDBM_USE_DB2
+       memset( &data, 0, sizeof( data ) );
+#endif
 
        pthread_mutex_lock( &db->dbc_mutex );
 #ifdef reentrant_database
@@ -216,6 +219,24 @@ ldbm_cache_store(
        }
 #endif
 
+#ifdef LDBM_DEBUG
+       Statslog( LDAP_DEBUG_STATS,
+               "=> ldbm_cache_store(): key.dptr=%s, key.dsize=%d\n",
+               key.dptr, key.dsize, 0, 0, 0 );
+
+       Statslog( LDAP_DEBUG_STATS,
+               "=> ldbm_cache_store(): key.dptr=0x%08x, data.dptr=0x%0 8x\n",
+               key.dptr, data.dptr, 0, 0, 0 );
+
+       Statslog( LDAP_DEBUG_STATS,
+               "=> ldbm_cache_store(): data.dptr=%s, data.dsize=%d\n",
+               data.dptr, data.dsize, 0, 0, 0 );
+
+       Statslog( LDAP_DEBUG_STATS,
+               "=> ldbm_cache_store(): flags=0x%08x\n",
+               flags, 0, 0, 0, 0 );
+#endif /* LDBM_DEBUG */
+
        rc = ldbm_store( db->dbc_db, key, data, flags );
 
        pthread_mutex_unlock( &db->dbc_mutex );
index 45eeec8f10fea9412a5771dc9c902314b8021719..7d142b311db584d6980354700d23840f4da29fb1 100644 (file)
@@ -25,6 +25,11 @@ dn2id_add(
        Datum           key, data;
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+       memset( &data, 0, sizeof( data ) );
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "=> dn2id_add( \"%s\", %ld )\n", dn, id, 0 );
 
        if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
@@ -66,6 +71,10 @@ dn2id(
        ID              id;
        Datum           key, data;
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+       memset( &data, 0, sizeof( data ) );
+#endif
 
        dn = strdup( dn );
        dn_normalize_case( dn );
@@ -122,6 +131,10 @@ dn2id_delete(
        Datum           key;
        int             rc;
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "=> dn2id_delete( \"%s\" )\n", dn, 0, 0 );
 
        if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
index 3b2c55d202170c4f13ef836525b711037b752502..7210eece0dcf29d47795d11dece11166acd5b1bb 100644 (file)
@@ -23,6 +23,11 @@ id2children_add(
        IDList          *idl;
        char            buf[20];
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+       memset( &data, 0, sizeof( data ) );
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "=> id2children_add( %d, %d )\n", p ? p->e_id
            : 0, e->e_id, 0 );
 
@@ -63,6 +68,10 @@ has_children(
        IDList          *idl;
        char            buf[20];
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "=> has_children( %d )\n", p->e_id , 0, 0 );
 
        if ( (db = ldbm_cache_open( be, "id2children", LDBM_SUFFIX,
index f5a51089d71dd6b5c20cc4bdb30843a4f4a3cdcd..505ea8863a1b226708d1f2a8cf8b30310b87a870 100644 (file)
@@ -22,6 +22,11 @@ id2entry_add( Backend *be, Entry *e )
        Datum           key, data;
        int             len, rc, flags;
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+       memset( &data, 0, sizeof( data ) );
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "=> id2entry_add( %d, \"%s\" )\n", e->e_id,
            e->e_dn, 0 );
 
@@ -61,6 +66,10 @@ id2entry_delete( Backend *be, Entry *e )
        Datum           key;
        int             rc;
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "=> id2entry_delete( %d, \"%s\" )\n", e->e_id,
            e->e_dn, 0 );
 
@@ -95,6 +104,11 @@ id2entry( Backend *be, ID id )
        Datum           key, data;
        Entry           *e;
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+       memset( &data, 0, sizeof( data ) );
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "=> id2entry( %ld )\n", id, 0, 0 );
 
        if ( (e = cache_find_entry_id( &li->li_cache, id )) != NULL ) {
index 8a249fe0482b49bd480cb6467eb0a50d9af47a31..b693c0ce4ef59bf138549996b662d300a106bfa5 100644 (file)
@@ -59,6 +59,11 @@ idl_fetch_one(
        char    *kstr;
        int     i, nids;
 
+#ifdef LDBM_USE_DB2
+       memset( &k2, 0, sizeof( k2 ) );
+       memset( &data, 0, sizeof( data ) );
+#endif
+
        /* Debug( LDAP_DEBUG_TRACE, "=> idl_fetch_one\n", 0, 0, 0 ); */
 
        data = ldbm_cache_fetch( db, key );
@@ -81,6 +86,11 @@ idl_fetch(
        char    *kstr;
        int     i, nids;
 
+#ifdef LDBM_USE_DB2
+       memset( &k2, 0, sizeof( k2 ) );
+       memset( &data, 0, sizeof( data ) );
+#endif
+
        /* Debug( LDAP_DEBUG_TRACE, "=> idl_fetch\n", 0, 0, 0 ); */
 
        data = ldbm_cache_fetch( db, key );
@@ -170,11 +180,20 @@ idl_store(
        Datum   data;
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
 
+#ifdef LDBM_USE_DB2
+       memset( &data, 0, sizeof( data ) );
+#endif
+
        /* Debug( LDAP_DEBUG_TRACE, "=> idl_store\n", 0, 0, 0 ); */
 
        data.dptr = (char *) idl;
        data.dsize = (2 + idl->b_nmax) * sizeof(ID);
        
+#ifdef LDBM_DEBUG
+       Statslog( LDAP_DEBUG_STATS, "<= idl_store(): rc=%d\n",
+               rc, 0, 0, 0, 0 );
+#endif
+
        flags = LDBM_REPLACE;
        if( li->li_flush_wrt ) flags |= LDBM_SYNC;
        rc = ldbm_cache_store( db, key, data, flags );
@@ -283,7 +302,16 @@ idl_insert_key(
        char    *kstr;
        Datum   k2;
 
+#ifdef LDBM_USE_DB2
+       memset( &k2, 0, sizeof( k2 ) );
+#endif
+
        if ( (idl = idl_fetch_one( be, db, key )) == NULL ) {
+#ifdef LDBM_DEBUG
+               Statslog( LDAP_DEBUG_STATS, "=> idl_insert_key(): no key yet\n",
+                       0, 0, 0, 0, 0 );
+#endif
+
                idl = idl_alloc( 1 );
                idl->b_ids[idl->b_nids++] = id;
                rc = idl_store( be, db, key, idl );
index 100b058b735674991d6e74d96c9fe96a3d08166f..bf1f55de35cfb5ca20dc877e5b00771e8e2cfda8 100644 (file)
@@ -105,6 +105,10 @@ index_read(
        char            *realval, *tmpval;
        char            buf[BUFSIZ];
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+#endif
+
        prefix = index2prefix( indextype );
        Debug( LDAP_DEBUG_TRACE, "=> index_read( \"%s\" \"%c\" \"%s\" )\n",
            type, prefix, val );
@@ -175,6 +179,10 @@ add_value(
        char    *realval, *tmpval, *s;
        char    buf[BUFSIZ];
 
+#ifdef LDBM_USE_DB2
+       memset( &key, 0, sizeof( key ) );
+#endif
+
        prefix = index2prefix( indextype );
        Debug( LDAP_DEBUG_TRACE, "=> add_value( \"%c%s\" )\n", prefix, val, 0 );
 
index 9919232b7aa31fd9b5fcc039e5125d8ba13ea7ef..fc2b72aa93598088ea6e18263b6dd7b366c016da 100644 (file)
@@ -556,6 +556,11 @@ diff_centroids(
        int             amax, acur, dmax, dcur;
        char    **vals;
 
+#ifdef LDBM_USE_DB2
+       DBC     *ocursorp;
+       DBC     *ncursorp;
+#endif /* LDBM_USE_DB2 */
+
        if ( verbose ) {
                printf( "Generating mods for differential %s centroid...", attr );
                fflush( stdout );
@@ -600,8 +605,14 @@ diff_centroids(
 
        olast.dptr = NULL;
        nlast.dptr = NULL;
+#ifdef LDBM_USE_DB2
+       for ( okey = ldbm_firstkey( oldbm, &ocursorp ),
+                       nkey = ldbm_firstkey( nldbm, &ncursorp );
+             okey.dptr != NULL && nkey.dptr != NULL; )
+#else
        for ( okey = ldbm_firstkey( oldbm ), nkey = ldbm_firstkey( nldbm );
              okey.dptr != NULL && nkey.dptr != NULL; )
+#endif
        {
                rc = strcmp( okey.dptr, nkey.dptr );
 
@@ -616,8 +627,13 @@ diff_centroids(
                        }
                        nlast = nkey;
 
+#ifdef LDBM_USE_DB2
+                       okey = ldbm_nextkey( oldbm, olast, ocursorp );
+                       nkey = ldbm_nextkey( nldbm, nlast, ncursorp );
+#else
                        okey = ldbm_nextkey( oldbm, olast );
                        nkey = ldbm_nextkey( nldbm, nlast );
+#endif
                } else if ( rc > 0 ) {
                        /* new value is not in old centroid - add it */
                        if ( charray_add_dup( &avals, &acur, &amax, nkey.dptr ) == NULL ) {
@@ -629,7 +645,12 @@ diff_centroids(
                                ldbm_datum_free( nldbm, nlast );
                        }
                        nlast = nkey;
+
+#ifdef LDBM_USE_DB2
+                       nkey = ldbm_nextkey( nldbm, nlast, ncursorp );
+#else
                        nkey = ldbm_nextkey( nldbm, nlast );
+#endif
                } else {
                        /* old value is not in new centroid - delete it */
                        if ( charray_add_dup( &dvals, &dcur, &dmax, okey.dptr ) == NULL ) {
@@ -641,7 +662,12 @@ diff_centroids(
                                ldbm_datum_free( oldbm, olast );
                        }
                        olast = okey;
+
+#ifdef LDBM_USE_DB2
+                       okey = ldbm_nextkey( oldbm, olast, ocursorp );
+#else
                        okey = ldbm_nextkey( oldbm, olast );
+#endif
                }
        }
 
@@ -651,7 +677,11 @@ diff_centroids(
                        return( NULL );
                }
 
+#ifdef LDBM_USE_DB2
+               okey = ldbm_nextkey( oldbm, olast, ocursorp );
+#else
                okey = ldbm_nextkey( oldbm, olast );
+#endif
                if ( olast.dptr != NULL ) {
                        ldbm_datum_free( oldbm, olast );
                }
@@ -666,7 +696,11 @@ diff_centroids(
                        return( NULL );
                }
 
+#ifdef LDBM_USE_DB2
+               nkey = ldbm_nextkey( nldbm, nlast, ncursorp );
+#else
                nkey = ldbm_nextkey( nldbm, nlast );
+#endif
                if ( nlast.dptr != NULL ) {
                        ldbm_datum_free( nldbm, nlast );
                }
@@ -687,8 +721,14 @@ diff_centroids(
 
        /* generate list of values to add */
        lastkey.dptr = NULL;
+#ifdef LDBM_USE_DB2
+       for ( key = ldbm_firstkey( nldbm, &ncursorp ); key.dptr != NULL;
+         key = ldbm_nextkey( nldbm, lastkey, ncursorp ) )
+#else
        for ( key = ldbm_firstkey( nldbm ); key.dptr != NULL;
-         key = ldbm_nextkey( nldbm, lastkey ) ) {
+         key = ldbm_nextkey( nldbm, lastkey ) )
+#endif
+       {
                /* see if it's in the old one */
                data = ldbm_fetch( oldbm, key );
 
@@ -712,8 +752,14 @@ diff_centroids(
 
        /* generate list of values to delete */
        lastkey.dptr = NULL;
+#ifdef LDBM_USE_DB2
+       for ( key = ldbm_firstkey( oldbm, &ocursorp ); key.dptr != NULL;
+         key = ldbm_nextkey( oldbm, lastkey, ocursorp ) )
+#else
        for ( key = ldbm_firstkey( oldbm ); key.dptr != NULL;
-         key = ldbm_nextkey( oldbm, lastkey ) ) {
+         key = ldbm_nextkey( oldbm, lastkey ) )
+#endif
+       {
                /* see if it's in the new one */
                data = ldbm_fetch( nldbm, key );
 
@@ -773,6 +819,10 @@ full_centroid(
        char    **vals;
        int             vcur, vmax;
 
+#ifdef LDBM_USE_DB2
+       DBC *cursorp;
+#endif
+
        if ( verbose ) {
                printf( "Generating mods for full %s centroid...", attr );
                fflush( stdout );
@@ -800,8 +850,14 @@ full_centroid(
        lastkey.dptr = NULL;
        vals = NULL;
        vcur = vmax = 0;
+#ifdef LDBM_USE_DB2
+       for ( key = ldbm_firstkey( ldbm, &cursorp ); key.dptr != NULL;
+         key = ldbm_nextkey( ldbm, lastkey, cursorp ) )
+#else
        for ( key = ldbm_firstkey( ldbm ); key.dptr != NULL;
-         key = ldbm_nextkey( ldbm, lastkey ) ) {
+         key = ldbm_nextkey( ldbm, lastkey ) )
+#endif
+       {
                if ( charray_add_dup( &vals, &vcur, &vmax, key.dptr ) == NULL ) {
                        ldap_mods_free( mods, 1 );
                        return( NULL );
index 79465df072ef442648214c7c973a2e1d3d0f87bb..de106e1ac7dff898f7ab5ead7be22278d3e2eb7a 100644 (file)
@@ -24,6 +24,10 @@ main( argc, argv )
        char            *file, *s;
        int             printid = 1;
 
+#ifdef LDBM_USE_DB2
+       DBC     *cursorp;
+#endif
+
        if ( argc < 2 || argc > 3 || ( argc == 3 && strcmp( argv[1], "-n" )
            != 0 )) {
                usage( argv[0] );
@@ -41,8 +45,15 @@ main( argc, argv )
        }
 
         last.dptr = NULL;
+
+#ifdef LDBM_USE_DB2
+        for ( key = ldbm_firstkey( dbp, &cursorp ); key.dptr != NULL;
+            key = ldbm_nextkey( dbp, last, cursorp ) )
+#else
         for ( key = ldbm_firstkey( dbp ); key.dptr != NULL;
-            key = ldbm_nextkey( dbp, last ) ) {
+            key = ldbm_nextkey( dbp, last ) )
+#endif
+       {
                 if ( last.dptr != NULL )
                         ldbm_datum_free( dbp, last );
                 data = ldbm_fetch( dbp, key );
index 56513ab5b84a11a7922ac31b82601349b0e88456..13e0f9558015986636009b4945e5d05332f4a405 100644 (file)
@@ -64,6 +64,10 @@ main( argc, argv )
        int             i;
        extern char     *optarg;
 
+#ifdef LDBM_USE_DB2
+       DBC     *cursorp;
+#endif
+
        tailorfile = SLAPD_DEFAULT_CONFIGFILE;
        while ( (i = getopt( argc, argv, "d:f:" )) != EOF ) {
                switch ( i ) {
@@ -151,9 +155,16 @@ main( argc, argv )
                        }
 
                        savekey.dptr = NULL;
+#ifdef LDBM_USE_DB2
+                       for ( key = ldbm_firstkey( dbc->dbc_db, &cursorp );
+                           key.dptr != NULL;
+                           key = ldbm_nextkey( dbc->dbc_db, key, cursorp ) )
+#else
                        for ( key = ldbm_firstkey( dbc->dbc_db );
                            key.dptr != NULL;
-                           key = ldbm_nextkey( dbc->dbc_db, key ) ) {
+                           key = ldbm_nextkey( dbc->dbc_db, key ) )
+#endif
+                       {
                                if ( savekey.dptr != NULL )
                                        ldbm_datum_free( dbc->dbc_db, savekey );
                                savekey = key;
@@ -313,8 +324,16 @@ main( argc, argv )
                        }
 
                        last.dptr = NULL;
+
+#ifdef LDBM_USE_DB2
+                       for ( key = ldbm_firstkey( dbp, &cursorp );
+                               key.dptr != NULL;
+                               key = ldbm_nextkey( dbp, last, cursorp ) )
+#else
                        for ( key = ldbm_firstkey( dbp ); key.dptr != NULL;
-                           key = ldbm_nextkey( dbp, last ) ) {
+                           key = ldbm_nextkey( dbp, last ) )
+#endif
+                       {
                                if ( last.dptr != NULL ) {
                                        ldbm_datum_free( dbp, last );
                                }