X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fpazpar2_config.c;h=e796e00f4be66a68341a846fbb77dfa9d469fbcc;hb=a4d692f24164e5e8271599c2fcfd9cc5acc25c4b;hp=6f14cff697a59c80c9e54937968cba07b55c847d;hpb=b50a07651606849fd1f9ddd971f754287891e5c0;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2_config.c b/src/pazpar2_config.c index 6f14cff..e796e00 100644 --- a/src/pazpar2_config.c +++ b/src/pazpar2_config.c @@ -95,7 +95,8 @@ struct conf_sortkey * conf_sortkey_assign(NMEM nmem, } -struct conf_service * conf_service_create(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(); @@ -103,7 +104,10 @@ struct conf_service * conf_service_create(int num_metadata, int num_sortkeys) //assert(nmem); service = nmem_malloc(nmem, sizeof(struct conf_service)); + service->nmem = nmem; + service->next = 0; + service->id = service_id ? nmem_strdup(nmem, service_id) : 0; service->num_metadata = num_metadata; service->metadata = 0; if (service->num_metadata) @@ -116,8 +120,6 @@ struct conf_service * conf_service_create(int num_metadata, int num_sortkeys) service->sortkeys = nmem_malloc(nmem, sizeof(struct conf_sortkey) * service->num_sortkeys); - - service->nmem = nmem; service->dictionary = 0; return service; } @@ -206,7 +208,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; @@ -228,7 +230,7 @@ static struct conf_service *parse_service(xmlNode *node) xmlFree(sortkey); } - service = conf_service_create(num_metadata, num_sortkeys); + service = conf_service_create(num_metadata, num_sortkeys, service_id); for (n = node->children; n; n = n->next) { @@ -514,10 +516,31 @@ static struct conf_server *parse_server(NMEM nmem, 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) + *sp = s; + } } else { @@ -581,6 +604,18 @@ static struct conf_targetprofiles *parse_targetprofiles(NMEM nmem, return r; } +struct conf_service *locate_service(const char *service_id) +{ + struct conf_service *s = config->servers->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();