/* id2entry.c - routines to deal with the id2entry database */ /* $OpenLDAP$ */ /* * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ #include "portable.h" #include #include #include "back-bdb.h" int bdb_id2entry_put( BackendDB *be, DB_TXN *tid, Entry *e, int flag ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; DB *db = bdb->bi_id2entry->bdi_db; DBT key, data; struct berval bv; int rc; DBTzero( &key ); key.data = (char *) &e->e_id; key.size = sizeof(ID); rc = entry_encode( e, &bv ); if( rc != LDAP_SUCCESS ) { return -1; } DBTzero( &data ); bv2DBT( &bv, &data ); rc = db->put( db, tid, &key, &data, flag ); free( bv.bv_val ); return rc; } int bdb_id2entry_add( BackendDB *be, DB_TXN *tid, Entry *e ) { return bdb_id2entry_put( be, tid, e, DB_NOOVERWRITE ); } int bdb_id2entry_update( BackendDB *be, DB_TXN *tid, Entry *e ) { return bdb_id2entry_put( be, tid, e, 0 ); } int bdb_id2entry( BackendDB *be, DB_TXN *tid, ID id, Entry **e ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; DB *db = bdb->bi_id2entry->bdi_db; DBT key, data; struct berval bv; int rc; *e = NULL; DBTzero( &key ); key.data = (char *) &id; key.size = sizeof(ID); DBTzero( &data ); data.flags = DB_DBT_MALLOC; /* fetch it */ rc = db->get( db, tid, &key, &data, bdb->bi_db_opflags ); if( rc != 0 ) { return rc; } DBT2bv( &data, &bv ); rc = entry_decode( &bv, e ); if( rc == 0 ) { (*e)->e_id = id; } else { /* only free on error. On success, the entry was * decoded in place. */ ch_free( data.data ); } return rc; } int bdb_id2entry_delete( BackendDB *be, DB_TXN *tid, ID id ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; DB *db = bdb->bi_id2entry->bdi_db; DBT key; int rc; DBTzero( &key ); key.data = (char *) &id; key.size = sizeof(ID); rc = db->del( db, tid, &key, 0 ); return rc; } int bdb_entry_return( BackendDB *be, Entry *e ) { /* Our entries are allocated in two blocks; the data comes from * the db itself and the Entry structure and associated pointers * are allocated in entry_decode. The db data pointer is saved * in e_private. Since the Entry structure is allocated as a single * block, e_attrs is always a fixed offset from e. The exception * is when an entry has been modified, in which case we also need * to free e_attrs. */ if( (void *) e->e_attrs != (void *) (e+1)) { attrs_free( e->e_attrs ); } if( e->e_private ) { free( e->e_private ); } free( e ); return 0; } int bdb_entry_release( BackendDB *be, Connection *c, Operation *o, Entry *e, int rw ) { /* A tool will call this with NULL Connection and Operation * pointers. We don't need to free the e_private in that case, * because the tool is getting entries into a realloc'd * buffer. */ if( c && o ) { return bdb_entry_return( be, e ); } else { free( e ); } }