X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2_config.c;h=05db1f6f646daca3a1acbe3e31de7e1ce8aa4f1e;hb=bb76bca1e2b4969ea08cf2f1f57d74cfa31dd026;hp=169de11ad3941dad0b633bc904a9a58c072a3d14;hpb=a6b5e633581cbae0759c3b68faa7a0cd0197f790;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2_config.c b/src/pazpar2_config.c index 169de11..05db1f6 100644 --- a/src/pazpar2_config.c +++ b/src/pazpar2_config.c @@ -34,15 +34,15 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include -#define CONFIG_NOEXTERNS #include "pazpar2_config.h" +#include "settings.h" - -static NMEM nmem = 0; static char confdir[256] = "."; -struct conf_config *config = 0; +static char *parse_settings(NMEM nmem, xmlNode *node); +static struct conf_targetprofiles *parse_targetprofiles(NMEM nmem, + xmlNode *node); static struct conf_metadata * conf_metadata_assign(NMEM nmem, @@ -96,15 +96,23 @@ struct conf_sortkey * conf_sortkey_assign(NMEM nmem, } -struct conf_service * conf_service_create(NMEM nmem, - int num_metadata, int num_sortkeys) +struct conf_service * conf_service_create(int num_metadata, int num_sortkeys, + const char *service_id) { struct conf_service * service = 0; + NMEM nmem = nmem_create(); //assert(nmem); service = nmem_malloc(nmem, sizeof(struct conf_service)); + service->nmem = nmem; + service->next = 0; + service->settings = 0; + service->databases = 0; + service->targetprofiles = 0; + + service->id = service_id ? nmem_strdup(nmem, service_id) : 0; service->num_metadata = num_metadata; service->metadata = 0; if (service->num_metadata) @@ -117,12 +125,11 @@ struct conf_service * conf_service_create(NMEM nmem, service->sortkeys = nmem_malloc(nmem, sizeof(struct conf_sortkey) * service->num_sortkeys); - + service->dictionary = 0; return service; } -struct conf_metadata* conf_service_add_metadata(NMEM nmem, - struct conf_service *service, +struct conf_metadata* conf_service_add_metadata(struct conf_service *service, int field_id, const char *name, enum conf_metadata_type type, @@ -142,15 +149,14 @@ struct conf_metadata* conf_service_add_metadata(NMEM nmem, //md = &((service->metadata)[field_id]); md = service->metadata + field_id; - md = conf_metadata_assign(nmem, md, name, type, merge, setting, + md = conf_metadata_assign(service->nmem, md, name, type, merge, setting, brief, termlist, rank, sortkey_offset, mt); return md; } -struct conf_sortkey * conf_service_add_sortkey(NMEM nmem, - struct conf_service *service, +struct conf_sortkey * conf_service_add_sortkey(struct conf_service *service, int field_id, const char *name, enum conf_sortkey_type type) @@ -163,7 +169,7 @@ struct conf_sortkey * conf_service_add_sortkey(NMEM nmem, //sk = &((service->sortkeys)[field_id]); sk = service->sortkeys + field_id; - sk = conf_sortkey_assign(nmem, sk, name, type); + sk = conf_sortkey_assign(service->nmem, sk, name, type); return sk; } @@ -207,7 +213,7 @@ int conf_service_sortkey_field_id(struct conf_service *service, /* Code to parse configuration file */ /* ==================================================== */ -static struct conf_service *parse_service(xmlNode *node) +static struct conf_service *parse_service(xmlNode *node, const char *service_id) { xmlNode *n; int md_node = 0; @@ -229,13 +235,35 @@ static struct conf_service *parse_service(xmlNode *node) xmlFree(sortkey); } - service = conf_service_create(nmem, num_metadata, num_sortkeys); + service = conf_service_create(num_metadata, num_sortkeys, service_id); for (n = node->children; n; n = n->next) { if (n->type != XML_ELEMENT_NODE) continue; - if (!strcmp((const char *) n->name, (const char *) "metadata")) + if (!strcmp((const char *) n->name, "settings")) + { + if (service->settings) + { + yaz_log(YLOG_FATAL, "Can't repeat 'settings'"); + return 0; + } + service->settings = parse_settings(service->nmem, n); + if (!service->settings) + return 0; + } + else if (!strcmp((const char *) n->name, (const char *) "targetprofiles")) + { + if (service->targetprofiles) + { + yaz_log(YLOG_FATAL, "Can't repeat targetprofiles"); + return 0; + } + if (!(service->targetprofiles = + parse_targetprofiles(service->nmem, n))) + return 0; + } + else if (!strcmp((const char *) n->name, (const char *) "metadata")) { xmlChar *xml_name = xmlGetProp(n, (xmlChar *) "name"); xmlChar *xml_brief = xmlGetProp(n, (xmlChar *) "brief"); @@ -372,7 +400,8 @@ static struct conf_service *parse_service(xmlNode *node) } sortkey_offset = sk_node; - conf_service_add_sortkey(nmem, service, sk_node, + conf_service_add_sortkey( +service, sk_node, (const char *) xml_name, sk_type); sk_node++; @@ -387,7 +416,7 @@ static struct conf_service *parse_service(xmlNode *node) // metadata known, assign values - conf_service_add_metadata(nmem, service, md_node, + conf_service_add_metadata(service, md_node, (const char *) xml_name, type, merge, setting, brief, termlist, rank, sortkey_offset, @@ -412,7 +441,7 @@ static struct conf_service *parse_service(xmlNode *node) return service; } -static char *parse_settings(xmlNode *node) +static char *parse_settings(NMEM nmem, xmlNode *node) { xmlChar *src = xmlGetProp(node, (xmlChar *) "src"); char *r; @@ -437,7 +466,7 @@ static char *parse_settings(xmlNode *node) return r; } -static struct conf_server *parse_server(xmlNode *node) +static struct conf_server *parse_server(NMEM nmem, xmlNode *node) { xmlNode *n; struct conf_server *server = nmem_malloc(nmem, sizeof(struct conf_server)); @@ -449,7 +478,7 @@ static struct conf_server *parse_server(xmlNode *node) server->myurl = 0; server->service = 0; server->next = 0; - server->settings = 0; + server->server_settings = 0; server->relevance_pct = 0; server->sort_pct = 0; server->mergekey_pct = 0; @@ -486,12 +515,12 @@ static struct conf_server *parse_server(xmlNode *node) } else if (!strcmp((const char *) n->name, "settings")) { - if (server->settings) + if (server->server_settings) { yaz_log(YLOG_FATAL, "Can't repeat 'settings'"); return 0; } - if (!(server->settings = parse_settings(n))) + if (!(server->server_settings = parse_settings(nmem, n))) return 0; } else if (!strcmp((const char *) n->name, "relevance")) @@ -514,10 +543,39 @@ static struct conf_server *parse_server(xmlNode *node) } else if (!strcmp((const char *) n->name, "service")) { - struct conf_service *s = parse_service(n); - if (!s) + const char *service_id = (const char *) + xmlGetProp(n, (xmlChar *) "id"); + + struct conf_service **sp = &server->service; + for (; *sp; sp = &(*sp)->next) + if ((*sp)->id && service_id && + 0 == strcmp((*sp)->id, service_id)) + { + yaz_log(YLOG_FATAL, "Duplicate service: %s", service_id); + break; + } + else if (!(*sp)->id && !service_id) + { + yaz_log(YLOG_FATAL, "Duplicate unnamed service"); + break; + } + + if (*sp) /* service already exist */ return 0; - server->service = s; + else + { + struct conf_service *s = parse_service(n, service_id); + if (s) + { + s->relevance_pct = server->relevance_pct ? + server->relevance_pct : pp2_charset_create(0); + s->sort_pct = server->sort_pct ? + server->sort_pct : pp2_charset_create(0); + s->mergekey_pct = server->mergekey_pct ? + server->mergekey_pct : pp2_charset_create(0); + *sp = s; + } + } } else { @@ -525,12 +583,6 @@ static struct conf_server *parse_server(xmlNode *node) return 0; } } - if (!server->relevance_pct) - server->relevance_pct = pp2_charset_create(0); - if (!server->sort_pct) - server->sort_pct = pp2_charset_create(0); - if (!server->mergekey_pct) - server->mergekey_pct = pp2_charset_create(0); return server; } @@ -544,7 +596,8 @@ xsltStylesheet *conf_load_stylesheet(const char *fname) return xsltParseStylesheetFile((xmlChar *) path); } -static struct conf_targetprofiles *parse_targetprofiles(xmlNode *node) +static struct conf_targetprofiles *parse_targetprofiles(NMEM nmem, + xmlNode *node) { struct conf_targetprofiles *r = nmem_malloc(nmem, sizeof(*r)); xmlChar *type = xmlGetProp(node, (xmlChar *) "type"); @@ -580,13 +633,27 @@ static struct conf_targetprofiles *parse_targetprofiles(xmlNode *node) return r; } +struct conf_service *locate_service(struct conf_server *server, + const char *service_id) +{ + struct conf_service *s = server->service; + for (; s; s = s->next) + if (s->id && service_id && 0 == strcmp(s->id, service_id)) + return s; + else if (!s->id && !service_id) + return s; + return 0; +} + + static struct conf_config *parse_config(xmlNode *root) { + NMEM nmem = nmem_create(); xmlNode *n; struct conf_config *r = nmem_malloc(nmem, sizeof(struct conf_config)); + r->nmem = nmem; r->servers = 0; - r->targetprofiles = 0; for (n = root->children; n; n = n->next) { @@ -594,7 +661,7 @@ static struct conf_config *parse_config(xmlNode *root) continue; if (!strcmp((const char *) n->name, "server")) { - struct conf_server *tmp = parse_server(n); + struct conf_server *tmp = parse_server(nmem, n); if (!tmp) return 0; tmp->next = r->servers; @@ -602,14 +669,9 @@ static struct conf_config *parse_config(xmlNode *root) } else if (!strcmp((const char *) n->name, "targetprofiles")) { - // It would be fun to be able to fix this sometime - if (r->targetprofiles) - { - yaz_log(YLOG_FATAL, "Can't repeat targetprofiles"); - return 0; - } - if (!(r->targetprofiles = parse_targetprofiles(n))) - return 0; + yaz_log(YLOG_FATAL, "targetprofiles unsupported here. Must be part of service"); + return 0; + } else { @@ -620,17 +682,14 @@ static struct conf_config *parse_config(xmlNode *root) return r; } -int read_config(const char *fname) +struct conf_config *read_config(const char *fname) { xmlDoc *doc = xmlParseFile(fname); const char *p; + struct conf_config *config; - if (!nmem) // Initialize - { - nmem = nmem_create(); - xmlSubstituteEntitiesDefault(1); - xmlLoadExtDtdDefaultValue = 1; - } + xmlSubstituteEntitiesDefault(1); + xmlLoadExtDtdDefaultValue = 1; if (!doc) { yaz_log(YLOG_FATAL, "Failed to read %s", fname); @@ -653,12 +712,26 @@ int read_config(const char *fname) config = parse_config(xmlDocGetRootElement(doc)); xmlFreeDoc(doc); - if (config) - return 1; - else - return 0; + return config; } +void config_read_settings(struct conf_config *config, + const char *path_override) +{ + struct conf_service *s = config->servers->service; + for (;s ; s = s->next) + { + init_settings(s); + if (path_override) + settings_read(s, path_override); + else if (s->settings) + settings_read(s, s->settings); + else if (config->servers->server_settings) + settings_read(s, config->servers->server_settings); + else + yaz_log(YLOG_WARN, "No settings for service"); + } +} /* * Local variables: