summaryrefslogtreecommitdiffstats
path: root/src/backend.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend.c')
-rw-r--r--src/backend.c121
1 files changed, 75 insertions, 46 deletions
diff --git a/src/backend.c b/src/backend.c
index 393cc9d..a6946a1 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -55,7 +55,9 @@
/* The data we ask the map cache to keep, for us, for each map. */
struct backend_map_data {
struct plugin_state *state;
- char *domain, *map, **bases, *entry_filter, *key_format, *value_format;
+ char *domain, *map, **bases, *entry_filter, **key_formats;
+ char *value_format;
+ int n_key_formats;
char **ref_attrs;
struct format_inref_attr **inref_attrs;
};
@@ -120,6 +122,17 @@ backend_read_master_name(struct plugin_state *state, char **master)
slapi_entry_free(config);
return (*master != NULL) ? 0 : -1;
}
+static void
+backend_free_strlist(char **strlist)
+{
+ int i;
+ if (strlist) {
+ for (i = 0; strlist[i] != NULL; i++) {
+ free(strlist[i]);
+ }
+ free(strlist);
+ }
+}
static char **
backend_dup_strlist(char **strlist)
{
@@ -168,7 +181,7 @@ backend_free_map_data_contents(void *data)
format_free_attr_list(map_data->ref_attrs);
format_free_inref_attrs(map_data->inref_attrs);
free(map_data->entry_filter);
- free(map_data->key_format);
+ backend_free_strlist(map_data->key_formats);
free(map_data->value_format);
}
}
@@ -198,13 +211,13 @@ backend_copy_cb_data(const struct backend_map_data *data)
format_dup_inref_attrs(data->inref_attrs) :
NULL;
ret->entry_filter = strdup(data->entry_filter);
- ret->key_format = strdup(data->key_format);
+ ret->key_formats = backend_dup_strlist(data->key_formats);
ret->value_format = strdup(data->value_format);
if ((ret->domain == NULL) ||
(ret->map == NULL) ||
(ret->bases == NULL) ||
(ret->entry_filter == NULL) ||
- (ret->key_format == NULL) ||
+ (ret->key_formats == NULL) ||
(ret->value_format == NULL)) {
backend_free_map_data(ret);
return NULL;
@@ -218,13 +231,23 @@ static int
backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data)
{
struct backend_map_data *data;
- char *key, *value, *ndn;
+ char **keys, *value, *ndn;
int i, j;
data = callback_data;
/* Pull out the key and value for the entry. */
- key = format_get_data(data->state, NULL, e, data->domain, data->map,
- data->key_format,
- &data->ref_attrs, &data->inref_attrs);
+ keys = malloc((data->n_key_formats + 1) * sizeof(char *));
+ if (keys != NULL) {
+ for (i = 0; i < data->n_key_formats; i++) {
+ keys[i] = format_get_data(data->state, NULL, e,
+ data->domain, data->map,
+ data->key_formats[i],
+ &data->ref_attrs,
+ &data->inref_attrs);
+ }
+ keys[i] = NULL;
+ } else {
+ return 0;
+ }
value = format_get_data(data->state, NULL, e, data->domain, data->map,
data->value_format,
&data->ref_attrs, &data->inref_attrs);
@@ -232,15 +255,18 @@ backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data)
ndn = slapi_entry_get_ndn(e);
/* If we actually generated a value, then set it, otherwise clear it in
* case there was one set before. */
- if ((key != NULL) && (value != NULL)) {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- data->state->plugin_desc->spd_id,
- "setting domain/map/key/value "
- "\"%s\"/\"%s\"/\"%s\"(\"%s\")=\"%s\"\n",
- data->domain, data->map,
- key, ndn, value);
+ if ((keys != NULL) && (value != NULL)) {
+ for (i = 0; i < data->n_key_formats; i++) {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ data->state->plugin_desc->spd_id,
+ "setting domain/map/key/value "
+ "\"%s\"/\"%s\"/\"%s\"(\"%s\")=\"%s\"\n",
+ data->domain, data->map,
+ keys[i], ndn, value);
+ }
map_data_set_entry(data->state, data->domain, data->map, ndn,
- -1, key,
+ data->n_key_formats,
+ NULL, keys,
-1, value);
} else {
slapi_log_error(SLAPI_LOG_PLUGIN,
@@ -253,7 +279,10 @@ backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data)
ndn);
}
format_free_data(value);
- format_free_data(key);
+ for (i = 0; i < data->n_key_formats; i++) {
+ format_free_data(keys[i]);
+ }
+ free(keys);
return 0;
}
@@ -372,18 +401,20 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e,
const char *domain, const char *map,
bool_t *secure, struct backend_map_data *ret)
{
- const char *default_filter, *default_key_format, *default_value_format;
- char **bases, *entry_filter, *key_format, *value_format, *actual_attr;
+ const char *default_filter, **default_key_formats;
+ const char *default_value_format;
+ char **bases, *entry_filter, **key_formats, *value_format, *actual_attr;
char **ref_attrs;
struct format_inref_attr **inref_attrs;
- char **use_bases, *use_entry_filter, *use_key_format, *use_value_format;
+ char **use_bases, *use_entry_filter, **use_key_formats;
+ char *use_value_format;
const char *cvalue;
- int i, disposition, buffer_flags, count;
+ int i, j, disposition, buffer_flags, count;
Slapi_ValueSet *values;
Slapi_Value *value;
/* Read the hard-coded defaults for a map with this name. */
defaults_get_map_config(map, secure, &default_filter,
- &default_key_format, &default_value_format);
+ &default_key_formats, &default_value_format);
/* Read the values from the configuration entry. */
bases = NULL;
if (slapi_vattr_values_get(e, MAP_CONFIGURATION_BASE_ATTR, &values,
@@ -413,16 +444,24 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e,
}
slapi_vattr_values_free(&values, &actual_attr, buffer_flags);
}
- key_format = NULL;
+ key_formats = NULL;
if (slapi_vattr_values_get(e, MAP_CONFIGURATION_KEY_ATTR, &values,
&disposition, &actual_attr,
0, &buffer_flags) == 0) {
- i = slapi_valueset_first_value(values, &value);
- if (i != -1) {
- cvalue = slapi_value_get_string(value);
- key_format = strdup(cvalue);
+ key_formats = malloc((slapi_valueset_count(values) + 1) *
+ (sizeof (char *)));
+ if (key_formats != NULL) {
+ for (i = 0; i < slapi_valueset_count(values); i++) {
+ j = slapi_valueset_first_value(values, &value);
+ if (j != -1) {
+ cvalue = slapi_value_get_string(value);
+ key_formats[i] = strdup(cvalue);
+ }
+ slapi_vattr_values_free(&values, &actual_attr,
+ buffer_flags);
+ }
+ key_formats[i] = NULL;
}
- slapi_vattr_values_free(&values, &actual_attr, buffer_flags);
}
value_format = NULL;
if (slapi_vattr_values_get(e, MAP_CONFIGURATION_VALUE_ATTR, &values,
@@ -461,30 +500,25 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e,
entry_filter :
default_filter,
domain, map);
- use_key_format = key_format ?
- strdup(key_format) :
- strdup(default_key_format);
+ use_key_formats = key_formats ?
+ backend_dup_strlist(key_formats) :
+ backend_dup_strlist((char **) default_key_formats);
use_value_format = value_format ?
strdup(value_format) :
strdup(default_value_format);
use_bases = backend_dup_strlist(bases);
/* Free the values we read from the entry. */
free(value_format);
- free(key_format);
+ backend_free_strlist(key_formats);
free(entry_filter);
- if (bases) {
- for (i = 0; bases[i] != NULL; i++) {
- free(bases[i]);
- }
- free(bases);
- }
+ backend_free_strlist(bases);
/* Populate the returned structure. */
ret->state = state;
ret->domain = strdup(domain);
ret->map = strdup(map);
ret->bases = use_bases;
ret->entry_filter = use_entry_filter;
- ret->key_format = use_key_format;
+ ret->key_formats = use_key_formats;
ret->value_format = use_value_format;
ret->ref_attrs = NULL;
ret->inref_attrs = NULL;
@@ -495,7 +529,7 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e,
"key \"%s\", "
"value \"%s\"\n",
map, domain,
- use_entry_filter, use_key_format, use_value_format);
+ use_entry_filter, use_key_formats, use_value_format);
}
/* Given a directory server entry which represents a map's configuration, set
@@ -803,12 +837,7 @@ void
backend_free_map_config(char **bases, char *entry_filter)
{
int i;
- if (bases != NULL) {
- for (i = 0; bases[i] != NULL; i++) {
- free(bases[i]);
- }
- }
- free(bases);
+ backend_free_strlist(bases);
free(entry_filter);
}