]> git.sur5r.net Git - openldap/blobdiff - libraries/libldbm/ldbm.c
Force sd close. Suggested by rajk@home.com
[openldap] / libraries / libldbm / ldbm.c
index a3522ee2e7556214781e431123b10d7bd5e10d0e..59305bb582aef4006421884932d230a5ec1c36f7 100644 (file)
@@ -1,4 +1,9 @@
 /* ldbm.c - ldap dbm compatibility routines */
+/* $OpenLDAP$ */
+/*
+ * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
 
 /* Patched for Berkeley DB version 2.0; /KSp; 98/02/23
  *
@@ -54,13 +59,19 @@ ldbm_datum_dup( LDBM ldbm, Datum data )
 
 static int ldbm_initialized = 0;
 
-#ifndef HAVE_BERKELEY_DB2
-/* Everything but DB2 is non-reentrant */
-
+#ifndef HAVE_BERKELEY_DB2_DB_THREAD
+/* Only DB2 with DB_THREAD is thread-free */
 static ldap_pvt_thread_mutex_t ldbm_big_mutex;
 #define LDBM_LOCK      (ldap_pvt_thread_mutex_lock(&ldbm_big_mutex))
 #define LDBM_UNLOCK    (ldap_pvt_thread_mutex_unlock(&ldbm_big_mutex))
 
+#else
+#define LDBM_LOCK      ((void)0)
+#define LDBM_UNLOCK    ((void)0)
+#endif
+
+#ifndef HAVE_BERKELEY_DB2
+
 int ldbm_initialize( void )
 {
        if(ldbm_initialized++) return 1;
@@ -103,14 +114,10 @@ ldbm_db_errcall( const char *prefix, char *message )
 static DB_ENV    ldbm_Env_internal;
 DB_ENV           *ldbm_Env = NULL;
 
-/* Berkeley DB 2.x is reentrant */
-#define LDBM_LOCK      ((void)0)
-#define LDBM_UNLOCK    ((void)0)
-
 int ldbm_initialize( void )
 {
        int     err;
-       int     envFlags;
+       u_int32_t       envFlags;
 
        if(ldbm_initialized++) return 1;
 
@@ -120,7 +127,11 @@ int ldbm_initialize( void )
        ldbm_Env->db_errcall   = ldbm_db_errcall;
        ldbm_Env->db_errpfx    = "==>";
 
-       envFlags = DB_CREATE | DB_THREAD;
+       envFlags = DB_CREATE
+#ifdef HAVE_BERKELEY_DB2_DB_THREAD
+               | DB_THREAD
+#endif
+               ;
 
        if ( ( err = db_appinit( NULL, NULL, ldbm_Env, envFlags )) ) {
                char  error[BUFSIZ];
@@ -310,16 +321,12 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-#ifdef HAVE_BERKELEY_DB2
-ldbm_firstkey( LDBM ldbm, DBC **dbch )
-#else
-ldbm_firstkey( LDBM ldbm )
-#endif
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbch )
 {
        Datum   key, data;
 
 #ifdef HAVE_BERKELEY_DB2
-       DBC  *dbci;
+       LDBMCursor  *dbci;
 
        ldbm_datum_init( key );
        ldbm_datum_init( data );
@@ -371,11 +378,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-#ifdef HAVE_BERKELEY_DB2
-ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp )
-#else
-ldbm_nextkey( LDBM ldbm, Datum key )
-#endif
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum   data;
 
@@ -445,12 +448,16 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
 
 #ifdef HAVE_ST_BLKSIZE
        if ( dbcachesize > 0 && stat( name, &st ) == 0 ) {
-               dbcachesize = (dbcachesize / st.st_blksize);
+               dbcachesize /= st.st_blksize;
+               if( dbcachesize == 0 ) dbcachesize = 1;
                gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
        }
 #else
-       dbcachesize = (dbcachesize / 4096);
-       gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
+       if ( dbcachesize > 0 ) {
+               dbcachesize /= 4096;
+               if( dbcachesize == 0 ) dbcachesize = 1;
+               gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
+       }
 #endif
 
        LDBM_UNLOCK;
@@ -514,7 +521,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
        Datum d;
 
@@ -526,7 +533,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum d;
 
@@ -625,7 +632,7 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
 
        return( db );
 
-}/* LDBM ldbm_open() */
+}
 
 
 
@@ -651,7 +658,7 @@ ldbm_close( LDBM ldbm )
        fflush( stdout );
 #endif
 
-}/* void ldbm_close() */
+}
 
 
 
@@ -668,7 +675,7 @@ ldbm_sync( LDBM ldbm )
        mdbm_sync( ldbm );
         LDBM_UNLOCK;
 
-}/* void ldbm_sync() */
+}
 
 
 #define MAX_MDBM_RETRY 5
@@ -735,7 +742,7 @@ ldbm_fetch( LDBM ldbm, Datum key )
 
        return d;
 
-}/* Datum ldbm_fetch() */
+}
 
 
 
@@ -782,8 +789,7 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
 
        return( rc );
 
-}/* int ldbm_store() */
-
+}
 
 
 
@@ -813,7 +819,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 
        return( rc );
 
-}/* int ldbm_delete() */
+}
 
 
 
@@ -868,24 +874,24 @@ ldbm_get_next( LDBM ldbm, kvpair (*fptr)(MDBM *, kvpair) )
 
        return ret;
 
-}/* static Datum ldbm_get_next() */
+}
 
 
 
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
 
        return ldbm_get_next( ldbm, mdbm_first );
 
-}/* Datum ldbm_firstkey() */
+}
 
 
 
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
 
        /* XXX:
@@ -895,7 +901,7 @@ ldbm_nextkey( LDBM ldbm, Datum key )
 
        return ldbm_get_next( ldbm, mdbm_next );
 
-}/* Datum ldbm_nextkey() */
+}
 
 int
 ldbm_errno( LDBM ldbm )
@@ -903,7 +909,7 @@ ldbm_errno( LDBM ldbm )
        /* XXX: best we can do with current  mdbm interface */
        return( errno );
 
-}/* int ldbm_errno() */
+}
 
 
 
@@ -981,7 +987,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
        Datum d;
 
@@ -993,7 +999,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum d;