/* 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
*/
int ldbm_initialize( const char* home )
{
+#if DB_VERSION_MAJOR < 3
int err;
u_int32_t envFlags;
+#endif
if(ldbm_initialized++) return 1;
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 );
}
return NULL;
}
-#if DB_VERSION_MINOR >= 3
+#if DB_VERSION_MAJOR > 3 || DB_VERSION_MINOR >= 3
+ /* This interface appeared in 3.3 */
env->set_alloc( env, ldbm_malloc, NULL, NULL );
-#else
- env->set_malloc( env, ldbm_malloc );
#endif
env->set_errcall( env, ldbm_db_errcall );
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;
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 */
+#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;
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;
}
LDBM_RLOCK;
-#if DB_VERSION_MAJOR >= 3
+#if DB_VERSION_MAJOR >= 2
ldbm_datum_init( data );
data.flags = DB_DBT_MALLOC;
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 );
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;
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;
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;
#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 );
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 );
#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;