summaryrefslogtreecommitdiffstats
path: root/src/map.c
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-06-23 15:49:06 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-06-23 15:49:06 -0400
commitfe00184309ed1130ece0c2c27da1bc5580f787c1 (patch)
tree9c7e2cea7b9e652e45044edc7f59183368e7e0ea /src/map.c
parent7a9ff3afd8c6d72544ff4629d96fa7095364a62e (diff)
downloadslapi-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.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/map.c b/src/map.c
index f8ed3c7..73d1550 100644
--- a/src/map.c
+++ b/src/map.c
@@ -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