summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@redhat.com>2010-11-18 13:58:07 -0500
committerNalin Dahyabhai <nalin@redhat.com>2010-11-18 13:58:07 -0500
commitd4509de75bfd8a6f25a65faaa038010910bf539c (patch)
treef9ab9d59726284362d1fe2744d4366407e03db48 /src
parent104d4eccfc2ea36d9066e70a4c9cdf56ef0fbcb8 (diff)
- add optional caching of filters to attribute lists
Diffstat (limited to 'src')
-rw-r--r--src/format.c68
-rw-r--r--src/format.h2
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;