diff options
| author | Nalin Dahyabhai <nalin@redhat.com> | 2010-11-18 13:58:07 -0500 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin@redhat.com> | 2010-11-18 13:58:07 -0500 |
| commit | d4509de75bfd8a6f25a65faaa038010910bf539c (patch) | |
| tree | f9ab9d59726284362d1fe2744d4366407e03db48 /src | |
| parent | 104d4eccfc2ea36d9066e70a4c9cdf56ef0fbcb8 (diff) | |
- add optional caching of filters to attribute lists
Diffstat (limited to 'src')
| -rw-r--r-- | src/format.c | 68 | ||||
| -rw-r--r-- | src/format.h | 2 |
2 files changed, 51 insertions, 19 deletions
diff --git a/src/format.c b/src/format.c index 5b5b650..4195b8a 100644 --- a/src/format.c +++ b/src/format.c @@ -186,18 +186,19 @@ format_add_sdn_list(struct slapi_dn ***list, const char *dn) void format_free_ref_attr_list(struct format_ref_attr_list **list) { - Slapi_DN **sdn_list; + struct format_ref_attr_list_link *link; unsigned int i; int j; if (list != NULL) { for (i = 0; list[i] != NULL; i++) { for (j = 0; j < list[i]->n_links; j++) { - free(list[i]->links[j].attribute); - if (list[i]->links[j].filter != NULL) { - slapi_filter_free(list[i]->links[j].filter, TRUE); + link = &list[i]->links[j]; + free(link->attribute); + free(link->filter_str); + if (link->filter != NULL) { + slapi_filter_free(link->filter, TRUE); } - sdn_list = list[i]->links[j].base_sdn_list; - format_free_sdn_list(sdn_list); + format_free_sdn_list(link->base_sdn_list); } free(list[i]->links); free(list[i]->set); @@ -243,6 +244,14 @@ format_dup_ref_attr_list(struct format_ref_attr_list **list) format_free_ref_attr_list(ret); return NULL; } + if (list[i]->links[j].filter_str != NULL) { + ret[i]->links[j].filter_str = + strdup(list[i]->links[j].filter_str); + if (ret[i]->links[j].filter_str == NULL) { + format_free_ref_attr_list(ret); + return NULL; + } + } if (list[i]->links[j].filter != NULL) { ret[i]->links[j].filter = slapi_filter_dup(list[i]->links[j].filter); @@ -267,22 +276,40 @@ format_dup_ref_attr_list(struct format_ref_attr_list **list) static struct format_ref_attr_list * format_find_ref_attr_list(struct format_ref_attr_list **list, const char *group, const char *set, - const char **names) + const char **names, const char **filters) { + struct format_ref_attr_list *item; + struct format_ref_attr_list_link *link; unsigned int i; int j; - const char *attribute; for (i = 0; (list != NULL) && (list[i] != NULL); i++) { + item = list[i]; for (j = 0; names[j] != NULL; j++) { - if (j < list[i]->n_links) { - attribute = list[i]->links[j].attribute; - if (strcmp(names[j], attribute) != 0) { + if (j < item->n_links) { + link = &item->links[j]; + if (strcmp(names[j], link->attribute) != 0) { break; } + if (j < item->n_links - 1) { + if ((filters == NULL) && + (link->filter_str != NULL)) { + break; + } + if ((filters != NULL) && + (link->filter_str == NULL)) { + break; + } + if ((filters != NULL) && + (link->filter_str != NULL) && + (strcmp(filters[j], + link->filter_str) != 0)) { + break; + } + } } } - if ((j == list[i]->n_links) && (names[j] == NULL)) { - return list[i]; + if ((j == item->n_links) && (names[j] == NULL)) { + return item; } } return NULL; @@ -297,7 +324,8 @@ format_add_ref_attr_list(struct format_ref_attr_list ***list, char *ftmp; unsigned int i; int j; - if (format_find_ref_attr_list(*list, group, set, names) != NULL) { + if (format_find_ref_attr_list(*list, group, set, + names, filters) != NULL) { return *list; } for (i = 0; @@ -338,13 +366,17 @@ format_add_ref_attr_list(struct format_ref_attr_list ***list, format_free_ref_attr_list(ret); return NULL; } + ret[i]->links[j].filter_str = strdup(ftmp); + if (ret[i]->links[j].filter_str == NULL) { + format_free_ref_attr_list(ret); + return NULL; + } ret[i]->links[j].filter = slapi_str2filter(ftmp); + free(ftmp); if (ret[i]->links[j].filter == NULL) { - free(ftmp); format_free_ref_attr_list(ret); return NULL; } - free(ftmp); } ret[i]->links[j].base_sdn_list = NULL; } @@ -1073,7 +1105,7 @@ format_deref_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, format_add_ref_attr_list(ref_attr_list, group, set, (const char **) argv, NULL); list = format_find_ref_attr_list(*ref_attr_list, group, set, - (const char **) argv); + (const char **) argv, NULL); /* Follow the chain: set up the first link. */ these = NULL; @@ -1519,7 +1551,7 @@ format_referred_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, /* Note this list of attributes. */ format_add_ref_attr_list(inref_attr_list, group, set, attr_links, NULL); list = format_find_ref_attr_list(*inref_attr_list, group, set, - attr_links); + attr_links, NULL); free(attr_links); /* Set up to search for referrers. */ diff --git a/src/format.h b/src/format.h index e84a10c..accc234 100644 --- a/src/format.h +++ b/src/format.h @@ -32,7 +32,7 @@ struct format_inref_attr { struct format_ref_attr_list { char *group, *set; struct format_ref_attr_list_link { - char *attribute; + char *attribute, *filter_str; Slapi_Filter *filter; struct slapi_dn **base_sdn_list; } *links; |
