X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fpazpar2_config.c;h=b4c0dc5f8a3c96b7c4b1d92508036e45ed2c3e7e;hb=42fb5e0431fb09240a4423f6f38c15cfc0648437;hp=2cfba231e3bc40ac9792ba4bb2b3546c08060cb8;hpb=ebf24e785974c368809d73394a24eb80506598fd;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2_config.c b/src/pazpar2_config.c index 2cfba23..b4c0dc5 100644 --- a/src/pazpar2_config.c +++ b/src/pazpar2_config.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2010 Index Data + Copyright (C) 2006-2011 Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -38,6 +38,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #if HAVE_UNISTD_H #include #endif +#include "ppmutex.h" #include "incref.h" #include "pazpar2_config.h" #include "settings.h" @@ -59,9 +60,6 @@ struct conf_config static char *parse_settings(struct conf_config *config, NMEM nmem, xmlNode *node); -static struct conf_targetprofiles *parse_targetprofiles(NMEM nmem, - xmlNode *node); - static void conf_metadata_assign(NMEM nmem, struct conf_metadata * metadata, const char *name, @@ -121,7 +119,6 @@ static struct conf_service *service_init(struct conf_server *server, service->next = 0; service->settings = 0; service->databases = 0; - service->targetprofiles = 0; service->server = server; service->session_timeout = 60; /* default session timeout */ service->z3950_session_timeout = 180; @@ -130,6 +127,7 @@ static struct conf_service *service_init(struct conf_server *server, service->relevance_pct = 0; service->sort_pct = 0; service->mergekey_pct = 0; + service->facet_pct = 0; service->id = service_id ? nmem_strdup(nmem, service_id) : 0; service->num_metadata = num_metadata; @@ -248,6 +246,7 @@ void service_destroy(struct conf_service *service) pp2_charset_destroy(service->relevance_pct); pp2_charset_destroy(service->sort_pct); pp2_charset_destroy(service->mergekey_pct); + pp2_charset_destroy(service->facet_pct); yaz_mutex_destroy(&service->mutex); nmem_destroy(service->nmem); } @@ -512,17 +511,6 @@ static struct conf_service *service_create_static(struct conf_server *server, } else if (!strcmp((const char *) n->name, "settings")) got_settings++; - 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, "relevance")) { if (service->relevance_pct) @@ -565,6 +553,20 @@ static struct conf_service *service_create_static(struct conf_server *server, return 0; } } + else if (!strcmp((const char *) n->name, "facet")) + { + if (service->facet_pct) + { + yaz_log(YLOG_LOG, "facet may not repeat in service"); + return 0; + } + else + { + service->facet_pct = pp2_charset_create_xml(n); + if (!service->facet_pct) + return 0; + } + } else if (!strcmp((const char *) n->name, (const char *) "metadata")) { if (parse_metadata(service, n, &md_node, &sk_node)) @@ -651,7 +653,7 @@ static void inherit_server_settings(struct conf_service *s) } } - /* use relevance/sort/mergekey from server if not defined + /* use relevance/sort/mergekey/facet from server if not defined for this service.. */ if (!s->relevance_pct) { @@ -661,7 +663,7 @@ static void inherit_server_settings(struct conf_service *s) pp2_charset_incref(s->relevance_pct); } else - s->relevance_pct = pp2_charset_create(0); + s->relevance_pct = pp2_charset_create_a_to_z(); } if (!s->sort_pct) @@ -672,7 +674,7 @@ static void inherit_server_settings(struct conf_service *s) pp2_charset_incref(s->sort_pct); } else - s->sort_pct = pp2_charset_create(0); + s->sort_pct = pp2_charset_create_a_to_z(); } if (!s->mergekey_pct) @@ -683,7 +685,18 @@ static void inherit_server_settings(struct conf_service *s) pp2_charset_incref(s->mergekey_pct); } else - s->mergekey_pct = pp2_charset_create(0); + s->mergekey_pct = pp2_charset_create_a_to_z(); + } + + if (!s->facet_pct) + { + if (server->facet_pct) + { + s->facet_pct = server->facet_pct; + pp2_charset_incref(s->facet_pct); + } + else + s->facet_pct = pp2_charset_create(0); } } @@ -697,7 +710,7 @@ struct conf_service *service_create(struct conf_server *server, inherit_server_settings(service); resolve_databases(service); assert(service->mutex == 0); - yaz_mutex_create(&service->mutex); + pazpar2_mutex_create(&service->mutex, "conf"); } return service; } @@ -720,6 +733,7 @@ static struct conf_server *server_create(struct conf_config *config, server->relevance_pct = 0; server->sort_pct = 0; server->mergekey_pct = 0; + server->facet_pct = 0; server->server_settings = 0; server->http_server = 0; server->iochan_man = 0; @@ -790,6 +804,12 @@ static struct conf_server *server_create(struct conf_config *config, if (!server->mergekey_pct) return 0; } + else if (!strcmp((const char *) n->name, "facet")) + { + server->facet_pct = pp2_charset_create_xml(n); + if (!server->facet_pct) + return 0; + } else if (!strcmp((const char *) n->name, "service")) { char *service_id = (char *) @@ -839,52 +859,14 @@ static struct conf_server *server_create(struct conf_config *config, return server; } -WRBUF conf_get_fname(struct conf_service *service, const char *fname) +WRBUF conf_get_fname(struct conf_config *config, const char *fname) { - struct conf_config *config = service->server->config; WRBUF w = wrbuf_alloc(); conf_dir_path(config, w, fname); return w; } -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"); - xmlChar *src = xmlGetProp(node, (xmlChar *) "src"); - - memset(r, 0, sizeof(*r)); - - if (type) - { - if (!strcmp((const char *) type, "local")) - r->type = Targetprofiles_local; - else - { - yaz_log(YLOG_FATAL, "Unknown targetprofile type"); - return 0; - } - } - else - { - yaz_log(YLOG_FATAL, "Must specify type for targetprofile"); - return 0; - } - - if (src) - r->src = nmem_strdup(nmem, (const char *) src); - else - { - yaz_log(YLOG_FATAL, "Must specify src in targetprofile"); - return 0; - } - xmlFree(type); - xmlFree(src); - return r; -} - struct conf_service *locate_service(struct conf_server *server, const char *service_id) { @@ -899,6 +881,25 @@ struct conf_service *locate_service(struct conf_server *server, return s; } +void info_services(struct conf_server *server, WRBUF w) +{ + struct conf_service *s = server->service; + wrbuf_puts(w, " \n"); + for (; s; s = s->next) + { + wrbuf_puts(w, " id) + { + wrbuf_puts(w, " id=\""); + wrbuf_xmlputs(w, s->id); + wrbuf_puts(w, "\""); + } + wrbuf_puts(w, "/>"); + + wrbuf_puts(w, "\n"); + } + wrbuf_puts(w, " \n"); +} static int parse_config(struct conf_config *config, xmlNode *root) { @@ -1015,6 +1016,7 @@ void server_destroy(struct conf_server *server) pp2_charset_destroy(server->relevance_pct); pp2_charset_destroy(server->sort_pct); pp2_charset_destroy(server->mergekey_pct); + pp2_charset_destroy(server->facet_pct); yaz_log(YLOG_LOG, "server_destroy server=%p", server); http_server_destroy(server->http_server); } @@ -1024,12 +1026,15 @@ void config_destroy(struct conf_config *config) if (config) { struct conf_server *server = config->servers; + iochan_man_destroy(&config->iochan_man); while (server) { struct conf_server *s_next = server->next; server_destroy(server); server = s_next; } + database_hosts_destroy(&config->database_hosts); + wrbuf_destroy(config->confdir); nmem_destroy(config->nmem); } @@ -1057,7 +1062,7 @@ void config_process_events(struct conf_config *conf) { resolve_databases(s); assert(s->mutex == 0); - yaz_mutex_create(&s->mutex); + pazpar2_mutex_create(&s->mutex, "service"); } http_mutex_init(ser); } @@ -1065,7 +1070,8 @@ void config_process_events(struct conf_config *conf) } int config_start_listeners(struct conf_config *conf, - const char *listener_override) + const char *listener_override, + const char *record_fname) { struct conf_server *ser; @@ -1092,7 +1098,7 @@ int config_start_listeners(struct conf_config *conf, wrbuf_printf(w, "%d", ser->port); } } - r = http_init(wrbuf_cstr(w), ser); + r = http_init(wrbuf_cstr(w), ser, record_fname); wrbuf_destroy(w); if (r) return -1;