mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-25 00:59:45 -05:00
The new e_private field can be used for any backend purpose. In LDBM, it's used to point th the private entry info struct. The LDBM entry info struct is only visible to the LDBM cache. WARNING: This change has not be ported to other backends! Breakage is likely.
179 lines
3.9 KiB
C
179 lines
3.9 KiB
C
/* id2entry.c - routines to deal with the id2entry index */
|
|
|
|
#include "portable.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <ac/socket.h>
|
|
|
|
#include "slap.h"
|
|
#include "back-ldbm.h"
|
|
|
|
/*
|
|
* This routine adds (or updates) an entry on disk.
|
|
* The cache should already be updated.
|
|
*/
|
|
|
|
int
|
|
id2entry_add( Backend *be, Entry *e )
|
|
{
|
|
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
|
|
struct dbcache *db;
|
|
Datum key, data;
|
|
int len, rc, flags;
|
|
|
|
ldbm_datum_init( key );
|
|
ldbm_datum_init( data );
|
|
|
|
Debug( LDAP_DEBUG_TRACE, "=> id2entry_add( %lu, \"%s\" )\n", e->e_id,
|
|
e->e_dn, 0 );
|
|
|
|
if ( (db = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, LDBM_WRCREAT ))
|
|
== NULL ) {
|
|
Debug( LDAP_DEBUG_ANY, "Could not open/create id2entry%s\n",
|
|
LDBM_SUFFIX, 0, 0 );
|
|
return( -1 );
|
|
}
|
|
|
|
key.dptr = (char *) &e->e_id;
|
|
key.dsize = sizeof(ID);
|
|
|
|
ldap_pvt_thread_mutex_lock( &entry2str_mutex );
|
|
data.dptr = entry2str( e, &len, 1 );
|
|
data.dsize = len + 1;
|
|
|
|
/* store it */
|
|
flags = LDBM_REPLACE;
|
|
if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
|
|
rc = ldbm_cache_store( db, key, data, flags );
|
|
|
|
ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
|
|
|
|
ldbm_cache_close( be, db );
|
|
|
|
/* XXX entry should have already been added to the cache */
|
|
/* (void) cache_add_entry_rw( &li->li_cache, e, 0 ); */
|
|
|
|
Debug( LDAP_DEBUG_TRACE, "<= id2entry_add %d\n", rc, 0, 0 );
|
|
|
|
return( rc );
|
|
}
|
|
|
|
int
|
|
id2entry_delete( Backend *be, Entry *e )
|
|
{
|
|
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
|
|
struct dbcache *db;
|
|
Datum key;
|
|
int rc;
|
|
|
|
Debug(LDAP_DEBUG_TRACE, "=> id2entry_delete( %lu, \"%s\" )\n", e->e_id,
|
|
e->e_dn, 0 );
|
|
|
|
#ifdef notdef
|
|
#ifdef LDAP_DEBUG
|
|
/* check for writer lock */
|
|
assert(ldap_pvt_thread_rdwr_writers(&e->e_rdwr) == 1);
|
|
#endif
|
|
#endif
|
|
|
|
ldbm_datum_init( key );
|
|
|
|
if ( (db = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, LDBM_WRCREAT ))
|
|
== NULL ) {
|
|
Debug( LDAP_DEBUG_ANY, "Could not open/create id2entry%s\n",
|
|
LDBM_SUFFIX, 0, 0 );
|
|
return( -1 );
|
|
}
|
|
|
|
if ( cache_delete_entry( &li->li_cache, e ) != 0 ) {
|
|
Debug(LDAP_DEBUG_ANY, "could not delete %lu (%s) from cache\n",
|
|
e->e_id, e->e_dn, 0 );
|
|
}
|
|
|
|
key.dptr = (char *) &e->e_id;
|
|
key.dsize = sizeof(ID);
|
|
|
|
rc = ldbm_cache_delete( db, key );
|
|
|
|
ldbm_cache_close( be, db );
|
|
|
|
Debug( LDAP_DEBUG_TRACE, "<= id2entry_delete %d\n", rc, 0, 0 );
|
|
return( rc );
|
|
}
|
|
|
|
/* XXX returns entry with reader/writer lock */
|
|
Entry *
|
|
id2entry_rw( Backend *be, ID id, int rw )
|
|
{
|
|
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
|
|
struct dbcache *db;
|
|
Datum key, data;
|
|
Entry *e;
|
|
|
|
ldbm_datum_init( key );
|
|
ldbm_datum_init( data );
|
|
|
|
Debug( LDAP_DEBUG_TRACE, "=> id2entry_%s( %ld )\n",
|
|
rw ? "w" : "r", id, 0 );
|
|
|
|
if ( (e = cache_find_entry_id( &li->li_cache, id, rw )) != NULL ) {
|
|
Debug( LDAP_DEBUG_TRACE, "<= id2entry_%s 0x%lx (cache)\n",
|
|
rw ? "w" : "r", (unsigned long)e, 0 );
|
|
return( e );
|
|
}
|
|
|
|
if ( (db = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, LDBM_WRCREAT ))
|
|
== NULL ) {
|
|
Debug( LDAP_DEBUG_ANY, "Could not open id2entry%s\n",
|
|
LDBM_SUFFIX, 0, 0 );
|
|
return( NULL );
|
|
}
|
|
|
|
key.dptr = (char *) &id;
|
|
key.dsize = sizeof(ID);
|
|
|
|
data = ldbm_cache_fetch( db, key );
|
|
|
|
if ( data.dptr == NULL ) {
|
|
Debug( LDAP_DEBUG_TRACE, "<= id2entry_%s( %ld ) not found\n",
|
|
rw ? "w" : "r", id, 0 );
|
|
ldbm_cache_close( be, db );
|
|
return( NULL );
|
|
}
|
|
|
|
e = str2entry( data.dptr );
|
|
|
|
ldbm_datum_free( db->dbc_db, data );
|
|
ldbm_cache_close( be, db );
|
|
|
|
if ( e == NULL ) {
|
|
Debug( LDAP_DEBUG_TRACE, "<= id2entry_%s( %ld ) (failed)\n",
|
|
rw ? "w" : "r", id, 0 );
|
|
return( NULL );
|
|
}
|
|
|
|
e->e_id = id;
|
|
|
|
if( cache_add_entry_rw( &li->li_cache, e, 0, rw ) != 0 ) {
|
|
Debug( LDAP_DEBUG_TRACE, "<= id2entry_%s( %ld ) (cache add failed)\n",
|
|
rw ? "w" : "r", id, 0 );
|
|
}
|
|
|
|
Debug( LDAP_DEBUG_TRACE, "<= id2entry_%s( %ld ) (disk)\n",
|
|
rw ? "w" : "r", id, 0 );
|
|
return( e );
|
|
}
|
|
|
|
Entry *
|
|
id2entry_r( Backend *be, ID id )
|
|
{
|
|
return( id2entry_rw( be, id, 0 ) );
|
|
}
|
|
|
|
Entry *
|
|
id2entry_w( Backend *be, ID id )
|
|
{
|
|
return( id2entry_rw( be, id, 1 ) );
|
|
}
|
|
|