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
19 #if defined( LDBM_USE_DBHASH ) || defined( LDBM_USE_DBBTREE )
21 /*****************************************************************
23 * use berkeley db hash or btree package *
25 *****************************************************************/
27 #ifdef HAVE_BERKELEY_DB2
28 /*************************************************
30 * A malloc routine for use with DB_DBT_MALLOC *
32 *************************************************/
35 ldbm_malloc( size_t size )
37 return( calloc( 1, size ));
44 ldbm_open( char *name, int rw, int mode, int dbcachesize )
48 #ifdef HAVE_BERKELEY_DB2
51 memset( &dbinfo, 0, sizeof( dbinfo ));
52 dbinfo.db_cachesize = dbcachesize;
53 dbinfo.db_pagesize = DEFAULT_DB_PAGE_SIZE;
54 dbinfo.db_malloc = ldbm_malloc;
56 db_open( name, DB_TYPE, rw, mode, NULL, &dbinfo, &ret );
63 if ( DB_TYPE == DB_HASH ) {
64 memset( (char *) &hinfo, '\0', sizeof(hinfo) );
65 hinfo.cachesize = dbcachesize;
67 } else if ( DB_TYPE == DB_BTREE ) {
68 memset( (char *) &binfo, '\0', sizeof(binfo) );
69 binfo.cachesize = dbcachesize;
75 ret = dbopen( name, rw, mode, DB_TYPE, info );
83 ldbm_close( LDBM ldbm )
85 #ifdef HAVE_BERKELEY_DB2
86 (*ldbm->close)( ldbm, 0 );
88 (*ldbm->close)( ldbm );
93 ldbm_sync( LDBM ldbm )
95 (*ldbm->sync)( ldbm, 0 );
99 ldbm_datum_free( LDBM ldbm, Datum data )
105 ldbm_datum_dup( LDBM ldbm, Datum data )
109 #ifdef HAVE_BERKELEY_DB2
110 memset( &dup, 0, sizeof( dup ));
113 if ( data.dsize == 0 ) {
119 dup.dsize = data.dsize;
120 if ( dup.dptr = (char *) malloc( data.dsize ) )
121 memcpy( dup.dptr, data.dptr, data.dsize );
127 ldbm_fetch( LDBM ldbm, Datum key )
132 #ifdef HAVE_BERKELEY_DB2
133 memset( &data, 0, sizeof( data ));
135 data.flags = DB_DBT_MALLOC;
137 if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) {
138 if ( data.dptr ) free( data.dptr );
140 if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) {
141 data = ldbm_datum_dup( ldbm, data );
152 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
156 #ifdef HAVE_BERKELEY_DB2
157 rc = (*ldbm->put)( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC );
160 rc = (*ldbm->put)( ldbm, &key, &data, flags & ~LDBM_SYNC );
162 if ( flags & LDBM_SYNC )
163 (*ldbm->sync)( ldbm, 0 );
168 ldbm_delete( LDBM ldbm, Datum key )
172 #ifdef HAVE_BERKELEY_DB2
173 rc = (*ldbm->del)( ldbm, NULL, &key, 0 );
176 rc = (*ldbm->del)( ldbm, &key, 0 );
178 (*ldbm->sync)( ldbm, 0 );
183 #ifdef HAVE_BERKELEY_DB2
184 ldbm_firstkey( LDBM ldbm, DBC **dbch )
186 ldbm_firstkey( LDBM ldbm )
192 #ifdef HAVE_BERKELEY_DB2
195 memset( &key, 0, sizeof( key ));
196 memset( &data, 0, sizeof( data ));
198 key.flags = data.flags = DB_DBT_MALLOC;
200 /* acquire a cursor for the DB */
201 if ( (*ldbm->cursor)( ldbm, NULL, &dbci )) {
205 if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) {
206 if ( data.dptr ) free( data.dptr );
208 if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_FIRST )) == 0 ) {
209 key = ldbm_datum_dup( ldbm, key );
216 #ifdef HAVE_BERKELEY_DB2
224 #ifdef HAVE_BERKELEY_DB2
225 ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp )
227 ldbm_nextkey( LDBM ldbm, Datum key )
233 #ifdef HAVE_BERKELEY_DB2
234 void *oldKey = key.dptr;
236 memset( &data, 0, sizeof( data ));
238 data.flags = DB_DBT_MALLOC;
240 if ( (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ) == 0 ) {
241 if ( data.dptr ) free( data.dptr );
243 if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_NEXT )) == 0 ) {
244 key = ldbm_datum_dup( ldbm, key );
250 #ifdef HAVE_BERKELEY_DB2
251 if ( oldKey ) free( oldKey );
258 ldbm_errno( LDBM ldbm )
263 #elif defined( HAVE_GDBM )
265 #include <sys/stat.h>
267 /*****************************************************************
271 *****************************************************************/
274 ldbm_open( char *name, int rw, int mode, int dbcachesize )
279 if ( (db = gdbm_open( name, 0, rw | GDBM_FAST, mode, 0 )) == NULL ) {
282 if ( dbcachesize > 0 && stat( name, &st ) == 0 ) {
283 dbcachesize = (dbcachesize / st.st_blksize);
284 gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
291 ldbm_close( LDBM ldbm )
297 ldbm_sync( LDBM ldbm )
303 ldbm_datum_free( LDBM ldbm, Datum data )
309 ldbm_datum_dup( LDBM ldbm, Datum data )
313 if ( data.dsize == 0 ) {
319 dup.dsize = data.dsize;
320 if ( dup.dptr = (char *) malloc( data.dsize ) )
321 memcpy( dup.dptr, data.dptr, data.dsize );
327 ldbm_fetch( LDBM ldbm, Datum key )
329 return( gdbm_fetch( ldbm, key ) );
333 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
337 rc = gdbm_store( ldbm, key, data, flags & ~LDBM_SYNC );
338 if ( flags & LDBM_SYNC )
344 ldbm_delete( LDBM ldbm, Datum key )
348 rc = gdbm_delete( ldbm, key );
354 ldbm_firstkey( LDBM ldbm )
356 return( gdbm_firstkey( ldbm ) );
360 ldbm_nextkey( LDBM ldbm, Datum key )
362 return( gdbm_nextkey( ldbm, key ) );
366 ldbm_errno( LDBM ldbm )
368 return( (int) gdbm_errno );
371 #elif defined( HAVE_NDBM )
373 /*****************************************************************
375 * if no gdbm, fall back to using ndbm, the standard unix thing *
377 *****************************************************************/
381 ldbm_open( char *name, int rw, int mode, int dbcachesize )
383 return( dbm_open( name, rw, mode ) );
387 ldbm_close( LDBM ldbm )
394 ldbm_sync( LDBM ldbm )
400 ldbm_datum_free( LDBM ldbm, Datum data )
406 ldbm_datum_dup( LDBM ldbm, Datum data )
410 if ( data.dsize == 0 ) {
416 dup.dsize = data.dsize;
417 dup.dptr = (char *) malloc( data.dsize );
419 memcpy( dup.dptr, data.dptr, data.dsize );
425 ldbm_fetch( LDBM ldbm, Datum key )
427 return( ldbm_datum_dup( ldbm, dbm_fetch( ldbm, key ) ) );
431 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
433 return( dbm_store( ldbm, key, data, flags ) );
437 ldbm_delete( LDBM ldbm, Datum key )
439 return( dbm_delete( ldbm, key ) );
443 ldbm_firstkey( LDBM ldbm )
445 return( dbm_firstkey( ldbm ) );
449 ldbm_nextkey( LDBM ldbm, Datum key )
451 return( dbm_nextkey( ldbm ) );
455 ldbm_errno( LDBM ldbm )
457 return( dbm_error( ldbm ) );