mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-27 18:19:52 -05:00
Implement DN_PARENT_PREFIX and framework for DN_SUBTREE_PREFIX.
This commit is contained in:
parent
49207930cf
commit
1ffe5122b7
6 changed files with 138 additions and 10 deletions
|
|
@ -24,8 +24,9 @@ LDAP_BEGIN_DECL
|
|||
|
||||
#define SUBLEN 3
|
||||
|
||||
#define DN_INDICES 1
|
||||
/* #define DN_INDICES 1 *//* generate dn eq, subtree, and parent indices */
|
||||
#define DN_EQ_PREFIX '='
|
||||
#define DN_ENTRY_PREFIX '='
|
||||
#define DN_SUBTREE_PREFIX '+'
|
||||
#define DN_PARENT_PREFIX '-'
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ dn2id_add(
|
|||
#else
|
||||
key.dsize = strlen( dn ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_EQ_PREFIX, dn );
|
||||
sprintf( key.dptr, "%c%s", DN_ENTRY_PREFIX, dn );
|
||||
#endif
|
||||
|
||||
data.dptr = (char *) &id;
|
||||
|
|
@ -56,12 +56,46 @@ dn2id_add(
|
|||
|
||||
rc = ldbm_cache_store( db, key, data, flags );
|
||||
|
||||
ldbm_cache_close( be, db );
|
||||
|
||||
#ifdef DN_INDICES
|
||||
free( key.dptr );
|
||||
|
||||
if ( rc != -1 ) {
|
||||
char *pdn = dn_parent( NULL, dn );
|
||||
|
||||
if( pdn != NULL ) {
|
||||
key.dsize = strlen( pdn ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_PARENT_PREFIX, pdn );
|
||||
rc = idl_insert_key( be, db, key, id );
|
||||
free( key.dptr );
|
||||
}
|
||||
}
|
||||
|
||||
if ( rc != -1 ) {
|
||||
char **subtree = dn_subtree( NULL, dn );
|
||||
|
||||
if( subtree != NULL ) {
|
||||
int i;
|
||||
for( i=0; subtree[i] != NULL; i++ ) {
|
||||
key.dsize = strlen( subtree[i] ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_SUBTREE_PREFIX, subtree[i] );
|
||||
|
||||
rc = idl_insert_key( be, db, key, id );
|
||||
|
||||
free( key.dptr );
|
||||
|
||||
if(rc == -1) break;
|
||||
}
|
||||
|
||||
charray_free( subtree );
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
ldbm_cache_close( be, db );
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "<= dn2id_add %d\n", rc, 0, 0 );
|
||||
return( rc );
|
||||
}
|
||||
|
|
@ -96,13 +130,48 @@ dn2id(
|
|||
return( NOID );
|
||||
}
|
||||
|
||||
#ifdef DN_INDICES
|
||||
{
|
||||
char *pdn = dn_parent( NULL, dn );
|
||||
|
||||
if( pdn != NULL ) {
|
||||
key.dsize = strlen( pdn ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_PARENT_PREFIX, pdn );
|
||||
(void) idl_delete_key( be, db, key, id );
|
||||
free( key.dptr );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
char **subtree = dn_subtree( NULL, dn );
|
||||
|
||||
if( subtree != NULL ) {
|
||||
int i;
|
||||
for( i=0; subtree[i] != NULL; i++ ) {
|
||||
key.dsize = strlen( dn ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_SUBTREE_PREFIX, dn );
|
||||
|
||||
(void) idl_delete_key( be, db, key, id );
|
||||
|
||||
free( key.dptr );
|
||||
}
|
||||
|
||||
charray_free( subtree );
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef DN_INDICES
|
||||
key.dptr = dn;
|
||||
key.dsize = strlen( key.dptr ) + 1;
|
||||
#else
|
||||
key.dsize = strlen( dn ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_EQ_PREFIX, dn );
|
||||
sprintf( key.dptr, "%c%s", DN_ENTRY_PREFIX, dn );
|
||||
#endif
|
||||
|
||||
data = ldbm_cache_fetch( db, key );
|
||||
|
|
@ -154,7 +223,7 @@ dn2id_delete(
|
|||
#else
|
||||
key.dsize = strlen( dn ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_EQ_PREFIX, dn );
|
||||
sprintf( key.dptr, "%c%s", DN_ENTRY_PREFIX, dn );
|
||||
#endif
|
||||
|
||||
rc = ldbm_cache_delete( db, key );
|
||||
|
|
|
|||
|
|
@ -133,8 +133,8 @@ index_read(
|
|||
ldbm_datum_init( key );
|
||||
|
||||
prefix = index2prefix( indextype );
|
||||
Debug( LDAP_DEBUG_TRACE, "=> index_read( \"%s\" \"%c\" \"%s\" )\n",
|
||||
type, prefix, val );
|
||||
Debug( LDAP_DEBUG_TRACE, "=> index_read(\"%c%s\"->\"%s\")\n",
|
||||
prefix, type, val );
|
||||
|
||||
attr_masks( be->be_private, type, &indexmask, &syntax );
|
||||
if ( ! (indextype & indexmask) ) {
|
||||
|
|
|
|||
|
|
@ -339,6 +339,19 @@ char * dn_rdn(
|
|||
return( dn );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* return a charray of all subtrees to which the DN resides in
|
||||
*/
|
||||
char **dn_subtree(
|
||||
Backend *be,
|
||||
char *dn )
|
||||
{
|
||||
/* not yet implemented */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* dn_issuffix - tells whether suffix is a suffix of dn. both dn
|
||||
* and suffix must be normalized.
|
||||
|
|
|
|||
|
|
@ -188,6 +188,7 @@ void connection_done LDAP_P((Connection *));
|
|||
char * dn_normalize LDAP_P(( char *dn ));
|
||||
char * dn_normalize_case LDAP_P(( char *dn ));
|
||||
char * dn_parent LDAP_P(( Backend *be, char *dn ));
|
||||
char ** dn_subtree LDAP_P(( Backend *be, char *dn ));
|
||||
char * dn_rdn LDAP_P(( Backend *be, char *dn ));
|
||||
int dn_issuffix LDAP_P(( char *dn, char *suffix ));
|
||||
#ifdef DNS_DN
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ main( int argc, char **argv )
|
|||
#else
|
||||
key.dsize = strlen( val ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_EQ_PREFIX, val );
|
||||
sprintf( key.dptr, "%c%s", DN_ENTRY_PREFIX, val );
|
||||
#endif
|
||||
data.dptr = (char *) &id;
|
||||
data.dsize = sizeof(ID);
|
||||
|
|
@ -102,7 +102,51 @@ main( int argc, char **argv )
|
|||
exit( EXIT_FAILURE );
|
||||
}
|
||||
#ifdef DN_INDICES
|
||||
free( val );
|
||||
free( key.dptr );
|
||||
|
||||
{
|
||||
int rc = 0;
|
||||
char *pdn = dn_parent( NULL, val );
|
||||
|
||||
if( pdn != NULL ) {
|
||||
key.dsize = strlen( pdn ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_PARENT_PREFIX, pdn );
|
||||
rc = idl_insert_key( be, db, key, id );
|
||||
free( key.dptr );
|
||||
}
|
||||
|
||||
if( rc == -1 ) {
|
||||
perror( "dn2id dn_parent insert" );
|
||||
exit( EXIT_FAILURE );
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
int rc = 0;
|
||||
char **subtree = dn_subtree( NULL, val );
|
||||
|
||||
if( subtree != NULL ) {
|
||||
int i;
|
||||
for( i=0; subtree[i] != NULL; i++ ) {
|
||||
key.dsize = strlen( subtree[i] ) + 2;
|
||||
key.dptr = ch_malloc( key.dsize );
|
||||
sprintf( key.dptr, "%c%s", DN_SUBTREE_PREFIX, subtree[i] );
|
||||
|
||||
rc = idl_insert_key( be, db, key, id );
|
||||
|
||||
free( key.dptr );
|
||||
|
||||
if( rc == -1 ) {
|
||||
perror( "dn2id dn_subtree insert" );
|
||||
exit( EXIT_FAILURE );
|
||||
}
|
||||
}
|
||||
|
||||
charray_free( subtree );
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue