summaryrefslogtreecommitdiffstats
path: root/servers/slapd/index.c
blob: 303cb9a159fd2815e453093f37490e0f968955a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* index.c - index utilities */
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
 *
 * Copyright 1998-2022 The OpenLDAP Foundation.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted only as authorized by the OpenLDAP
 * Public License.
 *
 * A copy of this license is available in the file LICENSE in the
 * top-level directory of the distribution or, alternatively, at
 * <http://www.OpenLDAP.org/license.html>.
 */

#include "portable.h"

#include <stdio.h>
#include <ac/string.h>
#include <lutil.h>

#include "slap.h"

static slap_verbmasks idxstr[] = {
	{ BER_BVC("pres"), SLAP_INDEX_PRESENT },
	{ BER_BVC("eq"), SLAP_INDEX_EQUALITY },
	{ BER_BVC("approx"), SLAP_INDEX_APPROX },
	{ BER_BVC("subinitial"), SLAP_INDEX_SUBSTR_INITIAL },
	{ BER_BVC("subany"), SLAP_INDEX_SUBSTR_ANY },
	{ BER_BVC("subfinal"), SLAP_INDEX_SUBSTR_FINAL },
	{ BER_BVC("sub"), SLAP_INDEX_SUBSTR_DEFAULT },
	{ BER_BVC("substr"), 0 },
	{ BER_BVC("notags"), SLAP_INDEX_NOTAGS },
	{ BER_BVC("nolang"), 0 },	/* backwards compat */
	{ BER_BVC("nosubtypes"), SLAP_INDEX_NOSUBTYPES },
	{ BER_BVNULL, 0 }
};


int slap_str2index( const char *str, slap_mask_t *idx )
{
	int i;

	i = verb_to_mask( str, idxstr );
	if ( BER_BVISNULL(&idxstr[i].word) ) return LDAP_OTHER;
	while ( !idxstr[i].mask ) i--;
	*idx = idxstr[i].mask;


	return LDAP_SUCCESS;
}

void slap_index2bvlen( slap_mask_t idx, struct berval *bv )
{
	int i;

	bv->bv_len = 0;

	for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
		if ( !idxstr[i].mask ) continue;
		if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
			if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
				((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
				continue;
			if ( bv->bv_len ) bv->bv_len++;
			bv->bv_len += idxstr[i].word.bv_len;
		}
	}
}

/* caller must provide buffer space, after calling index2bvlen */
void slap_index2bv( slap_mask_t idx, struct berval *bv )
{
	int i;
	char *ptr;

	if ( !bv->bv_len ) return;

	ptr = bv->bv_val;
	for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
		if ( !idxstr[i].mask ) continue;
		if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
			if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
				((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
				continue;
			if ( ptr != bv->bv_val ) *ptr++ = ',';
			ptr = lutil_strcopy( ptr, idxstr[i].word.bv_val );
		}
	}
}