diff options
author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-06-23 15:49:06 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-06-23 15:49:06 -0400 |
commit | fe00184309ed1130ece0c2c27da1bc5580f787c1 (patch) | |
tree | 9c7e2cea7b9e652e45044edc7f59183368e7e0ea /src/map.c | |
parent | 7a9ff3afd8c6d72544ff4629d96fa7095364a62e (diff) | |
download | slapi-nis-fe00184309ed1130ece0c2c27da1bc5580f787c1.tar.gz slapi-nis-fe00184309ed1130ece0c2c27da1bc5580f787c1.tar.xz slapi-nis-fe00184309ed1130ece0c2c27da1bc5580f787c1.zip |
- remove the set-at-initialization-time limit on the number of keys a map can
track
Diffstat (limited to 'src/map.c')
-rw-r--r-- | src/map.c | 23 |
1 files changed, 22 insertions, 1 deletions
@@ -75,6 +75,7 @@ struct { int key_index; } *entries; /* Search trees to speed up searches for entries. */ + unsigned int n_key_trees; void **key_trees; void *id_tree; /* Callback data supplied by the map writer. */ @@ -184,7 +185,7 @@ map_data_find_map_entry(struct plugin_state *state, if ((map == NULL) || (map->entries == NULL)) { return NULL; } - for (i = 0; i < map->entries->n_keys; i++) { + for (i = 0; i < map->n_key_trees; i++) { entry_template.keys = ((char **) &key) - i; entry_template.key_len = (&key_len) - i; entry_template.key_index = i; @@ -743,6 +744,7 @@ map_data_set_map(struct plugin_state *state, memset(map, 0, sizeof(*map)); map->name = strdup(map_name); map->key_trees = malloc(n_keys * sizeof(void *)); + map->n_key_trees = n_keys; map->secure = secure; map->backend_data = backend_data; map->free_backend_data = free_backend_data; @@ -848,11 +850,30 @@ map_data_set_entry(struct plugin_state *state, struct map *map; struct map_entry *entry; unsigned int i, key_len; + void **key_trees; map = map_data_find_map(state, domain_name, map_name); if (value_len == (unsigned int) -1) { value_len = strlen(value); } if (map != NULL) { + if (n_keys > map->n_key_trees) { + /* Create enough trees to allow us to index for all of + * these keys, even if it means more than we started + * with. */ + key_trees = malloc(sizeof(void *) * n_keys); + if (key_trees == NULL) { + return; /* XXX */ + } + memcpy(key_trees, map->key_trees, + map->n_key_trees * sizeof(void *)); + for (i = map->n_key_trees; i < n_keys; i++) { + key_trees[i] = NULL; + } + free(map->key_trees); + map->key_trees = key_trees; + map->n_key_trees = n_keys; + } + /* Search for an existing entry with this ID. */ entry = map_data_find_map_entry_id(state, map, id); if (entry != NULL) { /* There's already an entry with this ID, so let's |