1 /* ldbm.c - ldap dbm compatibility routines */
3 /* Patched for Berkeley DB version 2.0; /KSp; 98/02/23
5 * - basic implementation; 1998/02/23, /KSp
6 * - DB_DBT_MALLOC ; 1998/03/22, /KSp
15 #include <ac/string.h>
20 #if defined( LDBM_USE_DBHASH ) || defined( LDBM_USE_DBBTREE )
22 /*****************************************************************
24 * use berkeley db hash or btree package *
26 *****************************************************************/
28 #ifdef HAVE_BERKELEY_DB2
29 /*************************************************
31 * A malloc routine for use with DB_DBT_MALLOC *
33 *************************************************/
36 ldbm_malloc( size_t size )
38 return( calloc( 1, size ));
45 ldbm_open( char *name, int rw, int mode, int dbcachesize )
49 #ifdef HAVE_BERKELEY_DB2
52 memset( &dbinfo, 0, sizeof( dbinfo ));
53 dbinfo.db_cachesize = dbcachesize;
54 dbinfo.db_pagesize = DEFAULT_DB_PAGE_SIZE;
55 dbinfo.db_malloc = ldbm_malloc;
57 (void) db_open( name, DB_TYPE, rw, mode, NULL, &dbinfo, &ret );
64 if ( DB_TYPE == DB_HASH ) {
65 memset( (char *) &hinfo, '\0', sizeof(hinfo) );
66 hinfo.cachesize = dbcachesize;
68 } else if ( DB_TYPE == DB_BTREE ) {
69 memset( (char *) &binfo, '\0', sizeof(binfo) );
70 binfo.cachesize = dbcachesize;
76 ret = dbopen( name, rw, mode, DB_TYPE, info );
84 ldbm_close( LDBM ldbm )
86 #ifdef HAVE_BERKELEY_DB2
87 (*ldbm->close)( ldbm, 0 );
89 (*ldbm->close)( ldbm );
94 ldbm_sync( LDBM ldbm )
96 (*ldbm->sync)( ldbm, 0 );
100 ldbm_datum_free( LDBM ldbm, Datum data )
106 ldbm_datum_dup( LDBM ldbm, Datum data )
110 ldbm_datum_init( dup );
112 if ( data.dsize == 0 ) {
115 dup.dsize = data.dsize;
116 if ( dup.dptr = (char *) malloc( data.dsize ) )
117 memcpy( dup.dptr, data.dptr, data.dsize );
123 ldbm_fetch( LDBM ldbm, Datum key )
128 #ifdef HAVE_BERKELEY_DB2
129 ldbm_datum_init( data );
131 data.flags = DB_DBT_MALLOC;
133 if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) {
134 if ( data.dptr ) free( data.dptr );
136 if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) {
137 data = ldbm_datum_dup( ldbm, data );
148 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
152 #ifdef HAVE_BERKELEY_DB2
153 rc = (*ldbm->put)( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC );
156 rc = (*ldbm->put)( ldbm, &key, &data, flags & ~LDBM_SYNC );
159 if ( flags & LDBM_SYNC )
160 (*ldbm->sync)( ldbm, 0 );
165 ldbm_delete( LDBM ldbm, Datum key )
169 #ifdef HAVE_BERKELEY_DB2
170 rc = (*ldbm->del)( ldbm, NULL, &key, 0 );
173 rc = (*ldbm->del)( ldbm, &key, 0 );
175 (*ldbm->sync)( ldbm, 0 );
180 #ifdef HAVE_BERKELEY_DB2
181 ldbm_firstkey( LDBM ldbm, DBC **dbch )
183 ldbm_firstkey( LDBM ldbm )
189 #ifdef HAVE_BERKELEY_DB2
192 ldbm_datum_init( key );
193 ldbm_datum_init( data );
195 key.flags = data.flags = DB_DBT_MALLOC;
197 /* acquire a cursor for the DB */
199 # if defined( DB_VERSION_MAJOR ) && defined( DB_VERSION_MINOR ) && \
200 DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6
202 if ( (*ldbm->cursor)( ldbm, NULL, &dbci )) {
206 if ( (*ldbm->cursor)( ldbm, NULL, &dbci, 0 )) {
213 if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) {
214 if ( data.dptr ) free( data.dptr );
216 if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_FIRST )) == 0 ) {
217 key = ldbm_datum_dup( ldbm, key );
224 #ifdef HAVE_BERKELEY_DB2
232 #ifdef HAVE_BERKELEY_DB2
233 ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp )
235 ldbm_nextkey( LDBM ldbm, Datum key )
241 #ifdef HAVE_BERKELEY_DB2
242 void *oldKey = key.dptr;
244 ldbm_datum_init( data );
246 data.flags = DB_DBT_MALLOC;
248 if ( (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ) == 0 ) {
249 if ( data.dptr ) free( data.dptr );
251 if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_NEXT )) == 0 ) {
252 key = ldbm_datum_dup( ldbm, key );
258 #ifdef HAVE_BERKELEY_DB2
259 if ( oldKey ) free( oldKey );
266 ldbm_errno( LDBM ldbm )
271 #elif defined( HAVE_GDBM )
273 #include <sys/stat.h>
275 /*****************************************************************
279 *****************************************************************/
282 ldbm_open( char *name, int rw, int mode, int dbcachesize )
287 if ( (db = gdbm_open( name, 0, rw | GDBM_FAST, mode, 0 )) == NULL ) {
290 if ( dbcachesize > 0 && stat( name, &st ) == 0 ) {
291 dbcachesize = (dbcachesize / st.st_blksize);
292 gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
299 ldbm_close( LDBM ldbm )
305 ldbm_sync( LDBM ldbm )
311 ldbm_datum_free( LDBM ldbm, Datum data )
317 ldbm_datum_dup( LDBM ldbm, Datum data )
321 if ( data.dsize == 0 ) {
327 dup.dsize = data.dsize;
328 if ( (dup.dptr = (char *) malloc( data.dsize )) != NULL )
329 memcpy( dup.dptr, data.dptr, data.dsize );
335 ldbm_fetch( LDBM ldbm, Datum key )
337 return( gdbm_fetch( ldbm, key ) );
341 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
345 rc = gdbm_store( ldbm, key, data, flags & ~LDBM_SYNC );
346 if ( flags & LDBM_SYNC )
352 ldbm_delete( LDBM ldbm, Datum key )
356 rc = gdbm_delete( ldbm, key );
362 ldbm_firstkey( LDBM ldbm )
364 return( gdbm_firstkey( ldbm ) );
368 ldbm_nextkey( LDBM ldbm, Datum key )
370 return( gdbm_nextkey( ldbm, key ) );
374 ldbm_errno( LDBM ldbm )
376 return( (int) gdbm_errno );
379 #elif defined( HAVE_NDBM )
381 /*****************************************************************
383 * if no gdbm, fall back to using ndbm, the standard unix thing *
385 *****************************************************************/
389 ldbm_open( char *name, int rw, int mode, int dbcachesize )
391 return( dbm_open( name, rw, mode ) );
395 ldbm_close( LDBM ldbm )
402 ldbm_sync( LDBM ldbm )
408 ldbm_datum_free( LDBM ldbm, Datum data )
414 ldbm_datum_dup( LDBM ldbm, Datum data )
418 if ( data.dsize == 0 ) {
424 dup.dsize = data.dsize;
425 dup.dptr = (char *) malloc( data.dsize );
427 memcpy( dup.dptr, data.dptr, data.dsize );
433 ldbm_fetch( LDBM ldbm, Datum key )
435 return( ldbm_datum_dup( ldbm, dbm_fetch( ldbm, key ) ) );
439 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
441 return( dbm_store( ldbm, key, data, flags ) );
445 ldbm_delete( LDBM ldbm, Datum key )
447 return( dbm_delete( ldbm, key ) );
451 ldbm_firstkey( LDBM ldbm )
453 return( dbm_firstkey( ldbm ) );
457 ldbm_nextkey( LDBM ldbm, Datum key )
459 return( dbm_nextkey( ldbm ) );
463 ldbm_errno( LDBM ldbm )
465 return( dbm_error( ldbm ) );