#include <string.h>
+#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
#include "direntz.h"
"pz:sru",
"pz:sru_version",
"pz:pqf_prefix",
+ "pz:sort",
0
};
if (stat(path, &st) < 0)
{
- yaz_log(YLOG_FATAL|YLOG_ERRNO, "%s", path);
+ yaz_log(YLOG_FATAL|YLOG_ERRNO, "stat %s", path);
exit(1);
}
return st.st_mode & S_IFDIR;
}
// Read settings from an XML file, calling handler function for each setting
-static void read_settings_file(const char *path,
+static void read_settings_node(xmlNode *n,
struct conf_service *service,
void (*fun)(struct conf_service *service,
struct setting *set))
{
- xmlDoc *doc = xmlParseFile(path);
- xmlNode *n;
xmlChar *namea, *targeta, *valuea, *usera, *precedencea;
- if (!doc)
- {
- yaz_log(YLOG_FATAL, "Failed to parse %s", path);
- exit(1);
- }
- n = xmlDocGetRootElement(doc);
namea = xmlGetProp(n, (xmlChar *) "name");
targeta = xmlGetProp(n, (xmlChar *) "target");
valuea = xmlGetProp(n, (xmlChar *) "value");
xmlFree(valuea);
xmlFree(usera);
xmlFree(targeta);
+}
+
+static void read_settings_file(const char *path,
+ struct conf_service *service,
+ void (*fun)(struct conf_service *service,
+ struct setting *set))
+{
+ xmlDoc *doc = xmlParseFile(path);
+ xmlNode *n;
+
+ if (!doc)
+ {
+ yaz_log(YLOG_FATAL, "Failed to parse %s", path);
+ exit(1);
+ }
+ n = xmlDocGetRootElement(doc);
+ read_settings_node(n, service, fun);
xmlFreeDoc(doc);
}
-
+
+
// Recursively read files or directories, invoking a
// callback for each one
static void read_settings(const char *path,
int i;
char *p;
- // If target address is not wildcard, add the database
- if (*set->target && !zurl_wildcard(set->target))
- find_database(set->target, 0, service);
-
// Determine if we already have a dictionary entry
if (!strncmp(set->name, "pz:", 3) && (p = strchr(set->name + 3, ':')))
*(p + 1) = '\0';
dictionary->dict[dictionary->num++] = nmem_strdup(service->nmem, set->name);
}
+
struct update_database_context {
struct setting *set;
struct conf_service *service;
return;
if ((offset = settings_offset_cprefix(service, set->name)) < 0)
- abort(); // Should never get here
+ return ;
// First we determine if this setting is overriding any existing settings
// with the same name.
}
}
-// 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(struct conf_service *service, const char *path)
+static void prepare_target_dictionary(struct conf_service *service,
+ struct setting *set)
{
- read_settings(path, service, prepare_dictionary);
- read_settings(path, service, update_databases);
+ 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, 0, 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)
{
struct setting_dictionary *new;
-
- service->nmem = nmem_create();
-
+
+ assert(service->nmem);
+
new = nmem_malloc(service->nmem, sizeof(*new));
memset(new, 0, sizeof(*new));
service->dictionary = new;
initialize_soft_settings(service);
}
+void settings_read_file(struct conf_service *service, const char *path,
+ int pass)
+{
+ if (pass == 1)
+ read_settings(path, service, prepare_target_dictionary);
+ else
+ read_settings(path, service, update_databases);
+}
+
+void settings_read_node(struct conf_service *service, xmlNode *n,
+ int pass)
+{
+ if (pass == 1)
+ read_settings_node(n, service, prepare_target_dictionary);
+ else
+ read_settings_node(n, service, update_databases);
+}
+
/*
* Local variables:
* c-basic-offset: 4