X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2_config.c;h=ccd7be4769669a45c8082f4444de435eac4be797;hb=1fc1b045b89c4122c305aa0127c06dde4dc4d0a8;hp=86f401a173189b9e63ace8eaf69e3b4dd72c7332;hpb=384d5cac78251cf68841040384ca0fa8912178c7;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2_config.c b/src/pazpar2_config.c index 86f401a..ccd7be4 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,8 @@ 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" #include "eventl.h" @@ -47,16 +49,17 @@ struct conf_config { NMEM nmem; /* for conf_config and servers memory */ struct conf_server *servers; + + int no_threads; WRBUF confdir; + iochan_man_t iochan_man; + database_hosts_t database_hosts; }; 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, @@ -110,12 +113,12 @@ static struct conf_service *service_init(struct conf_server *server, NMEM nmem = nmem_create(); service = nmem_malloc(nmem, sizeof(struct conf_service)); + service->mutex = 0; service->ref_count = 1; service->nmem = nmem; 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; @@ -124,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; @@ -237,13 +241,13 @@ void service_destroy(struct conf_service *service) { if (service) { - assert(service->ref_count > 0); - service->ref_count--; - if (service->ref_count == 0) + if (!pazpar2_decref(&service->ref_count, service->mutex)) { 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); } } @@ -251,7 +255,9 @@ void service_destroy(struct conf_service *service) void service_incref(struct conf_service *service) { - service->ref_count++; + yaz_log(YLOG_LOG, "service_incref. p=%p cnt=%d", service, + service->ref_count); + pazpar2_incref(&service->ref_count, service->mutex); } static int parse_metadata(struct conf_service *service, xmlNode *n, @@ -505,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) @@ -558,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->mergekey_pct) + { + yaz_log(YLOG_LOG, "facety may not repeat in service"); + return 0; + } + else + { + service->facet_pct = pp2_charset_create_xml(n); + if (!service->mergekey_pct) + return 0; + } + } else if (!strcmp((const char *) n->name, (const char *) "metadata")) { if (parse_metadata(service, n, &md_node, &sk_node)) @@ -644,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) { @@ -654,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) @@ -665,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) @@ -676,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); } } @@ -689,6 +709,8 @@ struct conf_service *service_create(struct conf_server *server, { inherit_server_settings(service); resolve_databases(service); + assert(service->mutex == 0); + pazpar2_mutex_create(&service->mutex, "conf"); } return service; } @@ -705,14 +727,17 @@ static struct conf_server *server_create(struct conf_config *config, server->proxy_host = 0; server->proxy_port = 0; server->myurl = 0; - server->proxy_addr = 0; server->service = 0; server->config = config; server->next = 0; 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; + server->database_hosts = 0; if (server_id) { @@ -779,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 *) @@ -828,64 +859,47 @@ 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) { struct conf_service *s = server->service; for (; s; s = s->next) if (s->id && service_id && 0 == strcmp(s->id, service_id)) - return s; + break; else if (!s->id && !service_id) - return s; - return 0; + break; + if (s) + service_incref(s); + 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) { @@ -903,6 +917,15 @@ static int parse_config(struct conf_config *config, xmlNode *root) tmp->next = config->servers; config->servers = tmp; } + else if (!strcmp((const char *) n->name, "threads")) + { + xmlChar *number = xmlGetProp(n, (xmlChar *) "number"); + if (number) + { + config->no_threads = atoi((const char *) number); + xmlFree(number); + } + } else if (!strcmp((const char *) n->name, "targetprofiles")) { yaz_log(YLOG_FATAL, "targetprofiles unsupported here. Must be part of service"); @@ -938,6 +961,8 @@ struct conf_config *config_create(const char *fname, int verbose) config->nmem = nmem; config->servers = 0; + config->no_threads = 0; + config->iochan_man = 0; config->confdir = wrbuf_alloc(); if ((p = strrchr(fname, @@ -991,6 +1016,9 @@ 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); } void config_destroy(struct conf_config *config) @@ -998,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); } @@ -1016,25 +1047,41 @@ void config_stop_listeners(struct conf_config *conf) http_close_server(ser); } -void config_start_databases(struct conf_config *conf) +void config_process_events(struct conf_config *conf) { struct conf_server *ser; + + conf->database_hosts = database_hosts_create(); for (ser = conf->servers; ser; ser = ser->next) { struct conf_service *s = ser->service; + + ser->database_hosts = conf->database_hosts; + for (;s ; s = s->next) + { resolve_databases(s); + assert(s->mutex == 0); + pazpar2_mutex_create(&s->mutex, "service"); + } + http_mutex_init(ser); } + iochan_man_events(conf->iochan_man); } int config_start_listeners(struct conf_config *conf, - const char *listener_override) + const char *listener_override, + const char *record_fname) { struct conf_server *ser; + + conf->iochan_man = iochan_man_create(conf->no_threads); for (ser = conf->servers; ser; ser = ser->next) { WRBUF w = wrbuf_alloc(); int r; + + ser->iochan_man = conf->iochan_man; if (listener_override) { wrbuf_puts(w, listener_override); @@ -1051,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;