]> git.sur5r.net Git - openldap/blobdiff - libraries/libldbm/ldbm.c
Added support for BDB 4.1.17
[openldap] / libraries / libldbm / ldbm.c
index f10ff032f00b4f32067990a933fbfa1755780be2..31c845416f9702ee40d58d901d4b3fc088c5ad82 100644 (file)
@@ -1,7 +1,7 @@
 /* ldbm.c - ldap dbm compatibility routines */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -120,8 +120,10 @@ ldbm_db_errcall( const char *prefix, char *message )
 
 int ldbm_initialize( const char* home )
 {
+#if DB_VERSION_MAJOR < 3
        int     err;
        u_int32_t       envFlags;
+#endif
 
        if(ldbm_initialized++) return 1;
 
@@ -165,8 +167,7 @@ int ldbm_initialize( const char* home )
        if ( err ) {
 #ifdef LDAP_SYSLOG
                syslog( LOG_INFO, "ldbm_initialize(): "
-                       "FATAL error in db_appinit() : %s (%d)\n",
-                       db_strerror( err ), err );
+                       "FATAL error (%d) in db_appinit()\n", err );
 #endif
                return( 1 );
        }
@@ -230,6 +231,11 @@ DB_ENV *ldbm_initialize_env(const char *home, int dbcachesize, int *envdirok)
                return NULL;
        }
 
+#if DB_VERSION_MAJOR > 3 || DB_VERSION_MINOR >= 3
+       /* This interface appeared in 3.3 */
+       env->set_alloc( env, ldbm_malloc, NULL, NULL );
+#endif
+
        env->set_errcall( env, ldbm_db_errcall );
        env->set_errpfx( env, "==>" );
        if (dbcachesize) {
@@ -298,6 +304,9 @@ LDBM
 ldbm_open( DB_ENV *env, char *name, int rw, int mode, int dbcachesize )
 {
        LDBM            ret = NULL;
+#ifdef HAVE_EBCDIC
+       char n2[2048];
+#endif
 
 #if DB_VERSION_MAJOR >= 3
        int err;
@@ -312,16 +321,25 @@ ldbm_open( DB_ENV *env, char *name, int rw, int mode, int dbcachesize )
                return NULL;
        }
 
+#if DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR < 3
+       ret->set_malloc( ret, ldbm_malloc );
+#endif
+
        ret->set_pagesize( ret, DEFAULT_DB_PAGE_SIZE );
 
        /* likely should use ber_mem* routines */
-#if DB_VERSION_MINOR >= 3
-       ret->set_alloc( ret, ldbm_malloc, NULL, NULL );
-#else
-       ret->set_malloc( ret, ldbm_malloc );
-#endif
 
+#ifdef HAVE_EBCDIC
+       strncpy(n2, name, sizeof(n2)-1);
+       n2[sizeof(n2)-1] = '\0';
+       __atoe(n2);
+       name = n2;
+#endif
+#if DB_VERSION_MAJOR >= 4 && DB_VERSION_MINOR > 0 && DB_VERSION_PATCH >= 17
+       err = ret->open( ret, NULL, name, NULL, DB_TYPE, rw, mode);
+#else
        err = ret->open( ret, name, NULL, DB_TYPE, rw, mode);
+#endif
 
        if ( err != 0 ) {
                int tmp = errno;
@@ -387,12 +405,10 @@ void
 ldbm_close( LDBM ldbm )
 {
        LDBM_WLOCK;
-#if DB_VERSION_MAJOR >= 3
+#if DB_VERSION_MAJOR >= 2
        ldbm->close( ldbm, 0 );
-#elif DB_VERSION_MAJOR >= 2
-       (*ldbm->close)( ldbm, 0 );
 #else
-       (*ldbm->close)( ldbm );
+       ldbm->close( ldbm );
 #endif
        LDBM_WUNLOCK;
 }
@@ -413,7 +429,7 @@ ldbm_fetch( LDBM ldbm, Datum key )
 
        LDBM_RLOCK;
 
-#if DB_VERSION_MAJOR >= 3
+#if DB_VERSION_MAJOR >= 2
        ldbm_datum_init( data );
 
        data.flags = DB_DBT_MALLOC;
@@ -423,20 +439,8 @@ ldbm_fetch( LDBM ldbm, Datum key )
                data.dptr = NULL;
                data.dsize = 0;
        }
-
-#elif DB_VERSION_MAJOR >= 2
-       ldbm_datum_init( data );
-
-       data.flags = DB_DBT_MALLOC;
-
-       if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) {
-               ldbm_datum_free( ldbm, data );
-               data.dptr = NULL;
-               data.dsize = 0;
-       }
 #else
-
-       if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) {
+       if ( (rc = ldbm->get( ldbm, &key, &data, 0 )) == 0 ) {
                /* Berkeley DB 1.85 don't malloc the data for us */
                /* duplicate it for to ensure reentrancy */
                data = ldbm_datum_dup( ldbm, data );
@@ -458,19 +462,15 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
 
        LDBM_WLOCK;
 
-#if DB_VERSION_MAJOR >= 3
+#if DB_VERSION_MAJOR >= 2
        rc = ldbm->put( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC );
        rc = (-1) * rc;
-
-#elif DB_VERSION_MAJOR >= 2
-       rc = (*ldbm->put)( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC );
-       rc = (-1) * rc;
 #else
-       rc = (*ldbm->put)( ldbm, &key, &data, flags & ~LDBM_SYNC );
+       rc = ldbm->put( ldbm, &key, &data, flags & ~LDBM_SYNC );
 #endif
 
        if ( flags & LDBM_SYNC )
-               (*ldbm->sync)( ldbm, 0 );
+               ldbm->sync( ldbm, 0 );
 
        LDBM_WUNLOCK;
 
@@ -484,16 +484,13 @@ ldbm_delete( LDBM ldbm, Datum key )
 
        LDBM_WLOCK;
 
-#if DB_VERSION_MAJOR >= 3
+#if DB_VERSION_MAJOR >= 2
        rc = ldbm->del( ldbm, NULL, &key, 0 );
        rc = (-1) * rc;
-#elif DB_VERSION_MAJOR >= 2
-       rc = (*ldbm->del)( ldbm, NULL, &key, 0 );
-       rc = (-1) * rc;
 #else
-       rc = (*ldbm->del)( ldbm, &key, 0 );
+       rc = ldbm->del( ldbm, &key, 0 );
 #endif
-       (*ldbm->sync)( ldbm, 0 );
+       ldbm->sync( ldbm, 0 );
 
        LDBM_WUNLOCK;
 
@@ -517,20 +514,17 @@ ldbm_firstkey( LDBM ldbm, LDBMCursor **dbch )
        LDBM_RLOCK;
 
        /* acquire a cursor for the DB */
-# if DB_VERSION_MAJOR >= 3
+# if DB_VERSION_MAJOR >= 3 || (DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR > 5)
        rc = ldbm->cursor( ldbm, NULL, &dbci, 0 );
-# elif defined( DB_VERSION_MAJOR ) && defined( DB_VERSION_MINOR ) && \
-       (DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6)
-       rc = (*ldbm->cursor)( ldbm, NULL, &dbci );
 # else
-       rc = (*ldbm->cursor)( ldbm, NULL, &dbci, 0 );
+       rc = ldbm->cursor( ldbm, NULL, &dbci );
 # endif
 
        if( rc ) {
                key.dptr = NULL;
        } else {
                *dbch = dbci;
-               if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) {
+               if ( dbci->c_get( dbci, &key, &data, DB_NEXT ) == 0 ) {
                        ldbm_datum_free( ldbm, data );
                } else {
                        key.dptr = NULL;
@@ -543,7 +537,7 @@ ldbm_firstkey( LDBM ldbm, LDBMCursor **dbch )
 #else
        LDBM_RLOCK;
 
-       rc = (*ldbm->seq)( ldbm, &key, &data, R_FIRST );
+       rc = ldbm->seq( ldbm, &key, &data, R_FIRST );
 
        if ( rc == 0 ) {
                key = ldbm_datum_dup( ldbm, key );
@@ -572,12 +566,12 @@ ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
        ldbm_datum_free( ldbm, key );
        key.flags = data.flags = DB_DBT_MALLOC;
 
-       rc = (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT );
+       rc = dbcp->c_get( dbcp, &key, &data, DB_NEXT );
        if ( rc == 0 ) {
                ldbm_datum_free( ldbm, data );
        } else
 #else
-       rc = (*ldbm->seq)( ldbm, &key, &data, R_NEXT );
+       rc = ldbm->seq( ldbm, &key, &data, R_NEXT );
 
        if ( rc == 0 ) {
                key = ldbm_datum_dup( ldbm, key );
@@ -623,6 +617,14 @@ ldbm_open( DB_ENV *env, char *name, int rw, int mode, int dbcachesize )
 #ifdef HAVE_ST_BLKSIZE
                struct stat     st;
 #endif
+#ifdef HAVE_EBCDIC
+       char n2[2048];
+
+       strncpy(n2, name, sizeof(n2)-1);
+       n2[sizeof(n2)-1] = '\0';
+       __atoe(n2);
+       name = n2;
+#endif
 
        LDBM_WLOCK;