#include "ldbm.h"
#include "ldap_pvt_thread.h"
-#if defined( LDBM_USE_DBHASH ) || defined( LDBM_USE_DBBTREE )
-/*****************************************************************
- * *
- * use berkeley db hash or btree package *
- * *
- *****************************************************************/
+void
+ldbm_datum_free( LDBM ldbm, Datum data )
+{
+ free( data.dptr );
+ data.dptr = NULL;
+}
-#ifdef HAVE_BERKELEY_DB2
+
+Datum
+ldbm_datum_dup( LDBM ldbm, Datum data )
+{
+ Datum dup;
+
+ if ( data.dsize == 0 ) {
+ dup.dsize = 0;
+ dup.dptr = NULL;
+
+ return( dup );
+ }
+ dup.dsize = data.dsize;
+ if ( (dup.dptr = (char *) malloc( data.dsize )) != NULL )
+ memcpy( dup.dptr, data.dptr, data.dsize );
+
+ return( dup );
+}
+
+#ifndef HAVE_BERKELEY_DB2
+/* Everything but DB2 is non-reentrant */
+
+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))
+
+void ldbm_initialize( void )
+{
+ static int initialized = 0;
+
+ if(initialized++) return;
+
+ ldap_pvt_thread_mutex_init( &ldbm_big_mutex );
+}
+
+#else
void *
ldbm_malloc( size_t size )
}
}
-#else
-
-/* DB 1.85 is non-reentrant */
-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))
-
-void ldbm_initialize( void )
-{
- static int initialized = 0;
-
- if(initialized++) return;
-
- ldap_pvt_thread_mutex_init( &ldbm_big_mutex );
-}
-
#endif
+#if defined( LDBM_USE_DBHASH ) || defined( LDBM_USE_DBBTREE )
+/*****************************************************************
+ * *
+ * use berkeley db hash or btree package *
+ * *
+ *****************************************************************/
LDBM
ldbm_open( char *name, int rw, int mode, int dbcachesize )
LDBM_UNLOCK;
}
-void
-ldbm_datum_free( LDBM ldbm, Datum data )
-{
- free( data.dptr );
-}
-
-Datum
-ldbm_datum_dup( LDBM ldbm, Datum data )
-{
- Datum dup;
-
- ldbm_datum_init( dup );
-
- if ( data.dsize == 0 ) {
- return( dup );
- }
- dup.dsize = data.dsize;
- if ( dup.dptr = (char *) malloc( data.dsize ) )
- memcpy( dup.dptr, data.dptr, data.dsize );
-
- return( dup );
-}
-
Datum
ldbm_fetch( LDBM ldbm, Datum key )
{
if ( data.dptr ) free( data.dptr );
#else
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 );
} else {
#endif
# if defined( DB_VERSION_MAJOR ) && defined( DB_VERSION_MINOR ) && \
DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6
- if ( (*ldbm->cursor)( ldbm, NULL, &dbci )) {
+ if ( (*ldbm->cursor)( ldbm, NULL, &dbci ))
# else
-
- if ( (*ldbm->cursor)( ldbm, NULL, &dbci, 0 )) {
-
+ if ( (*ldbm->cursor)( ldbm, NULL, &dbci, 0 ))
# endif
-
+ {
return( key );
} else {
*dbch = dbci;
if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) {
- if ( data.dptr ) free( data.dptr );
+ if ( data.dptr ) {
+ free( data.dptr );
+ }
+ }
#else
LDBM_LOCK;
if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_FIRST )) == 0 ) {
key = ldbm_datum_dup( ldbm, key );
+ }
#endif
- } else {
+ else {
key.dptr = NULL;
key.dsize = 0;
}
if ( (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ) == 0 ) {
if ( data.dptr ) free( data.dptr );
+ }
#else
LDBM_LOCK;
if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_NEXT )) == 0 ) {
key = ldbm_datum_dup( ldbm, key );
+ }
#endif
- } else {
+ else {
key.dptr = NULL;
key.dsize = 0;
}
#include <sys/stat.h>
-/* GDBM is non-reentrant */
-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))
-
-void ldbm_initialize( void )
-{
- static int initialized = 0;
-
- if(initialized++) return;
-
- ldap_pvt_thread_mutex_init( &ldbm_big_mutex );
-}
-
/*****************************************************************
* *
* use gdbm *
}
LDBM_UNLOCK;
+
return( db );
}
LDBM_UNLOCK;
}
-void
-ldbm_datum_free( LDBM ldbm, Datum data )
-{
- free( data.dptr );
-}
-
-Datum
-ldbm_datum_dup( LDBM ldbm, Datum data )
-{
- Datum dup;
-
- if ( data.dsize == 0 ) {
- dup.dsize = 0;
- dup.dptr = NULL;
-
- return( dup );
- }
- dup.dsize = data.dsize;
- if ( (dup.dptr = (char *) malloc( data.dsize )) != NULL )
- memcpy( dup.dptr, data.dptr, data.dsize );
-
- return( dup );
-}
-
Datum
ldbm_fetch( LDBM ldbm, Datum key )
{
Datum d;
+
LDBM_LOCK;
d = gdbm_fetch( ldbm, key );
LDBM_UNLOCK;
+
return d;
}
if ( flags & LDBM_SYNC )
gdbm_sync( ldbm );
LDBM_UNLOCK;
+
return( rc );
}
rc = gdbm_delete( ldbm, key );
gdbm_sync( ldbm );
LDBM_UNLOCK;
+
return( rc );
}
ldbm_firstkey( LDBM ldbm )
{
Datum d;
+
LDBM_LOCK;
d = gdbm_firstkey( ldbm );
LDBM_UNLOCK;
+
return d;
}
ldbm_nextkey( LDBM ldbm, Datum key )
{
Datum d;
+
LDBM_LOCK;
d = gdbm_nextkey( ldbm, key );
LDBM_UNLOCK;
+
return d;
}
ldbm_errno( LDBM ldbm )
{
int err;
+
LDBM_LOCK;
err = gdbm_errno;
LDBM_UNLOCK;
+
return( err );
}
#elif defined( HAVE_NDBM )
-/* GDBM is non-reentrant */
-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))
-
-void ldbm_initialize( void )
-{
- static int initialized = 0;
-
- if(initialized++) return;
-
- ldap_pvt_thread_mutex_init( &ldbm_big_mutex );
-}
-
/*****************************************************************
* *
* if no gdbm, fall back to using ndbm, the standard unix thing *
return;
}
-void
-ldbm_datum_free( LDBM ldbm, Datum data )
-{
- return;
-}
-
-Datum
-ldbm_datum_dup( LDBM ldbm, Datum data )
-{
- Datum dup;
-
- if ( data.dsize == 0 ) {
- dup.dsize = 0;
- dup.dptr = NULL;
-
- return( dup );
- }
- dup.dsize = data.dsize;
- dup.dptr = (char *) malloc( data.dsize );
- if ( dup.dptr )
- memcpy( dup.dptr, data.dptr, data.dsize );
-
- return( dup );
-}
-
Datum
ldbm_fetch( LDBM ldbm, Datum key )
{
Datum d;
+
LDBM_LOCK;
d = ldbm_datum_dup( ldbm, dbm_fetch( ldbm, key ) );
LDBM_UNLOCK;
+
return d;
}
ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
{
int rc;
+
LDBM_LOCK;
rc = dbm_store( ldbm, key, data, flags );
LDBM_UNLOCK;
+
return rc;
}
ldbm_delete( LDBM ldbm, Datum key )
{
int rc;
+
LDBM_LOCK;
rc = dbm_delete( ldbm, key );
LDBM_UNLOCK;
+
return rc;
}
ldbm_firstkey( LDBM ldbm )
{
Datum d;
+
LDBM_LOCK;
d = dbm_firstkey( ldbm );
LDBM_UNLOCK;
+
return d;
}
ldbm_nextkey( LDBM ldbm, Datum key )
{
Datum d;
+
LDBM_LOCK;
d = dbm_nextkey( ldbm );
LDBM_UNLOCK;
+
return d;
}
ldbm_errno( LDBM ldbm )
{
int err;
+
LDBM_LOCK;
err = dbm_error( ldbm );
LDBM_UNLOCK;
+
return err;
}