]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema_init.c
cosmetic changes (the problem was not there)
[openldap] / servers / slapd / schema_init.c
index 09bdc46e1eb8d3e01d97698d05ee84574f8b8eb4..d5cda57d2b8431931ab128f7563e35e8667616c6 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2004 The OpenLDAP Foundation.
+ * Copyright 1998-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -25,8 +25,6 @@
 #include <ac/socket.h>
 
 #include "slap.h"
-#include "ldap_pvt.h"
-#include "lber_pvt.h"
 
 #include "ldap_utf8.h"
 
@@ -42,6 +40,7 @@
 #include <openssl/ssl.h>
 #endif
 
+#include "lutil.h"
 #include "lutil_hash.h"
 #define HASH_BYTES                             LUTIL_HASH_BYTES
 #define HASH_CONTEXT                   lutil_HASH_CTX
 #define IA5StringApproxIndexer                 approxIndexer
 #define IA5StringApproxFilter                  approxFilter
 
+/* Change Sequence Number (CSN) - much of this will change */
+#define csnValidate                            blobValidate
+#define csnMatch                               octetStringMatch
+#define csnOrderingMatch               octetStringOrderingMatch
+#define csnIndexer                             generalizedTimeIndexer
+#define csnFilter                              generalizedTimeFilter
+
+unsigned int index_substr_if_minlen = SLAP_INDEX_SUBSTR_IF_MINLEN_DEFAULT;
+unsigned int index_substr_if_maxlen = SLAP_INDEX_SUBSTR_IF_MAXLEN_DEFAULT;
+unsigned int index_substr_any_len = SLAP_INDEX_SUBSTR_ANY_LEN_DEFAULT;
+unsigned int index_substr_any_step = SLAP_INDEX_SUBSTR_ANY_STEP_DEFAULT;
+
 static int
 inValidate(
        Syntax *syntax,
@@ -150,6 +161,29 @@ octetStringOrderingMatch(
        return LDAP_SUCCESS;
 }
 
+hashDigestify(
+       HASH_CONTEXT *HASHcontext,
+       unsigned char *HASHdigest,
+       struct berval *prefix,
+       char pre,
+       Syntax *syntax,
+       MatchingRule *mr,
+       unsigned char *value,
+       int value_len)
+{
+       HASH_Init(HASHcontext);
+       if(prefix && prefix->bv_len > 0) {
+               HASH_Update(HASHcontext,
+                       (unsigned char *)prefix->bv_val, prefix->bv_len);
+       }
+       if(pre) HASH_Update(HASHcontext, (unsigned char*)&pre, sizeof(pre));
+       HASH_Update(HASHcontext, (unsigned char*)syntax->ssyn_oid, syntax->ssyn_oidlen);
+       HASH_Update(HASHcontext, (unsigned char*)mr->smr_oid, mr->smr_oidlen);
+       HASH_Update(HASHcontext, value, value_len);
+       HASH_Final(HASHdigest, HASHcontext);
+       return;
+}
+
 /* Index generation function */
 int octetStringIndexer(
        slap_mask_t use,
@@ -183,20 +217,8 @@ int octetStringIndexer(
        mlen = mr->smr_oidlen;
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
-               HASH_Init( &HASHcontext );
-               if( prefix != NULL && prefix->bv_len > 0 ) {
-                       HASH_Update( &HASHcontext,
-                               (unsigned char *)prefix->bv_val,
-                               prefix->bv_len );
-               }
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)syntax->ssyn_oid, slen );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)mr->smr_oid, mlen );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)values[i].bv_val, values[i].bv_len );
-               HASH_Final( HASHdigest, &HASHcontext );
-
+               hashDigestify( &HASHcontext, HASHdigest, prefix, 0,
+                       syntax, mr, (unsigned char *)values[i].bv_val, values[i].bv_len );
                ber_dupbv_x( &keys[i], &digest, ctx );
        }
 
@@ -233,18 +255,8 @@ int octetStringFilter(
 
        keys = slap_sl_malloc( sizeof( struct berval ) * 2, ctx );
 
-       HASH_Init( &HASHcontext );
-       if( prefix != NULL && prefix->bv_len > 0 ) {
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)prefix->bv_val, prefix->bv_len );
-       }
-       HASH_Update( &HASHcontext,
-               (unsigned char *)syntax->ssyn_oid, slen );
-       HASH_Update( &HASHcontext,
-               (unsigned char *)mr->smr_oid, mlen );
-       HASH_Update( &HASHcontext,
-               (unsigned char *)value->bv_val, value->bv_len );
-       HASH_Final( HASHdigest, &HASHcontext );
+       hashDigestify( &HASHcontext, HASHdigest, prefix, 0,
+               syntax, mr, (unsigned char *)value->bv_val, value->bv_len );
 
        ber_dupbv_x( keys, &digest, ctx );
        keys[1].bv_val = NULL;
@@ -391,7 +403,7 @@ octetStringSubstringsIndexer(
        BerVarray *keysp,
        void *ctx )
 {
-       ber_len_t i, j, nkeys;
+       ber_len_t i, j, len, nkeys;
        size_t slen, mlen;
        BerVarray keys;
 
@@ -406,26 +418,26 @@ octetStringSubstringsIndexer(
        for( i=0; values[i].bv_val != NULL; i++ ) {
                /* count number of indices to generate */
                if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
-                       if( values[i].bv_len >= SLAP_INDEX_SUBSTR_IF_MAXLEN ) {
-                               nkeys += SLAP_INDEX_SUBSTR_IF_MAXLEN -
-                                       (SLAP_INDEX_SUBSTR_IF_MINLEN - 1);
-                       } else if( values[i].bv_len >= SLAP_INDEX_SUBSTR_IF_MINLEN ) {
-                               nkeys += values[i].bv_len - (SLAP_INDEX_SUBSTR_IF_MINLEN - 1);
+                       if( values[i].bv_len >= index_substr_if_maxlen ) {
+                               nkeys += index_substr_if_maxlen -
+                                       (index_substr_if_minlen - 1);
+                       } else if( values[i].bv_len >= index_substr_if_minlen ) {
+                               nkeys += values[i].bv_len - (index_substr_if_minlen - 1);
                        }
                }
 
                if( flags & SLAP_INDEX_SUBSTR_ANY ) {
-                       if( values[i].bv_len >= SLAP_INDEX_SUBSTR_ANY_LEN ) {
-                               nkeys += values[i].bv_len - (SLAP_INDEX_SUBSTR_ANY_LEN - 1);
+                       if( values[i].bv_len >= index_substr_any_len ) {
+                               nkeys += values[i].bv_len - (index_substr_any_len - 1);
                        }
                }
 
                if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
-                       if( values[i].bv_len >= SLAP_INDEX_SUBSTR_IF_MAXLEN ) {
-                               nkeys += SLAP_INDEX_SUBSTR_IF_MAXLEN -
-                                       ( SLAP_INDEX_SUBSTR_IF_MINLEN - 1);
-                       } else if( values[i].bv_len >= SLAP_INDEX_SUBSTR_IF_MINLEN ) {
-                               nkeys += values[i].bv_len - (SLAP_INDEX_SUBSTR_IF_MINLEN - 1);
+                       if( values[i].bv_len >= index_substr_if_maxlen ) {
+                               nkeys += index_substr_if_maxlen -
+                                       (index_substr_if_minlen - 1);
+                       } else if( values[i].bv_len >= index_substr_if_minlen ) {
+                               nkeys += values[i].bv_len - (index_substr_if_minlen - 1);
                        }
                }
        }
@@ -446,79 +458,38 @@ octetStringSubstringsIndexer(
                ber_len_t j,max;
 
                if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
-                       ( values[i].bv_len >= SLAP_INDEX_SUBSTR_ANY_LEN ) )
+                       ( values[i].bv_len >= index_substr_any_len ) )
                {
                        char pre = SLAP_INDEX_SUBSTR_PREFIX;
-                       max = values[i].bv_len - (SLAP_INDEX_SUBSTR_ANY_LEN - 1);
+                       max = values[i].bv_len - (index_substr_any_len - 1);
 
                        for( j=0; j<max; j++ ) {
-                               HASH_Init( &HASHcontext );
-                               if( prefix != NULL && prefix->bv_len > 0 ) {
-                                       HASH_Update( &HASHcontext,
-                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
-                               }
-
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)&pre, sizeof( pre ) );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)syntax->ssyn_oid, slen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)mr->smr_oid, mlen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)&values[i].bv_val[j],
-                                       SLAP_INDEX_SUBSTR_ANY_LEN );
-                               HASH_Final( HASHdigest, &HASHcontext );
-
+                               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                                       syntax, mr, (unsigned char *)&values[i].bv_val[j], index_substr_any_len);
                                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
                        }
                }
 
                /* skip if too short */ 
-               if( values[i].bv_len < SLAP_INDEX_SUBSTR_IF_MINLEN ) continue;
+               if( values[i].bv_len < index_substr_if_minlen ) continue;
 
-               max = SLAP_INDEX_SUBSTR_IF_MAXLEN < values[i].bv_len
-                       ? SLAP_INDEX_SUBSTR_IF_MAXLEN : values[i].bv_len;
+               max = index_substr_if_maxlen < values[i].bv_len
+                       ? index_substr_if_maxlen : values[i].bv_len;
 
-               for( j=SLAP_INDEX_SUBSTR_IF_MINLEN; j<=max; j++ ) {
+               for( j=index_substr_if_minlen; j<=max; j++ ) {
                        char pre;
 
                        if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
                                pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
-                               HASH_Init( &HASHcontext );
-                               if( prefix != NULL && prefix->bv_len > 0 ) {
-                                       HASH_Update( &HASHcontext,
-                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
-                               }
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)&pre, sizeof( pre ) );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)syntax->ssyn_oid, slen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)mr->smr_oid, mlen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)values[i].bv_val, j );
-                               HASH_Final( HASHdigest, &HASHcontext );
-
+                               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                                       syntax, mr, (unsigned char *)values[i].bv_val, j );
                                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
                        }
 
                        if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
                                pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
-                               HASH_Init( &HASHcontext );
-                               if( prefix != NULL && prefix->bv_len > 0 ) {
-                                       HASH_Update( &HASHcontext,
-                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
-                               }
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)&pre, sizeof( pre ) );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)syntax->ssyn_oid, slen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)mr->smr_oid, mlen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)&values[i].bv_val[values[i].bv_len-j], j );
-                               HASH_Final( HASHdigest, &HASHcontext );
-
+                               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                                       syntax, mr, (unsigned char *)&values[i].bv_val[values[i].bv_len-j], j );
                                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
                        }
 
@@ -549,7 +520,7 @@ octetStringSubstringsFilter (
 {
        SubstringsAssertion *sa;
        char pre;
-       ber_len_t nkeys = 0;
+       ber_len_t len, max, nkeys = 0;
        size_t slen, mlen, klen;
        BerVarray keys;
        HASH_CONTEXT HASHcontext;
@@ -561,27 +532,37 @@ octetStringSubstringsFilter (
 
        if( flags & SLAP_INDEX_SUBSTR_INITIAL &&
                sa->sa_initial.bv_val != NULL &&
-               sa->sa_initial.bv_len >= SLAP_INDEX_SUBSTR_IF_MINLEN )
+               sa->sa_initial.bv_len >= index_substr_if_minlen )
        {
                nkeys++;
+               if ( sa->sa_initial.bv_len > index_substr_if_maxlen &&
+                       ( flags & SLAP_INDEX_SUBSTR_ANY ))
+               {
+                       nkeys += (sa->sa_initial.bv_len - index_substr_if_maxlen) / index_substr_any_step;
+               }
        }
 
        if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
                ber_len_t i;
                for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) {
-                       if( sa->sa_any[i].bv_len >= SLAP_INDEX_SUBSTR_ANY_LEN ) {
+                       if( sa->sa_any[i].bv_len >= index_substr_any_len ) {
                                /* don't bother accounting with stepping */
                                nkeys += sa->sa_any[i].bv_len -
-                                       ( SLAP_INDEX_SUBSTR_ANY_LEN - 1 );
+                                       ( index_substr_any_len - 1 );
                        }
                }
        }
 
        if( flags & SLAP_INDEX_SUBSTR_FINAL &&
                sa->sa_final.bv_val != NULL &&
-               sa->sa_final.bv_len >= SLAP_INDEX_SUBSTR_IF_MINLEN )
+               sa->sa_final.bv_len >= index_substr_if_minlen )
        {
                nkeys++;
+               if ( sa->sa_final.bv_len > index_substr_if_maxlen &&
+                       ( flags & SLAP_INDEX_SUBSTR_ANY ))
+               {
+                       nkeys += (sa->sa_final.bv_len - index_substr_if_maxlen) / index_substr_any_step;
+               }
        }
 
        if( nkeys == 0 ) {
@@ -600,63 +581,52 @@ octetStringSubstringsFilter (
 
        if( flags & SLAP_INDEX_SUBSTR_INITIAL &&
                sa->sa_initial.bv_val != NULL &&
-               sa->sa_initial.bv_len >= SLAP_INDEX_SUBSTR_IF_MINLEN )
+               sa->sa_initial.bv_len >= index_substr_if_minlen )
        {
                pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
                value = &sa->sa_initial;
 
-               klen = SLAP_INDEX_SUBSTR_IF_MAXLEN < value->bv_len
-                       ? SLAP_INDEX_SUBSTR_IF_MAXLEN : value->bv_len;
-
-               HASH_Init( &HASHcontext );
-               if( prefix != NULL && prefix->bv_len > 0 ) {
-                       HASH_Update( &HASHcontext,
-                               (unsigned char *)prefix->bv_val, prefix->bv_len );
-               }
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)&pre, sizeof( pre ) );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)syntax->ssyn_oid, slen );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)mr->smr_oid, mlen );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)value->bv_val, klen );
-               HASH_Final( HASHdigest, &HASHcontext );
+               klen = index_substr_if_maxlen < value->bv_len
+                       ? index_substr_if_maxlen : value->bv_len;
 
+               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                       syntax, mr, (unsigned char *)value->bv_val, klen );
                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
+
+               /* If initial is too long and we have subany indexed, use it
+                * to match the excess...
+                */
+               if (value->bv_len > index_substr_if_maxlen && (flags & SLAP_INDEX_SUBSTR_ANY))
+               {
+                       ber_len_t j;
+                       pre = SLAP_INDEX_SUBSTR_PREFIX;
+                       for ( j=index_substr_if_maxlen-1; j <= value->bv_len - index_substr_any_len; j+=index_substr_any_step )
+                       {
+                               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                                       syntax, mr, (unsigned char *)&value->bv_val[j], index_substr_any_len );
+                               ber_dupbv_x( &keys[nkeys++], &digest, ctx );
+                       }
+               }
        }
 
        if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
                ber_len_t i, j;
                pre = SLAP_INDEX_SUBSTR_PREFIX;
-               klen = SLAP_INDEX_SUBSTR_ANY_LEN;
+               klen = index_substr_any_len;
 
                for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) {
-                       if( sa->sa_any[i].bv_len < SLAP_INDEX_SUBSTR_ANY_LEN ) {
+                       if( sa->sa_any[i].bv_len < index_substr_any_len ) {
                                continue;
                        }
 
                        value = &sa->sa_any[i];
 
                        for(j=0;
-                               j <= value->bv_len - SLAP_INDEX_SUBSTR_ANY_LEN;
-                               j += SLAP_INDEX_SUBSTR_ANY_STEP )
+                               j <= value->bv_len - index_substr_any_len;
+                               j += index_substr_any_step )
                        {
-                               HASH_Init( &HASHcontext );
-                               if( prefix != NULL && prefix->bv_len > 0 ) {
-                                       HASH_Update( &HASHcontext,
-                                               (unsigned char *)prefix->bv_val, prefix->bv_len );
-                               }
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)&pre, sizeof( pre ) );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)syntax->ssyn_oid, slen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)mr->smr_oid, mlen );
-                               HASH_Update( &HASHcontext,
-                                       (unsigned char *)&value->bv_val[j], klen ); 
-                               HASH_Final( HASHdigest, &HASHcontext );
-
+                               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                                       syntax, mr, (unsigned char *)&value->bv_val[j], klen ); 
                                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
                        }
                }
@@ -664,30 +634,32 @@ octetStringSubstringsFilter (
 
        if( flags & SLAP_INDEX_SUBSTR_FINAL &&
                sa->sa_final.bv_val != NULL &&
-               sa->sa_final.bv_len >= SLAP_INDEX_SUBSTR_IF_MINLEN )
+               sa->sa_final.bv_len >= index_substr_if_minlen )
        {
                pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
                value = &sa->sa_final;
 
-               klen = SLAP_INDEX_SUBSTR_IF_MAXLEN < value->bv_len
-                       ? SLAP_INDEX_SUBSTR_IF_MAXLEN : value->bv_len;
-
-               HASH_Init( &HASHcontext );
-               if( prefix != NULL && prefix->bv_len > 0 ) {
-                       HASH_Update( &HASHcontext,
-                               (unsigned char *)prefix->bv_val, prefix->bv_len );
-               }
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)&pre, sizeof( pre ) );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)syntax->ssyn_oid, slen );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)mr->smr_oid, mlen );
-               HASH_Update( &HASHcontext,
-                       (unsigned char *)&value->bv_val[value->bv_len-klen], klen );
-               HASH_Final( HASHdigest, &HASHcontext );
+               klen = index_substr_if_maxlen < value->bv_len
+                       ? index_substr_if_maxlen : value->bv_len;
 
+               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                       syntax, mr, (unsigned char *)&value->bv_val[value->bv_len-klen], klen );
                ber_dupbv_x( &keys[nkeys++], &digest, ctx );
+
+               /* If final is too long and we have subany indexed, use it
+                * to match the excess...
+                */
+               if (value->bv_len > index_substr_if_maxlen && (flags & SLAP_INDEX_SUBSTR_ANY))
+               {
+                       ber_len_t j;
+                       pre = SLAP_INDEX_SUBSTR_PREFIX;
+                       for ( j=0; j <= value->bv_len - index_substr_if_maxlen; j+=index_substr_any_step )
+                       {
+                               hashDigestify( &HASHcontext, HASHdigest, prefix, pre,
+                                       syntax, mr, (unsigned char *)&value->bv_val[j], index_substr_any_len );
+                               ber_dupbv_x( &keys[nkeys++], &digest, ctx );
+                       }
+               }
        }
 
        if( nkeys > 0 ) {
@@ -923,11 +895,7 @@ nameUIDPretty(
        assert( out );
 
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ARGS, ">>> nameUIDPretty: <%s>\n", val->bv_val, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, ">>> nameUIDPretty: <%s>\n", val->bv_val, 0, 0 );
-#endif
 
        if( val->bv_len == 0 ) {
                ber_dupbv_x( out, val, ctx );
@@ -1000,11 +968,7 @@ nameUIDPretty(
                }
        }
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ARGS, "<<< nameUIDPretty: <%s>\n", out->bv_val, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "<<< nameUIDPretty: <%s>\n", out->bv_val, 0, 0 );
-#endif
 
        return LDAP_SUCCESS;
 }
@@ -1941,7 +1905,6 @@ UUIDValidate(
 {
        int i;
        if( in->bv_len != 36 ) {
-               assert(0);
                return LDAP_INVALID_SYNTAX;
        }
 
@@ -1978,7 +1941,7 @@ UUIDNormalize(
        int i;
        int j;
        normalized->bv_len = 16;
-       normalized->bv_val = slap_sl_malloc( normalized->bv_len+1, ctx );
+       normalized->bv_val = slap_sl_malloc( normalized->bv_len + 1, ctx );
 
        for( i=0, j=0; i<36; i++ ) {
                unsigned char nibble;
@@ -2204,13 +2167,8 @@ serialNumberAndIssuerPretty(
        assert( val );
        assert( out );
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ARGS, ">>> serialNumberAndIssuerPretty: <%s>\n",
-               val->bv_val, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, ">>> serialNumberAndIssuerPretty: <%s>\n",
                val->bv_val, 0, 0 );
-#endif
 
        if( val->bv_len < 3 ) return LDAP_INVALID_SYNTAX;
 
@@ -2255,13 +2213,8 @@ serialNumberAndIssuerPretty(
        /* terminate */
        out->bv_val[out->bv_len] = '\0';
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ARGS, "<<< serialNumberAndIssuerPretty: <%s>\n",
-               out->bv_val, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "<<< serialNumberAndIssuerPretty: <%s>\n",
                out->bv_val, 0, 0 );
-#endif
 
        return LDAP_SUCCESS;
 }
@@ -2289,13 +2242,8 @@ serialNumberAndIssuerNormalize(
        assert( val );
        assert( out );
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ARGS, ">>> serialNumberAndIssuerNormalize: <%s>\n",
-               val->bv_val, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, ">>> serialNumberAndIssuerNormalize: <%s>\n",
                val->bv_val, 0, 0 );
-#endif
 
        if( val->bv_len < 3 ) return LDAP_INVALID_SYNTAX;
 
@@ -2342,13 +2290,8 @@ serialNumberAndIssuerNormalize(
        /* terminate */
        out->bv_val[out->bv_len] = '\0';
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ARGS, "<<< serialNumberAndIssuerNormalize: <%s>\n",
-               out->bv_val, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "<<< serialNumberAndIssuerNormalize: <%s>\n",
                out->bv_val, 0, 0 );
-#endif
 
        return rc;
 }
@@ -2405,13 +2348,8 @@ certificateExactNormalize(
        p += issuer_dn.bv_len;
        *p = '\0';
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( CONFIG, ARGS, "certificateExactNormalize: %s\n",
-               normalized->bv_val, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "certificateExactNormalize: %s\n",
                normalized->bv_val, NULL, NULL );
-#endif
 
 done:
        if (xcert) X509_free(xcert);
@@ -2490,8 +2428,7 @@ check_time_syntax (struct berval *val,
        }
 
        /* leapyear check for the Gregorian calendar (year>1581) */
-       if (parts[parts[1] == 0 ? 0 : 1] % 4 == 0)
-       {
+       if (parts[parts[1] == 0 ? 0 : 1] % 4 == 0) {
                leapyear = 1;
        }
 
@@ -2504,16 +2441,17 @@ check_time_syntax (struct berval *val,
                fraction->bv_len = 0;
                if (p < e && (*p == '.' || *p == ',')) {
                        char *end_num;
-                       while (++p < e && ASCII_DIGIT(*p))
-                               ;
+                       while (++p < e && ASCII_DIGIT(*p)) {
+                               /* EMTPY */;
+                       }
                        if (p - fraction->bv_val == 1) {
                                return LDAP_INVALID_SYNTAX;
                        }
-                       for (end_num = p; end_num[-1] == '0'; --end_num)
-                               ;
+                       for (end_num = p; end_num[-1] == '0'; --end_num) {
+                               /* EMPTY */;
+                       }
                        c = end_num - fraction->bv_val;
-                       if (c != 1)
-                               fraction->bv_len = c;
+                       if (c != 1) fraction->bv_len = c;
                }
        }
 
@@ -2714,6 +2652,111 @@ generalizedTimeOrderingMatch(
        return LDAP_SUCCESS;
 }
 
+/* Index generation function */
+int generalizedTimeIndexer(
+       slap_mask_t use,
+       slap_mask_t flags,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *prefix,
+       BerVarray values,
+       BerVarray *keysp,
+       void *ctx )
+{
+       int i, j;
+       size_t slen, mlen;
+       BerVarray keys;
+       char tmp[5];
+       BerValue bvtmp; /* 40 bit index */
+       struct lutil_tm tm;
+       struct lutil_timet tt;
+
+       bvtmp.bv_len = sizeof(tmp);
+       bvtmp.bv_val = tmp;
+       for( i=0; values[i].bv_val != NULL; i++ ) {
+               /* just count them */
+       }
+
+       /* we should have at least one value at this point */
+       assert( i > 0 );
+
+       keys = slap_sl_malloc( sizeof( struct berval ) * (i+1), ctx );
+
+       /* GeneralizedTime YYYYmmddHH[MM[SS]][(./,)d...](Z|(+/-)HH[MM]) */
+       for( i=0, j=0; values[i].bv_val != NULL; i++ ) {
+               assert(values[i].bv_val != NULL && values[i].bv_len >= 10);
+               /* Use 40 bits of time for key */
+               if ( lutil_parsetime( values[i].bv_val, &tm ) == 0 ) {
+                       lutil_tm2time( &tm, &tt );
+                       tmp[0] = tt.tt_gsec & 0xff;
+                       tmp[4] = tt.tt_sec & 0xff;
+                       tt.tt_sec >>= 8;
+                       tmp[3] = tt.tt_sec & 0xff;
+                       tt.tt_sec >>= 8;
+                       tmp[2] = tt.tt_sec & 0xff;
+                       tt.tt_sec >>= 8;
+                       tmp[1] = tt.tt_sec & 0xff;
+                       
+                       ber_dupbv_x(&keys[j++], &bvtmp, ctx );
+               }
+       }
+
+       keys[j].bv_val = NULL;
+       keys[j].bv_len = 0;
+
+       *keysp = keys;
+
+       return LDAP_SUCCESS;
+}
+
+/* Index generation function */
+int generalizedTimeFilter(
+       slap_mask_t use,
+       slap_mask_t flags,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *prefix,
+       void * assertedValue,
+       BerVarray *keysp,
+       void *ctx )
+{
+       BerVarray keys;
+       char tmp[5];
+       BerValue bvtmp; /* 40 bit index */
+       BerValue *value = (BerValue *) assertedValue;
+       struct lutil_tm tm;
+       struct lutil_timet tt;
+       
+       bvtmp.bv_len = sizeof(tmp);
+       bvtmp.bv_val = tmp;
+       /* GeneralizedTime YYYYmmddHH[MM[SS]][(./,)d...](Z|(+/-)HH[MM]) */
+       /* Use 40 bits of time for key */
+       if ( value->bv_val && value->bv_len >= 10 &&
+               lutil_parsetime( value->bv_val, &tm ) == 0 ) {
+
+               lutil_tm2time( &tm, &tt );
+               tmp[0] = tt.tt_gsec & 0xff;
+               tmp[4] = tt.tt_sec & 0xff;
+               tt.tt_sec >>= 8;
+               tmp[3] = tt.tt_sec & 0xff;
+               tt.tt_sec >>= 8;
+               tmp[2] = tt.tt_sec & 0xff;
+               tt.tt_sec >>= 8;
+               tmp[1] = tt.tt_sec & 0xff;
+
+               keys = slap_sl_malloc( sizeof( struct berval ) * 2, ctx );
+               ber_dupbv_x(keys, &bvtmp, ctx );
+               keys[1].bv_val = NULL;
+               keys[1].bv_len = 0;
+       } else {
+               keys = NULL;
+       }
+
+       *keysp = keys;
+
+       return LDAP_SUCCESS;
+}
+
 static int
 deliveryMethodValidate(
        Syntax *syntax,
@@ -3032,10 +3075,14 @@ static slap_syntax_defs_rec syntax_defs[] = {
                0, countryStringValidate, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
                0, dnValidate, dnPretty},
-
        {"( 1.2.36.79672281.1.5.0 DESC 'RDN' )",
                0, rdnValidate, rdnPretty},
-
+#ifdef LDAP_COMP_MATCH
+       {"( 1.2.36.79672281.1.5.3 DESC 'allComponents' )",
+               0, allComponentsValidate, NULL},
+       {"( 1.2.36.79672281.1.5.2 DESC 'componentFilterMatch assertion') ",
+               0, componentFilterValidate, NULL},
+#endif
        {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
                0, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
@@ -3154,6 +3201,9 @@ static slap_syntax_defs_rec syntax_defs[] = {
        {"( 1.3.6.1.4.1.4203.666.2.6 DESC 'UUID' )",
                SLAP_SYNTAX_HIDE, UUIDValidate, NULL},
 
+       {"( 1.3.6.1.4.1.4203.666.11.2.1 DESC 'CSN' )",
+               SLAP_SYNTAX_HIDE, csnValidate, NULL},
+
        /* OpenLDAP Void Syntax */
        {"( 1.3.6.1.4.1.4203.1.1.1 DESC 'OpenLDAP void' )" ,
                SLAP_SYNTAX_HIDE, inValidate, NULL},
@@ -3164,6 +3214,12 @@ char *certificateExactMatchSyntaxes[] = {
        "1.3.6.1.4.1.1466.115.121.1.8" /* certificate */,
        NULL
 };
+#ifdef LDAP_COMP_MATCH
+char *componentFilterMatchSyntaxes[] = {
+       "1.3.6.1.4.1.1466.115.121.1.8" /* certificate */,
+       NULL
+};
+#endif
 char *directoryStringSyntaxes[] = {
        "1.3.6.1.4.1.1466.115.121.1.44" /* printableString */,
        NULL
@@ -3241,6 +3297,35 @@ static slap_mrule_defs_rec mrule_defs[] = {
                NULL, dnNormalize, dnMatch,
                octetStringIndexer, octetStringFilter,
                NULL },
+
+       {"( 1.3.6.1.4.1.4203.666.4.9 NAME 'dnSubtreeMatch' "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
+               SLAP_MR_HIDE | SLAP_MR_EXT, NULL,
+               NULL, dnNormalize, dnRelativeMatch,
+               NULL, NULL,
+               NULL },
+
+       {"( 1.3.6.1.4.1.4203.666.4.8 NAME 'dnOneLevelMatch' "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
+               SLAP_MR_HIDE | SLAP_MR_EXT, NULL,
+               NULL, dnNormalize, dnRelativeMatch,
+               NULL, NULL,
+               NULL },
+
+       {"( 1.3.6.1.4.1.4203.666.4.10 NAME 'dnSubordinateMatch' "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
+               SLAP_MR_HIDE | SLAP_MR_EXT, NULL,
+               NULL, dnNormalize, dnRelativeMatch,
+               NULL, NULL,
+               NULL },
+
+       {"( 1.3.6.1.4.1.4203.666.4.11 NAME 'dnSuperiorMatch' "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
+               SLAP_MR_HIDE | SLAP_MR_EXT, NULL,
+               NULL, dnNormalize, dnRelativeMatch,
+               NULL, NULL,
+               NULL },
+
        {"( 1.2.36.79672281.1.13.3 NAME 'rdnMatch' "
                "SYNTAX 1.2.36.79672281.1.5.0 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
@@ -3248,6 +3333,29 @@ static slap_mrule_defs_rec mrule_defs[] = {
                octetStringIndexer, octetStringFilter,
                NULL },
 
+#ifdef LDAP_COMP_MATCH
+       {"( 1.2.36.79672281.1.13.2 NAME 'componentFilterMatch' "
+               "SYNTAX 1.2.36.79672281.1.5.2 )",
+               SLAP_MR_EXT|SLAP_MR_COMPONENT, componentFilterMatchSyntaxes,
+               NULL, NULL , componentFilterMatch,
+               octetStringIndexer, octetStringFilter,
+               NULL },
+
+        {"( 1.2.36.79672281.1.13.6 NAME 'allComponentsMatch' "
+                "SYNTAX 1.2.36.79672281.1.5.3 )",
+                SLAP_MR_EQUALITY|SLAP_MR_EXT|SLAP_MR_COMPONENT, NULL,
+                NULL, NULL , allComponentsMatch,
+                octetStringIndexer, octetStringFilter,
+                NULL },
+
+        {"( 1.2.36.79672281.1.13.7 NAME 'directoryComponentsMatch' "
+                "SYNTAX 1.2.36.79672281.1.5.3 )",
+                SLAP_MR_EQUALITY|SLAP_MR_EXT|SLAP_MR_COMPONENT, NULL,
+                NULL, NULL , directoryComponentsMatch,
+                octetStringIndexer, octetStringFilter,
+                NULL },
+#endif
+
        {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, directoryStringSyntaxes,
@@ -3405,14 +3513,14 @@ static slap_mrule_defs_rec mrule_defs[] = {
 
        {"( 2.5.13.27 NAME 'generalizedTimeMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
-               SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
+               SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_ORDERED_INDEX, NULL,
                NULL, generalizedTimeNormalize, octetStringMatch,
-               NULL, NULL,
+               generalizedTimeIndexer, generalizedTimeFilter,
                NULL },
 
        {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
-               SLAP_MR_ORDERING, NULL,
+               SLAP_MR_ORDERING | SLAP_MR_ORDERED_INDEX, NULL,
                NULL, generalizedTimeNormalize, generalizedTimeOrderingMatch,
                NULL, NULL,
                "generalizedTimeMatch" },
@@ -3530,6 +3638,20 @@ static slap_mrule_defs_rec mrule_defs[] = {
                octetStringIndexer, octetStringFilter,
                "UUIDMatch"},
 
+       {"( 1.3.6.1.4.1.4203.666.11.2.2 NAME 'CSNMatch' "
+               "SYNTAX 1.3.6.1.4.1.4203.666.11.2.1 )",
+               SLAP_MR_HIDE | SLAP_MR_EQUALITY | SLAP_MR_ORDERED_INDEX, NULL,
+               NULL, NULL, csnMatch,
+               csnIndexer, csnFilter,
+               NULL},
+
+       {"( 1.3.6.1.4.1.4203.666.11.2.3 NAME 'CSNOrderingMatch' "
+               "SYNTAX 1.3.6.1.4.1.4203.666.11.2.1 )",
+               SLAP_MR_HIDE | SLAP_MR_ORDERING | SLAP_MR_ORDERED_INDEX, NULL,
+               NULL, NULL, csnOrderingMatch,
+               NULL, NULL,
+               "CSNMatch" },
+
        {NULL, SLAP_MR_NONE, NULL,
                NULL, NULL, NULL, NULL, NULL,
                NULL }