X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2_config.c;h=2ceda8150278ed0154916b88c7bd0dc8f8df6951;hb=df891803fa64dfefb791183078c4248be4b8526f;hp=dfb4509d63f903f26360e9b367010196155a8a09;hpb=f7247294488509fca6dc8e0d32f63cd8ae51b555;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2_config.c b/src/pazpar2_config.c index dfb4509..2ceda81 100644 --- a/src/pazpar2_config.c +++ b/src/pazpar2_config.c @@ -26,9 +26,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include -#include -#include -#include #include #include @@ -114,7 +111,7 @@ static void conf_sortkey_assign(NMEM nmem, } -static struct conf_service *service_init(struct conf_config *config, +static struct conf_service *service_init(struct conf_server *server, int num_metadata, int num_sortkeys, const char *service_id) { @@ -122,15 +119,16 @@ static struct conf_service *service_init(struct conf_config *config, NMEM nmem = nmem_create(); service = nmem_malloc(nmem, sizeof(struct conf_service)); + service->ref_count = 1; service->nmem = nmem; service->next = 0; service->settings = 0; service->databases = 0; service->targetprofiles = 0; - service->config = config; + service->server = server; service->session_timeout = 60; /* default session timeout */ service->z3950_session_timeout = 180; - service->z3950_connect_timeout = 15; + service->z3950_operation_timeout = 30; service->relevance_pct = 0; service->sort_pct = 0; @@ -244,17 +242,27 @@ static void conf_dir_path(struct conf_config *config, WRBUF w, const char *src) wrbuf_puts(w, src); } -static void service_destroy(struct conf_service *service) +void service_destroy(struct conf_service *service) { if (service) { - pp2_charset_destroy(service->relevance_pct); - pp2_charset_destroy(service->sort_pct); - pp2_charset_destroy(service->mergekey_pct); - nmem_destroy(service->nmem); + assert(service->ref_count > 0); + service->ref_count--; + if (service->ref_count == 0) + { + pp2_charset_destroy(service->relevance_pct); + pp2_charset_destroy(service->sort_pct); + pp2_charset_destroy(service->mergekey_pct); + nmem_destroy(service->nmem); + } } } +void service_incref(struct conf_service *service) +{ + service->ref_count++; +} + static int parse_metadata(struct conf_service *service, xmlNode *n, int *md_node, int *sk_node) { @@ -401,9 +409,19 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, else sortkey_offset = -1; - if (xml_mergekey && strcmp((const char *) xml_mergekey, "no")) + if (xml_mergekey) { - mergekey_type = Metadata_mergekey_yes; + if (!strcmp((const char *) xml_mergekey, "required")) + mergekey_type = Metadata_mergekey_required; + else if (!strcmp((const char *) xml_mergekey, "optional")) + mergekey_type = Metadata_mergekey_optional; + else if (!strcmp((const char *) xml_mergekey, "no")) + mergekey_type = Metadata_mergekey_no; + else + { + yaz_log(YLOG_FATAL, "Unknown value for mergekey: %s", xml_mergekey); + return -1; + } } @@ -422,13 +440,14 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, xmlFree(xml_termlist); xmlFree(xml_rank); xmlFree(xml_setting); + xmlFree(xml_mergekey); (*md_node)++; return 0; } -static struct conf_service *service_create(struct conf_config *config, - xmlNode *node, - const char *service_id) +static struct conf_service *service_create_static(struct conf_server *server, + xmlNode *node, + const char *service_id) { xmlNode *n; int md_node = 0; @@ -451,7 +470,7 @@ static struct conf_service *service_create(struct conf_config *config, xmlFree(sortkey); } - service = service_init(config, num_metadata, num_sortkeys, service_id); + service = service_init(server, num_metadata, num_sortkeys, service_id); for (n = node->children; n; n = n->next) { @@ -470,14 +489,14 @@ static struct conf_service *service_create(struct conf_config *config, return 0; } } - src = xmlGetProp(n, (xmlChar *) "z3950_connect"); + src = xmlGetProp(n, (xmlChar *) "z3950_operation"); if (src) { - service->z3950_connect_timeout = atoi((const char *) src); + service->z3950_operation_timeout = atoi((const char *) src); xmlFree(src); if (service->z3950_session_timeout < 9) { - yaz_log(YLOG_FATAL, "Z39.50 connect timeout out of range"); + yaz_log(YLOG_FATAL, "Z39.50 operation timeout out of range"); return 0; } } @@ -576,7 +595,7 @@ static struct conf_service *service_create(struct conf_config *config, if (src) { WRBUF w = wrbuf_alloc(); - conf_dir_path(config, w, (const char *) src); + conf_dir_path(server->config, w, (const char *) src); settings_read_file(service, wrbuf_cstr(w), pass); wrbuf_destroy(w); xmlFree(src); @@ -614,65 +633,75 @@ static char *parse_settings(struct conf_config *config, return r; } -static void inherit_server_settings(struct conf_server *server) +static void inherit_server_settings(struct conf_service *s) { - struct conf_service *s; - for (s = server->service; s; s = s->next) + struct conf_server *server = s->server; + if (!s->dictionary) /* service has no config settings ? */ { - if (!s->dictionary) /* service has no config settings ? */ + if (server->server_settings) { - if (server->server_settings) - { - /* inherit settings from server */ - init_settings(s); - settings_read_file(s, server->server_settings, 1); - settings_read_file(s, server->server_settings, 2); - } - else - { - yaz_log(YLOG_WARN, "service '%s' has no settings", - s->id ? s->id : "unnamed"); - init_settings(s); - } + /* inherit settings from server */ + init_settings(s); + settings_read_file(s, server->server_settings, 1); + settings_read_file(s, server->server_settings, 2); } - - /* use relevance/sort/mergekey from server if not defined - for this service.. */ - if (!s->relevance_pct) + else { - if (server->relevance_pct) - { - s->relevance_pct = server->relevance_pct; - pp2_charset_incref(s->relevance_pct); - } - else - s->relevance_pct = pp2_charset_create(0); + yaz_log(YLOG_WARN, "service '%s' has no settings", + s->id ? s->id : "unnamed"); + init_settings(s); } - - if (!s->sort_pct) + } + + /* use relevance/sort/mergekey from server if not defined + for this service.. */ + if (!s->relevance_pct) + { + if (server->relevance_pct) { - if (server->sort_pct) - { - s->sort_pct = server->sort_pct; - pp2_charset_incref(s->sort_pct); - } - else - s->sort_pct = pp2_charset_create(0); + s->relevance_pct = server->relevance_pct; + pp2_charset_incref(s->relevance_pct); } - - if (!s->mergekey_pct) + else + s->relevance_pct = pp2_charset_create(0); + } + + if (!s->sort_pct) + { + if (server->sort_pct) { - if (server->mergekey_pct) - { - s->mergekey_pct = server->mergekey_pct; - pp2_charset_incref(s->mergekey_pct); - } - else - s->mergekey_pct = pp2_charset_create(0); + s->sort_pct = server->sort_pct; + pp2_charset_incref(s->sort_pct); } + else + s->sort_pct = pp2_charset_create(0); + } + + if (!s->mergekey_pct) + { + if (server->mergekey_pct) + { + s->mergekey_pct = server->mergekey_pct; + pp2_charset_incref(s->mergekey_pct); + } + else + s->mergekey_pct = pp2_charset_create(0); } } +struct conf_service *service_create(struct conf_server *server, + xmlNode *node) +{ + struct conf_service *service = service_create_static(server, + node, 0); + if (service) + { + inherit_server_settings(service); + resolve_databases(service); + } + return service; +} + static struct conf_server *server_create(struct conf_config *config, NMEM nmem, xmlNode *node) { @@ -686,6 +715,7 @@ static struct conf_server *server_create(struct conf_config *config, server->myurl = 0; server->proxy_addr = 0; server->service = 0; + server->config = config; server->next = 0; server->relevance_pct = 0; server->sort_pct = 0; @@ -777,8 +807,8 @@ static struct conf_server *server_create(struct conf_config *config, } else { - struct conf_service *s = service_create(config, n, - service_id); + struct conf_service *s = service_create_static(server, n, + service_id); xmlFree(service_id); if (!s) return 0; @@ -791,20 +821,22 @@ static struct conf_server *server_create(struct conf_config *config, return 0; } } - inherit_server_settings(server); + if (server->service) + { + struct conf_service *s; + for (s = server->service; s; s = s->next) + inherit_server_settings(s); + } return server; } -xsltStylesheet *conf_load_stylesheet(struct conf_config *config, - const char *fname) +WRBUF conf_get_fname(struct conf_service *service, const char *fname) { + struct conf_config *config = service->server->config; WRBUF w = wrbuf_alloc(); - xsltStylesheet *s; conf_dir_path(config, w, fname); - s = xsltParseStylesheetFile((xmlChar *) wrbuf_cstr(w)); - wrbuf_destroy(w); - return s; + return w; } static struct conf_targetprofiles *parse_targetprofiles(NMEM nmem, @@ -1039,7 +1071,11 @@ struct conf_config *config_create(const char *fname, int verbose) { yaz_log(YLOG_LOG, "Configuration %s after include processing", fname); +#if LIBXML_VERSION >= 20600 xmlDocFormatDump(yaz_log_file(), doc, 0); +#else + xmlDocDump(yaz_log_file(), doc); +#endif } r = parse_config(config, n); }