]> git.sur5r.net Git - openldap/blobdiff - libraries/libldbm/ldbm.c
Force sd close. Suggested by rajk@home.com
[openldap] / libraries / libldbm / ldbm.c
index c39955842898a0e6ec30363132ff36a883534920..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
  *
@@ -12,7 +17,8 @@
 #ifdef SLAPD_LDBM
 
 #include <stdio.h>
-#include <stdlib.h>
+
+#include <ac/stdlib.h>
 #include <ac/string.h>
 #include <ac/errno.h>
 
@@ -53,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;
@@ -102,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;
 
@@ -119,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];
@@ -309,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 );
@@ -370,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;
 
@@ -444,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;
@@ -513,7 +521,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
        Datum d;
 
@@ -525,7 +533,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum d;
 
@@ -552,8 +560,7 @@ ldbm_errno( LDBM ldbm )
 
 /* MMAPED DBM HASHING DATABASE */
 
-#include <alloca.h>
-#include <string.h>
+#include <ac/string.h>
 
 /* #define MDBM_DEBUG */
 
@@ -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
@@ -689,7 +696,7 @@ ldbm_fetch( LDBM ldbm, Datum key )
 
 #ifdef NO_NULL_KEY
        k.key.dsize = key.dsize + 1;                    
-       k.key.dptr = alloca(k.key.dsize);
+       k.key.dptr = malloc(k.key.dsize);
        *(k.key.dptr) = 'l';
        memcpy( (void *)(k.key.dptr + 1), key.dptr, key.dsize );        
 #else
@@ -729,9 +736,13 @@ ldbm_fetch( LDBM ldbm, Datum key )
 
        /* LDBM_UNLOCK; */
 
+#ifdef NO_NULL_KEY
+       free(k.key.dptr);
+#endif
+
        return d;
 
-}/* Datum ldbm_fetch() */
+}
 
 
 
@@ -753,7 +764,7 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
 
 #ifdef NO_NULL_KEY
        int_key.dsize = key.dsize + 1;
-       int_key.dptr = alloca( int_key.dsize );
+       int_key.dptr = malloc( int_key.dsize );
        *(int_key.dptr) = 'l';  /* Must not be NULL !*/
        memcpy( (void *)(int_key.dptr + 1), key.dptr, key.dsize );
 #else
@@ -772,10 +783,13 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
        fflush( stdout );
 #endif
 
-       return( rc );
+#ifdef NO_NULL_KEY
+       free(int_key.dptr);
+#endif
 
-}/* int ldbm_store() */
+       return( rc );
 
+}
 
 
 
@@ -789,7 +803,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 
 #ifdef NO_NULL_KEY
        int_key.dsize = key.dsize + 1;
-       int_key.dptr = alloca(int_key.dsize);
+       int_key.dptr = malloc(int_key.dsize);
        *(int_key.dptr) = 'l';
        memcpy( (void *)(int_key.dptr + 1), key.dptr, key.dsize );      
 #else
@@ -799,10 +813,13 @@ ldbm_delete( LDBM ldbm, Datum key )
        rc = mdbm_delete( ldbm, int_key );
 
        /* LDBM_UNLOCK; */
+#ifdef NO_NULL_KEY
+       free(int_key.dptr);
+#endif
 
        return( rc );
 
-}/* int ldbm_delete() */
+}
 
 
 
@@ -824,7 +841,7 @@ ldbm_get_next( LDBM ldbm, kvpair (*fptr)(MDBM *, kvpair) )
        /* LDBM_LOCK; */
 
        in.key.dsize = sz;      /* Assume first key in one pg */
-       in.key.dptr = alloca(sz);
+       in.key.dptr = malloc(sz);
        
        in.val.dptr = NULL;     /* Don't need data just key */ 
        in.val.dsize = 0;
@@ -852,27 +869,29 @@ ldbm_get_next( LDBM ldbm, kvpair (*fptr)(MDBM *, kvpair) )
        }
 
        /* LDBM_UNLOCK; */
+       
+       free(in.key.dptr);
 
        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:
@@ -882,7 +901,7 @@ ldbm_nextkey( LDBM ldbm, Datum key )
 
        return ldbm_get_next( ldbm, mdbm_next );
 
-}/* Datum ldbm_nextkey() */
+}
 
 int
 ldbm_errno( LDBM ldbm )
@@ -890,7 +909,7 @@ ldbm_errno( LDBM ldbm )
        /* XXX: best we can do with current  mdbm interface */
        return( errno );
 
-}/* int ldbm_errno() */
+}
 
 
 
@@ -968,7 +987,7 @@ ldbm_delete( LDBM ldbm, Datum key )
 }
 
 Datum
-ldbm_firstkey( LDBM ldbm )
+ldbm_firstkey( LDBM ldbm, LDBMCursor **dbcp )
 {
        Datum d;
 
@@ -980,7 +999,7 @@ ldbm_firstkey( LDBM ldbm )
 }
 
 Datum
-ldbm_nextkey( LDBM ldbm, Datum key )
+ldbm_nextkey( LDBM ldbm, Datum key, LDBMCursor *dbcp )
 {
        Datum d;