X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fsettings.c;h=3b7a923464a71e71a7a07ae9ddb5de5fea62bf8f;hb=ab37b48849c1106004bba8aa2b289e08adb87178;hp=578bc4c82cf0975b66a0810545c72249a2678c1d;hpb=f5d345051217a4f54a53dac5a7397f5672e305ad;p=pazpar2-moved-to-github.git diff --git a/src/settings.c b/src/settings.c index 578bc4c..3b7a923 100644 --- a/src/settings.c +++ b/src/settings.c @@ -28,6 +28,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include +#include #include #include #include "direntz.h" @@ -64,6 +65,7 @@ static char *hard_settings[] = { "pz:sru", "pz:sru_version", "pz:pqf_prefix", + "pz:sort", 0 }; @@ -124,28 +126,20 @@ static int isdir(const char *path) 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"); @@ -220,10 +214,28 @@ static void read_settings_file(const char *path, 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, @@ -280,10 +292,6 @@ static void prepare_dictionary(struct conf_service *service, 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'; @@ -313,6 +321,7 @@ static void prepare_dictionary(struct conf_service *service, dictionary->dict[dictionary->num++] = nmem_strdup(service->nmem, set->name); } + struct update_database_context { struct setting *set; struct conf_service *service; @@ -334,7 +343,7 @@ static void update_database(void *context, struct database *db) 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. @@ -414,21 +423,33 @@ static void initialize_soft_settings(struct conf_service *service) } } -// 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; @@ -436,6 +457,24 @@ void init_settings(struct conf_service *service) 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