-// If we ever decide we need to be able to specify multiple settings directories,
-// the two calls to read_settings must be split -- so the dictionary is prepared
-// for the contents of every directory before the databases are updated.
-void settings_read(const char *path)
+// Read any settings names introduced in service definition (config) and add to dictionary
+// This is done now to avoid errors if user settings are declared in session overrides
+static void initialize_soft_settings(struct conf_service *service)
+{
+ int i;
+
+ for (i = 0; i < service->num_metadata; i++)
+ {
+ struct conf_metadata *md = &service->metadata[i];
+
+ if (md->setting == Metadata_setting_no)
+ continue;
+
+ settings_create_offset(service, md->name);
+ }
+}
+
+static void prepare_target_dictionary(void *client_data, struct setting *set)
+{
+ struct conf_service *service = (struct conf_service *) client_data;
+ struct setting_dictionary *dictionary = service->dictionary;
+
+ int i;
+ char *p;
+
+ // If target address is not wildcard, add the database
+ if (*set->target && !zurl_wildcard(set->target))
+ find_database(set->target, service);
+
+ // Determine if we already have a dictionary entry
+ if (!strncmp(set->name, "pz:", 3) && (p = strchr(set->name + 3, ':')))
+ *(p + 1) = '\0';
+ for (i = 0; i < dictionary->num; i++)
+ if (!strcmp(dictionary->dict[i], set->name))
+ return;
+ yaz_log(YLOG_WARN, "Setting '%s' not configured as metadata", set->name);
+}
+
+void init_settings(struct conf_service *service)