static int ss_index_entry (Slapi_PBlock* pb) /* Compute substring index keys (when writing an entry). */ { auto int rc = LDAP_OPERATIONS_ERROR; auto size_t substringsLen = 0; struct berval** values; auto ss_indexer_t* ss = ss_indexer_get (pb); auto indexer_t* ix = ss ? ss->ss_indexer : NULL; if (ix != NULL && ix->ix_index != NULL && !slapi_pblock_get (pb, SLAPI_PLUGIN_MR_VALUES, &values)) { auto struct berval* substrings = NULL; auto struct berval** prefixes = NULL; auto struct berval** value; for (value = values; *value != NULL; ++value) { auto struct berval substring; substring.bv_val = (*value)->bv_val; substring.bv_len = (*value)->bv_len; if (long_enough (&substring, SS_INDEX_LENGTH-1)) { auto struct berval* prefix = &ss_index_initial; auto size_t offset; for (offset = 0; 1; ++offset) { ++substringsLen; substrings = (struct berval*) slapi_ch_realloc ((void*)substrings, substringsLen * sizeof(struct berval)); memcpy (&(substrings[substringsLen-1]), &substring, sizeof (struct berval)); prefixes = (struct berval**) slapi_ch_realloc ((void*)prefixes, substringsLen * sizeof(struct berval*)); prefixes[substringsLen-1] = prefix; if (offset != 0) LDAP_UTF8INC (substring.bv_val); substring.bv_len = (*value)->bv_len - (substring.bv_val - (*value)->bv_val); if (long_enough (&substring, SS_INDEX_LENGTH)) { prefix = &ss_index_middle; } else if (long_enough (&substring, SS_INDEX_LENGTH-1)) { prefix = &ss_index_final; } else { break; } } } } if (substrings != NULL) { auto struct berval** vector = (struct berval**) slapi_ch_malloc ((substringsLen+1) * sizeof(struct berval*)); auto size_t i; for (i = 0; i < substringsLen; ++i) vector[i] = &(substrings[i]); vector[substringsLen] = NULL; rc = slapi_pblock_set (pb, SLAPI_PLUGIN_MR_KEYS, ix->ix_index (ix, vector, prefixes)); slapi_ch_free((void**)&vector); slapi_ch_free((void**)&substrings); slapi_ch_free((void**)&prefixes); } } slapi_log_err(SLAPI_LOG_FILTER, COLLATE_PLUGIN_SUBSYSTEM, "ss_index_entry - (%p) %i %lu substrings\n", (void*)ss, rc, (unsigned long)substringsLen); return rc; }
char * next_word( char *s ) { if ( s == NULL ) { return( NULL ); } while ( ! iswordbreak( s ) ) { LDAP_UTF8INC( s ); } while ( iswordbreak( s ) ) { if ( *s == '\0' ) { return( NULL ); } else { LDAP_UTF8INC( s ); } } return( s ); }
static void ss_unescape (struct berval* val) { char* s = val->bv_val; char* t = s; char* limit = s + val->bv_len; while (s < limit) { if (!memcmp (s, "\\2a", 3) || !memcmp (s, "\\2A", 3)) { *t++ = WILDCARD; s += 3; } else if (!memcmp (s, "\\5c", 3) || !memcmp (s, "\\5C", 3)) { *t++ = '\\'; s += 3; } else { if (t == s) LDAP_UTF8INC (t); else t += LDAP_UTF8COPY (t, s); LDAP_UTF8INC (s); } } val->bv_len = t - val->bv_val; }
char * word_dup( char *w ) { char *s, *ret; char save; for ( s = w; !iswordbreak( s ); LDAP_UTF8INC( s )) ; /* NULL */ save = *s; *s = '\0'; ret = slapi_ch_strdup( w ); *s = save; return( ret ); }
static int long_enough (struct berval* bval, size_t enough) { if (bval) { auto size_t len = 0; auto char* next = bval->bv_val; auto char* last = next + bval->bv_len; while (next < last) { LDAP_UTF8INC (next); if (++len >= enough) { if (next > last) next = last; bval->bv_len = next - bval->bv_val; return 1; } } } return !enough; }
LDAP_CALL ldap_dn2ufn( const char *dn ) { char *p, *ufn, *r; size_t plen; int state; LDAPDebug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 ); if ( dn == NULL ) { dn = ""; } if ( ldap_is_dns_dn( dn ) || ( p = strchr( dn, '=' )) == NULL ) return( nsldapi_strdup( (char *)dn )); ufn = nsldapi_strdup( ++p ); #define INQUOTE 1 #define OUTQUOTE 2 state = OUTQUOTE; for ( p = ufn, r = ufn; *p; p += plen ) { plen = 1; switch ( *p ) { case '\\': if ( *++p == '\0' ) plen=0; else { *r++ = '\\'; r += (plen = LDAP_UTF8COPY(r,p)); } break; case '"': if ( state == INQUOTE ) state = OUTQUOTE; else state = INQUOTE; *r++ = *p; break; case ';': case ',': if ( state == OUTQUOTE ) *r++ = ','; else *r++ = *p; break; case '=': if ( state == INQUOTE ) *r++ = *p; else { char *rsave = r; LDAP_UTF8DEC(r); *rsave = '\0'; while ( !ldap_utf8isspace( r ) && *r != ';' && *r != ',' && r > ufn ) LDAP_UTF8DEC(r); LDAP_UTF8INC(r); if ( strcasecmp( r, "c" ) && strcasecmp( r, "o" ) && strcasecmp( r, "ou" ) && strcasecmp( r, "st" ) && strcasecmp( r, "l" ) && strcasecmp( r, "dc" ) && strcasecmp( r, "uid" ) && strcasecmp( r, "cn" ) ) { r = rsave; *r++ = '='; } } break; default: r += (plen = LDAP_UTF8COPY(r,p)); break; } } *r = '\0'; return( ufn ); }
static int ss_index_search (Slapi_PBlock* pb) /* Compute substring search keys (when searching for entries). */ { auto int rc = LDAP_OPERATIONS_ERROR; auto or_filter_t* or = or_filter_get (pb); if (or) { if (or->or_index_keys == NULL /* not yet computed */ && or->or_values && or->or_indexer && or->or_indexer->ix_index) { auto size_t substringsLen = 0; auto struct berval* substrings = NULL; auto struct berval** prefixes = NULL; auto struct berval** value; for (value = or->or_values; *value != NULL; ++value) { auto size_t offset; auto struct berval substring; substring.bv_val = (*value)->bv_val; for (offset = 0; 1; ++offset, LDAP_UTF8INC (substring.bv_val)) { auto struct berval* prefix = NULL; substring.bv_len = (*value)->bv_len - (substring.bv_val - (*value)->bv_val); if (offset == 0 && value == or->or_values) { if (long_enough (&substring, SS_INDEX_LENGTH - 1)) { prefix = &ss_index_initial; } } else if (value[1] != NULL) { if (long_enough (&substring, SS_INDEX_LENGTH)) { prefix = &ss_index_middle; } } else if (long_enough (&substring, SS_INDEX_LENGTH)) { prefix = &ss_index_middle; } else if (long_enough (&substring, SS_INDEX_LENGTH-1)) { prefix = &ss_index_final; } if (prefix == NULL) break; ++substringsLen; substrings = (struct berval*) slapi_ch_realloc ((void*)substrings, substringsLen * sizeof(struct berval)); memcpy (&(substrings[substringsLen-1]), &substring, sizeof (struct berval)); prefixes = (struct berval**) slapi_ch_realloc ((void*)prefixes, substringsLen * sizeof(struct berval*)); prefixes[substringsLen-1] = prefix; } } if (substrings != NULL) { auto indexer_t* ix = or->or_indexer; auto struct berval** vector = (struct berval**) slapi_ch_malloc ((substringsLen+1) * sizeof(struct berval*)); auto size_t i; for (i = 0; i < substringsLen; ++i) vector[i] = &(substrings[i]); vector[substringsLen] = NULL; or->or_index_keys = slapi_ch_bvecdup ( ix->ix_index (ix, vector, prefixes)); slapi_ch_free((void**)&vector); slapi_ch_free((void**)&substrings); slapi_ch_free((void**)&prefixes); } } if (or->or_index_keys) { rc = slapi_pblock_set (pb, SLAPI_PLUGIN_MR_KEYS, or->or_index_keys); } } slapi_log_err(SLAPI_LOG_FILTER, COLLATE_PLUGIN_SUBSYSTEM, "ss_index_search - (%p) %i\n", (void*)or, rc); return rc; }
/* lifted from isode-8.0 */ char * phonetic( char *s ) { char code, adjacent, ch; char *p; char **c; int i, cmax; char phoneme[MAXPHONEMELEN + 1]; p = s; if ( p == NULL || *p == '\0' ) { return( NULL ); } adjacent = '0'; phoneme[0] = TOUPPER(*p); phoneme[1] = '\0'; for ( i = 0; i < 99 && (! iswordbreak(p)); LDAP_UTF8INC( p )) { ch = TOUPPER (*p); code = '0'; switch (ch) { case 'B': case 'F': case 'P': case 'V': code = (adjacent != '1') ? '1' : '0'; break; case 'S': case 'C': case 'G': case 'J': case 'K': case 'Q': case 'X': case 'Z': code = (adjacent != '2') ? '2' : '0'; break; case 'D': case 'T': code = (adjacent != '3') ? '3' : '0'; break; case 'L': code = (adjacent != '4') ? '4' : '0'; break; case 'M': case 'N': code = (adjacent != '5') ? '5' : '0'; break; case 'R': code = (adjacent != '6') ? '6' : '0'; break; default: adjacent = '0'; } if ( i == 0 ) { adjacent = code; i++; } else if ( code != '0' ) { if ( i == MAXPHONEMELEN ) break; adjacent = phoneme[i] = code; i++; } } if ( i > 0 ) phoneme[i] = '\0'; return( slapi_ch_strdup( phoneme ) ); }