X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Ftools.c;h=5d0855bfe53ed749a95d6268b5d6b0854fa572e8;hb=08059f1633bfd9d0a709761b026bdb8e4441c6e6;hp=5a91947ef1ca526258165ff4233f0b09283faa35;hpb=ea069cb7c2731d54d20d41cd49936914ab78edb3;p=openldap diff --git a/servers/slapd/back-ldbm/tools.c b/servers/slapd/back-ldbm/tools.c index 5a91947ef1..5d0855bfe5 100644 --- a/servers/slapd/back-ldbm/tools.c +++ b/servers/slapd/back-ldbm/tools.c @@ -1,7 +1,7 @@ /* tools.c - tools for slap tools */ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -46,8 +46,14 @@ int ldbm_tool_entry_open( if ( (id2entry = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, flags )) == NULL ) { +#ifdef NEW_LOGGING + LDAP_LOG( BACK_LDBM, CRIT, + "Could not open/create id2entry%s\n", LDBM_SUFFIX, 0, 0 ); +#else Debug( LDAP_DEBUG_ANY, "Could not open/create id2entry" LDBM_SUFFIX "\n", 0, 0, 0 ); +#endif + return( -1 ); } @@ -84,7 +90,10 @@ ID ldbm_tool_entry_first( return NOID; } - memcpy( &id, key.dptr, key.dsize ); + AC_MEMCPY( &id, key.dptr, key.dsize ); +#ifndef WORDS_BIGENDIAN + id = ntohl( id ); +#endif ldbm_datum_free( id2entry->dbc_db, key ); @@ -109,7 +118,10 @@ ID ldbm_tool_entry_next( return NOID; } - memcpy( &id, key.dptr, key.dsize ); + AC_MEMCPY( &id, key.dptr, key.dsize ); +#ifndef WORDS_BIGENDIAN + id = ntohl( id ); +#endif ldbm_datum_free( id2entry->dbc_db, key ); @@ -120,12 +132,20 @@ Entry* ldbm_tool_entry_get( BackendDB *be, ID id ) { Entry *e; Datum key, data; +#ifndef WORDS_BIGENDIAN + ID id2; +#endif assert( slapMode & SLAP_TOOL_MODE ); assert( id2entry != NULL ); ldbm_datum_init( key ); +#ifndef WORDS_BIGENDIAN + id2 = htonl( id ); + key.dptr = (char *) &id2; +#else key.dptr = (char *) &id; +#endif key.dsize = sizeof(ID); data = ldbm_cache_fetch( id2entry, key ); @@ -137,45 +157,86 @@ Entry* ldbm_tool_entry_get( BackendDB *be, ID id ) e = str2entry( data.dptr ); ldbm_datum_free( id2entry->dbc_db, data ); + if( e != NULL ) { + e->e_id = id; + } + return e; } ID ldbm_tool_entry_put( BackendDB *be, - Entry *e ) + Entry *e, + struct berval *text ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; Datum key, data; int rc, len; + ID id; assert( slapMode & SLAP_TOOL_MODE ); assert( id2entry != NULL ); - if( next_id_get( be ) == NOID ) { + assert( text ); + assert( text->bv_val ); + assert( text->bv_val[0] == '\0' ); + + if ( next_id_get( be, &id ) || id == NOID ) { + strncpy( text->bv_val, "unable to get nextid", text->bv_len ); return NOID; } e->e_id = li->li_nextid++; +#ifdef NEW_LOGGING + LDAP_LOG( BACK_LDBM, ENTRY, + "ldbm_tool_entry_put: (%s)%ld\n", e->e_dn, e->e_id ,0 ); +#else Debug( LDAP_DEBUG_TRACE, "=> ldbm_tool_entry_put( %ld, \"%s\" )\n", e->e_id, e->e_dn, 0 ); +#endif - rc = index_entry_add( be, e, e->e_attrs ); + if ( dn2id( be, &e->e_nname, &id ) ) { + /* something bad happened to ldbm cache */ + strncpy( text->bv_val, "ldbm cache corrupted", text->bv_len ); + return NOID; + } - if( rc != 0 ) { + if( id != NOID ) { +#ifdef NEW_LOGGING + LDAP_LOG( BACK_LDBM, ENTRY, + "ldbm_tool_entry_put: \"%s\" already exists (id=%ld)\n", + e->e_dn, id, 0 ); +#else + Debug( LDAP_DEBUG_TRACE, + "<= ldbm_tool_entry_put: \"%s\" already exists (id=%ld)\n", + e->e_ndn, id, 0 ); +#endif + strncpy( text->bv_val, "already exists", text->bv_len ); return NOID; } - rc = dn2id_add( be, e->e_ndn, e->e_id ); + rc = index_entry_add( be, e, e->e_attrs ); + if( rc != 0 ) { + strncpy( text->bv_val, "index add failed", text->bv_len ); + return NOID; + } + rc = dn2id_add( be, &e->e_nname, e->e_id ); if( rc != 0 ) { + strncpy( text->bv_val, "dn2id add failed", text->bv_len ); return NOID; } ldbm_datum_init( key ); ldbm_datum_init( data ); +#ifndef WORDS_BIGENDIAN + id = htonl( e->e_id ); + key.dptr = (char *) &id; +#else key.dptr = (char *) &e->e_id; +#endif key.dsize = sizeof(ID); data.dptr = entry2str( e, &len ); @@ -185,83 +246,67 @@ ID ldbm_tool_entry_put( rc = ldbm_cache_store( id2entry, key, data, LDBM_REPLACE ); if( rc != 0 ) { - (void) dn2id_delete( be, e->e_ndn, e->e_id ); + (void) dn2id_delete( be, &e->e_nname, e->e_id ); + strncpy( text->bv_val, "cache store failed", text->bv_len ); return NOID; } return e->e_id; } -int ldbm_tool_index_attr( +int ldbm_tool_entry_reindex( BackendDB *be, -#ifdef SLAPD_SCHEMA_NOT_COMPAT - AttributeDescription *desc -#else - char* type -#endif -) + ID id ) { - static DBCache *db = NULL; - slap_index indexmask; -#ifndef SLAPD_SCHEMA_NOT_COMPAT - char *desc; + int rc; + Entry *e; + +#ifdef NEW_LOGGING + LDAP_LOG( BACK_LDBM, ENTRY, "ldbm_tool_entry_reindex: ID=%ld\n", + (long)id, 0, 0 ); +#else + Debug( LDAP_DEBUG_ARGS, "=> ldbm_tool_entry_reindex( %ld )\n", + (long) id, 0, 0 ); #endif - char *at_cname; - assert( slapMode & SLAP_TOOL_MODE ); -#ifdef SLAPD_SCHEMA_NOT_COMPAT - at_cname = desc->ad_cname->bv_val; -#else - attr_normalize( type ); - at_cname = desc = at_canonical_name( type ); + e = ldbm_tool_entry_get( be, id ); - if( desc == NULL ) { + if( e == NULL ) { +#ifdef NEW_LOGGING + LDAP_LOG( BACK_LDBM, INFO, + "ldbm_tool_entry_reindex: could not locate id %ld\n", + (long)id, 0, 0 ); +#else Debug( LDAP_DEBUG_ANY, - "<= index_attr NULL (attribute type %s has no canonical name)\n", - type, 0, 0 ); - return 0; - } + "ldbm_tool_entry_reindex:: could not locate id=%ld\n", + (long) id, 0, 0 ); #endif - assert( desc != NULL ); - attr_mask( be->be_private, desc, &indexmask ); - - if ( (db = ldbm_cache_open( be, at_cname, LDBM_SUFFIX, LDBM_NEWDB )) - == NULL ) - { - Debug( LDAP_DEBUG_ANY, - "<= index_attr NULL (could not open %s%s)\n", at_cname, - LDBM_SUFFIX, 0 ); - return 0; + return -1; } - ldbm_cache_close( be, db ); - - return indexmask != 0; -} + /* + * just (re)add them for now + * assume that some other routine (not yet implemented) + * will zap index databases + * + */ -int ldbm_tool_index_change( - BackendDB *be, -#ifdef SLAPD_SCHEMA_NOT_COMPAT - AttributeDescription *desc, +#ifdef NEW_LOGGING + LDAP_LOG( BACK_LDBM, ENTRY, + "ldbm_tool_entry_reindex: (%s) %ld\n", e->e_dn, id, 0 ); #else - char* desc, + Debug( LDAP_DEBUG_TRACE, "=> ldbm_tool_entry_reindex( %ld, \"%s\" )\n", + id, e->e_dn, 0 ); #endif - struct berval **bv, - ID id, - int op ) -{ - assert( slapMode & SLAP_TOOL_MODE ); -#ifdef SLAPD_SCHEMA_NOT_COMPAT - index_values( be, desc, bv, id, op ); -#else - index_change_values( be, - desc, bv, id, op ); + dn2id_add( be, &e->e_nname, e->e_id ); + rc = index_entry_add( be, e, e->e_attrs ); - return 0; -#endif + entry_free( e ); + + return rc; } int ldbm_tool_sync( BackendDB *be ) @@ -271,7 +316,9 @@ int ldbm_tool_sync( BackendDB *be ) assert( slapMode & SLAP_TOOL_MODE ); if ( li->li_nextid != NOID ) { - next_id_write( be, li->li_nextid ); + if ( next_id_write( be, li->li_nextid ) ) { + return( -1 ); + } } return 0;