From d2753da54b00ab488fecb12e9116959517f70baf Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Thu, 31 Mar 2011 18:38:21 -0400 Subject: speed up building compat entries with attributes with thousands of literal values (#692690) --- src/back-sch.c | 82 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 27 deletions(-) (limited to 'src/back-sch.c') diff --git a/src/back-sch.c b/src/back-sch.c index 528225b..f9425fd 100644 --- a/src/back-sch.c +++ b/src/back-sch.c @@ -265,14 +265,14 @@ void backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) { char *dn, *rdn, *ndn, *ldif, *plugin_id, *keys[2], *values[2], **ava; - char *val; + char *attr, *val; unsigned int rdn_len, value_len, *ava_lens; const char *rdnstr; - int len, i, j; + int len, i, j, k, count; Slapi_Entry *entry; Slapi_DN *e_dn, *sdn; Slapi_RDN *srdn; - Slapi_Value *value[2]; + Slapi_Value **value; plugin_id = data->common.state->plugin_desc->spd_id; e_dn = slapi_entry_get_sdn(e); @@ -306,8 +306,6 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) time(NULL), 0); /* Iterate through the set of attributes. */ if (data->attribute_format != NULL) { - value[0] = slapi_value_new(); - value[1] = NULL; for (i = 0; data->attribute_format[i] != NULL; i++) { /* Expand the format specifier into a list. */ ava_lens = NULL; @@ -321,34 +319,64 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) &data->common.ref_attr_list, &data->common.inref_attr_list, &ava_lens); - if ((ava != NULL) && - (ava_lens != NULL) && - (value[0] != NULL)) { + if ((ava != NULL) && (ava_lens != NULL)) { + /* Count the values. */ + count = 0; for (j = 0; ava[j] != NULL; j++) { - /* Assume attribute=value. */ - val = memchr(ava[j], '=', - ava_lens[j]); - /* Skip over anything that didn't have - * a '=' or that produced an empty - * value. */ - if ((val != NULL) && - (ava_lens[j] > val + 1 - ava[j])) { - *val = '\0'; - slapi_value_set(value[0], - val + 1, - ava_lens[j] - - (val + 1 - - ava[j])); - slapi_entry_merge_values_sv(entry, - ava[j], - value); - *val = '='; + count++; + } + /* Create the value array. */ + value = malloc((count + 1) * sizeof(Slapi_Value *)); + if (value != NULL) { + attr = NULL; + len = 0; + k = 0; + for (j = 0; ava[j] != NULL; j++) { + /* Assume attribute=value. */ + val = memchr(ava[j], '=', + ava_lens[j]); + /* Skip over anything that didn't have + * a '=' or that produced an empty + * value. */ + if ((val != NULL) && + (ava_lens[j] > val + 1 - ava[j])) { + /* Add a new value. */ + value[k] = slapi_value_new(); + if (value[k] != NULL) { + /* Set the value. */ + attr = ava[j]; + len = ava_lens[j]; + slapi_value_set(value[k], + val + 1, + ava_lens[j] - + (val + 1 - + ava[j])); + k++; + } + } + } + value[k] = NULL; + if ((k > 0) && (attr != NULL) && (len > 0)) { + /* We assumed attribute=value when we + * saved this particular value. */ + val = memchr(attr, '=', len); + if (val != NULL) { + *val = '\0'; + slapi_entry_merge_values_sv(entry, + attr, + value); + *val = '='; + } + } + /* Clean up the values. */ + for (j = 0; j < k; j++) { + slapi_value_free(&value[k]); } + free(value); } } format_free_data_set(ava, ava_lens); } - slapi_value_free(&value[0]); } /* Try to make the entry look "right". */ if (!slapi_entry_rdn_values_present(entry)) { -- cgit