- // Create a new dictionary entry
- // Grow dictionary if necessary
- if (!dictionary->size)
- dictionary->dict = nmem_malloc(nmem, (dictionary->size = 50) * sizeof(char*));
- else if (dictionary->num + 1 > dictionary->size)
+}
+
+static void update_settings(struct setting *set, struct settings_array *settings, int offset, NMEM nmem)
+{
+ struct setting **sp;
+ yaz_log(YLOG_DEBUG, "update service settings offset %d with %s=%s", offset, set->name, set->value);
+ expand_settings_array2(settings, offset, nmem);
+
+ // First we determine if this setting is overriding any existing settings
+ // with the same name.
+ assert(offset < settings->num_settings);
+ for (sp = &settings->settings[offset]; *sp; )
+ if (!strcmp((*sp)->name, set->name))
+ {
+ if ((*sp)->precedence < set->precedence)
+ {
+ // We discard the value (nmem keeps track of the space)
+ *sp = (*sp)->next; // unlink value from existing setting
+ }
+ else if ((*sp)->precedence > set->precedence)
+ {
+ // Db contains a higher-priority setting. Abort search
+ break;
+ }
+ else if (zurl_wildcard((*sp)->target) > zurl_wildcard(set->target))
+ {
+ // target-specific value trumps wildcard. Delete.
+ *sp = (*sp)->next; // unlink.....
+ }
+ else if (zurl_wildcard((*sp)->target) < zurl_wildcard(set->target))
+ // Db already contains higher-priority setting. Abort search
+ break;
+ else
+ sp = &(*sp)->next;
+ }
+ else
+ sp = &(*sp)->next;
+ if (!*sp) // is null when there are no higher-priority settings, so we add one