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
18 #if defined( LDBM_USE_DBHASH ) || defined( LDBM_USE_DBBTREE )
20 /*****************************************************************
22 * use berkeley db hash or btree package *
24 *****************************************************************/
26 #ifdef HAVE_BERKELEY_DB2
27 /*************************************************
29 * A malloc routine for use with DB_DBT_MALLOC *
31 *************************************************/
34 ldbm_malloc( size_t size )
36 return( calloc( 1, size ));
43 ldbm_open( char *name, int rw, int mode, int dbcachesize )
47 #ifdef HAVE_BERKELEY_DB2
50 memset( &dbinfo, 0, sizeof( dbinfo ));
51 dbinfo.db_cachesize = dbcachesize;
52 dbinfo.db_pagesize = DEFAULT_DB_PAGE_SIZE;
53 dbinfo.db_malloc = ldbm_malloc;
55 db_open( name, DB_TYPE, rw, mode, NULL, &dbinfo, &ret );
62 if ( DB_TYPE == DB_HASH ) {
63 memset( (char *) &hinfo, '\0', sizeof(hinfo) );
64 hinfo.cachesize = dbcachesize;
66 } else if ( DB_TYPE == DB_BTREE ) {
67 memset( (char *) &binfo, '\0', sizeof(binfo) );
68 binfo.cachesize = dbcachesize;
74 ret = dbopen( name, rw, mode, DB_TYPE, info );
82 ldbm_close( LDBM ldbm )
84 #ifdef HAVE_BERKELEY_DB2
85 (*ldbm->close)( ldbm, 0 );
87 (*ldbm->close)( ldbm );
92 ldbm_sync( LDBM ldbm )
94 (*ldbm->sync)( ldbm, 0 );
98 ldbm_datum_free( LDBM ldbm, Datum data )
104 ldbm_datum_dup( LDBM ldbm, Datum data )
108 #ifdef HAVE_BERKELEY_DB2
109 memset( &dup, 0, sizeof( dup ));
112 if ( data.dsize == 0 ) {
118 dup.dsize = data.dsize;
119 if ( dup.dptr = (char *) malloc( data.dsize ) )
120 memcpy( dup.dptr, data.dptr, data.dsize );
126 ldbm_fetch( LDBM ldbm, Datum key )
131 #ifdef HAVE_BERKELEY_DB2
132 memset( &data, 0, sizeof( data ));
134 data.flags = DB_DBT_MALLOC;
136 if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) {
137 if ( data.dptr ) free( data.dptr );
139 if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) {
140 data = ldbm_datum_dup( ldbm, data );
151 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
155 #ifdef HAVE_BERKELEY_DB2
156 rc = (*ldbm->put)( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC );
159 rc = (*ldbm->put)( ldbm, &key, &data, flags & ~LDBM_SYNC );
161 if ( flags & LDBM_SYNC )
162 (*ldbm->sync)( ldbm, 0 );
167 ldbm_delete( LDBM ldbm, Datum key )
171 #ifdef HAVE_BERKELEY_DB2
172 rc = (*ldbm->del)( ldbm, NULL, &key, 0 );
175 rc = (*ldbm->del)( ldbm, &key, 0 );
177 (*ldbm->sync)( ldbm, 0 );
182 #ifdef HAVE_BERKELEY_DB2
183 ldbm_firstkey( LDBM ldbm, DBC **dbch )
185 ldbm_firstkey( LDBM ldbm )
191 #ifdef HAVE_BERKELEY_DB2
194 memset( &key, 0, sizeof( key ));
195 memset( &data, 0, sizeof( data ));
197 key.flags = data.flags = DB_DBT_MALLOC;
199 /* acquire a cursor for the DB */
200 if ( (*ldbm->cursor)( ldbm, NULL, &dbci )) {
204 if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) {
205 if ( data.dptr ) free( data.dptr );
207 if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_FIRST )) == 0 ) {
208 key = ldbm_datum_dup( ldbm, key );
215 #ifdef HAVE_BERKELEY_DB2
223 #ifdef HAVE_BERKELEY_DB2
224 ldbm_nextkey( LDBM ldbm, Datum key, DBC *dbcp )
226 ldbm_nextkey( LDBM ldbm, Datum key )
232 #ifdef HAVE_BERKELEY_DB2
233 void *oldKey = key.dptr;
235 memset( &data, 0, sizeof( data ));
237 data.flags = DB_DBT_MALLOC;
239 if ( (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ) == 0 ) {
240 if ( data.dptr ) free( data.dptr );
242 if ( (rc = (*ldbm->seq)( ldbm, &key, &data, R_NEXT )) == 0 ) {
243 key = ldbm_datum_dup( ldbm, key );
249 #ifdef HAVE_BERKELEY_DB2
250 if ( oldKey ) free( oldKey );
257 ldbm_errno( LDBM ldbm )
262 #elif defined( HAVE_GDBM )
264 /*****************************************************************
268 *****************************************************************/
271 ldbm_open( char *name, int rw, int mode, int dbcachesize )
276 if ( (db = gdbm_open( name, 0, rw | GDBM_FAST, mode, 0 )) == NULL ) {
279 if ( dbcachesize > 0 && stat( name, &st ) == 0 ) {
280 dbcachesize = (dbcachesize / st.st_blksize);
281 gdbm_setopt( db, GDBM_CACHESIZE, &dbcachesize, sizeof(int) );
288 ldbm_close( LDBM ldbm )
294 ldbm_sync( LDBM ldbm )
300 ldbm_datum_free( LDBM ldbm, Datum data )
306 ldbm_datum_dup( LDBM ldbm, Datum data )
310 if ( data.dsize == 0 ) {
316 dup.dsize = data.dsize;
317 if ( dup.dptr = (char *) malloc( data.dsize ) )
318 memcpy( dup.dptr, data.dptr, data.dsize );
324 ldbm_fetch( LDBM ldbm, Datum key )
326 return( gdbm_fetch( ldbm, key ) );
330 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
334 rc = gdbm_store( ldbm, key, data, flags & ~LDBM_SYNC );
335 if ( flags & LDBM_SYNC )
341 ldbm_delete( LDBM ldbm, Datum key )
345 rc = gdbm_delete( ldbm, key );
351 ldbm_firstkey( LDBM ldbm )
353 return( gdbm_firstkey( ldbm ) );
357 ldbm_nextkey( LDBM ldbm, Datum key )
359 return( gdbm_nextkey( ldbm, key ) );
363 ldbm_errno( LDBM ldbm )
365 return( (int) gdbm_errno );
368 #elif defined( HAVE_NDBM )
370 /*****************************************************************
372 * if no gdbm, fall back to using ndbm, the standard unix thing *
374 *****************************************************************/
378 ldbm_open( char *name, int rw, int mode, int dbcachesize )
380 return( dbm_open( name, rw, mode ) );
384 ldbm_close( LDBM ldbm )
391 ldbm_sync( LDBM ldbm )
397 ldbm_datum_free( LDBM ldbm, Datum data )
403 ldbm_datum_dup( LDBM ldbm, Datum data )
407 if ( data.dsize == 0 ) {
413 dup.dsize = data.dsize;
414 if ( dup.dptr = (char *) malloc( data.dsize ) )
415 memcpy( dup.dptr, data.dptr, data.dsize );
421 ldbm_fetch( LDBM ldbm, Datum key )
423 return( ldbm_datum_dup( ldbm, dbm_fetch( ldbm, key ) ) );
427 ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
429 return( dbm_store( ldbm, key, data, flags ) );
433 ldbm_delete( LDBM ldbm, Datum key )
435 return( dbm_delete( ldbm, key ) );
439 ldbm_firstkey( LDBM ldbm )
441 return( dbm_firstkey( ldbm ) );
445 ldbm_nextkey( LDBM ldbm, Datum key )
447 return( dbm_nextkey( ldbm ) );
451 ldbm_errno( LDBM ldbm )
453 return( dbm_error( ldbm ) );