X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2_config.c;h=290a39a7ea25a47ecf3ea90c39a701172eec5817;hb=24ad8ea356d71c764af19897e2719670a94a3a05;hp=1dfb379fd1c8702eb7bb35a5b10d0c4620bf3832;hpb=0f6803c7688b9ea110673c3f4a3812d6e7c5fc53;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2_config.c b/src/pazpar2_config.c index 1dfb379..290a39a 100644 --- a/src/pazpar2_config.c +++ b/src/pazpar2_config.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2013 Index Data + Copyright (C) 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 @@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include +#include #include #include @@ -52,9 +53,10 @@ struct conf_config struct conf_server *servers; int no_threads; + int max_sockets; WRBUF confdir; + char *path; iochan_man_t iochan_man; - database_hosts_t database_hosts; }; struct service_xslt @@ -78,7 +80,7 @@ static char *xml_context(const xmlNode *ptr, char *res, size_t len) off = off - l; memcpy(res + off, attr->name, l); res[--off] = '@'; - } + } while (ptr && ptr->type == XML_ELEMENT_NODE) { size_t l = strlen((const char *) ptr->name); @@ -168,7 +170,8 @@ static struct conf_metadata* conf_service_add_metadata( enum conf_metadata_mergekey mt, const char *facetrule, const char *limitmap, - const char *limitcluster + const char *limitcluster, + const char *icurule ) { struct conf_metadata * md = 0; @@ -200,6 +203,7 @@ static struct conf_metadata* conf_service_add_metadata( md->facetrule = nmem_strdup_null(nmem, facetrule); md->limitmap = nmem_strdup_null(nmem, limitmap); md->limitcluster = nmem_strdup_null(nmem, limitcluster); + md->icurule = nmem_strdup_null(nmem, icurule); return md; } @@ -207,7 +211,7 @@ static struct conf_sortkey *conf_service_add_sortkey( struct conf_service *service, int field_id, const char *name, - enum conf_sortkey_type type) + enum conf_metadata_type type) { struct conf_sortkey *sk = 0; NMEM nmem = service->nmem; @@ -255,13 +259,20 @@ int conf_service_sortkey_field_id(struct conf_service *service, static void conf_dir_path(struct conf_config *config, WRBUF w, const char *src) { - if (config->confdir && wrbuf_len(config->confdir) > 0 && - !yaz_is_abspath(src)) + char full_path[1024]; + if (yaz_filepath_resolve(src, config->path, + wrbuf_len(config->confdir) > 0 ? + wrbuf_cstr(config->confdir) : ".", + full_path)) { - wrbuf_printf(w, "%s/%s", wrbuf_cstr(config->confdir), src); + wrbuf_puts(w, full_path); } else + { + yaz_log(YLOG_WARN, "File not found: fname=%s path=%s base=%s", src, + config->path, wrbuf_cstr(config->confdir)); wrbuf_puts(w, src); + } } void service_destroy(struct conf_service *service) @@ -281,8 +292,6 @@ void service_destroy(struct conf_service *service) void service_incref(struct conf_service *service) { - yaz_log(YLOG_LOG, "service_incref. p=%p cnt=%d", service, - service->ref_count); pazpar2_incref(&service->ref_count, service->mutex); } @@ -308,6 +317,7 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, xmlChar *xml_limitmap = 0; xmlChar *xml_limitcluster = 0; xmlChar *xml_icu_chain = 0; + xmlChar *xml_icurule = 0; struct _xmlAttr *attr; @@ -351,6 +361,9 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, else if (!xmlStrcmp(attr->name, BAD_CAST "limitcluster") && attr->children && attr->children->type == XML_TEXT_NODE) xml_limitcluster = attr->children->content; + else if (!xmlStrcmp(attr->name, BAD_CAST "icurule") && + attr->children && attr->children->type == XML_TEXT_NODE) + xml_icurule = attr->children->content; else { yaz_log(YLOG_FATAL, "Unknown metadata attribute '%s'", attr->name); @@ -394,6 +407,8 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, type = Metadata_type_year; else if (!strcmp((const char *) xml_type, "date")) type = Metadata_type_date; + else if (!strcmp((const char *) xml_type, "float")) + type = Metadata_type_float; else { yaz_log(YLOG_FATAL, @@ -435,7 +450,7 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, else { yaz_log(YLOG_FATAL, - "Unknown value for medadata/setting: %s", xml_setting); + "Unknown value for metadata/setting: %s", xml_setting); return -1; } } @@ -443,17 +458,29 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, // add a sortkey if so specified if (xml_sortkey && strcmp((const char *) xml_sortkey, "no")) { - enum conf_sortkey_type sk_type; + enum conf_metadata_type sk_type = type; if (merge == Metadata_merge_no) { yaz_log(YLOG_FATAL, "Can't specify sortkey on a non-merged field"); return -1; } + if (!strcmp((const char *) xml_sortkey, "yes")) + ; if (!strcmp((const char *) xml_sortkey, "numeric")) - sk_type = Metadata_sortkey_numeric; + ; else if (!strcmp((const char *) xml_sortkey, "skiparticle")) - sk_type = Metadata_sortkey_skiparticle; + { + if (sk_type == Metadata_type_generic) + sk_type = Metadata_type_skiparticle; + else + { + yaz_log(YLOG_FATAL, + "skiparticle only supported for type=generic: %s", + xml_type); + return -1; + } + } else { yaz_log(YLOG_FATAL, @@ -494,11 +521,25 @@ static int parse_metadata(struct conf_service *service, xmlNode *n, mergekey_type, (const char *) xml_icu_chain, (const char *) xml_limitmap, - (const char *) xml_limitcluster); + (const char *) xml_limitcluster, + (const char *) xml_icurule + ); (*md_node)++; return 0; } + +static void count_metadata(xmlNode *n, int *num_metadata, int *num_sortkeys) +{ + xmlChar *sortkey = xmlGetProp(n, (xmlChar *) "sortkey"); + (*num_metadata)++; + + if (sortkey && strcmp((const char *) sortkey, "no")) + (*num_sortkeys)++; + xmlFree(sortkey); +} + + static struct conf_service *service_create_static(struct conf_server *server, xmlNode *node, const char *service_id) @@ -517,11 +558,18 @@ static struct conf_service *service_create_static(struct conf_server *server, if (n->type == XML_ELEMENT_NODE && !strcmp((const char *) n->name, "metadata")) { - xmlChar *sortkey = xmlGetProp(n, (xmlChar *) "sortkey"); - num_metadata++; - if (sortkey && strcmp((const char *) sortkey, "no")) - num_sortkeys++; - xmlFree(sortkey); + if (n->children) // This is a container, look at its contents. + { + xmlNode *m; + for (m = n->children; m; m = m->next) + { + if (m->type == XML_ELEMENT_NODE && + !strcmp((const char *) m->name, "metadata")) + count_metadata(m, &num_metadata, &num_sortkeys); + } + } + else // This is a metadata-element proper, count it right away. + count_metadata(n, &num_metadata, &num_sortkeys); } service = service_init(server, num_metadata, num_sortkeys, service_id); @@ -609,8 +657,8 @@ static struct conf_service *service_create_static(struct conf_server *server, { if (!service->charsets) service->charsets = pp2_charset_fact_create(); - if (pp2_charset_fact_define(service->charsets, - n->children, (const char *) n->name)) + if (pp2_charset_fact_define(service->charsets, n, + (const char *) n->name)) { yaz_log(YLOG_FATAL, "ICU chain definition error"); return 0; @@ -618,8 +666,17 @@ static struct conf_service *service_create_static(struct conf_server *server, } else if (!strcmp((const char *) n->name, (const char *) "metadata")) { - if (parse_metadata(service, n, &md_node, &sk_node)) - return 0; + if (n->children) // This is a container, look at its content. + { + xmlNode *m; + for (m = n->children; m; m = m->next) + if ((!strcmp((const char *) m->name, (const char *) "metadata"))) + if (parse_metadata(service, m, &md_node, &sk_node)) + return 0; + } + else // This is a metadata-element proper, count it right away. + if (parse_metadata(service, n, &md_node, &sk_node)) + return 0; } else if (!strcmp((const char *) n->name, (const char *) "xslt")) { @@ -639,7 +696,7 @@ static struct conf_service *service_create_static(struct conf_server *server, service->rank_cluster = 1; else if (!strcmp(rank_cluster, "no")) service->rank_cluster = 0; - else + else { yaz_log(YLOG_FATAL, "service: rank@cluster boolean"); return 0; @@ -670,7 +727,7 @@ static struct conf_service *service_create_static(struct conf_server *server, if (!strcmp(rank_length, "linear")) service->rank_length = 2; else if (!strcmp(rank_length, "log")) - service->rank_length = 1; + service->rank_length = 1; else if (!strcmp(rank_length, "none")) service->rank_length = 0; else @@ -823,7 +880,6 @@ static struct conf_server *server_create(struct conf_config *config, server->charsets = 0; server->http_server = 0; server->iochan_man = 0; - server->database_hosts = config->database_hosts; server->settings_fname = 0; if (server_id) @@ -903,8 +959,8 @@ static struct conf_server *server_create(struct conf_config *config, { if (!server->charsets) server->charsets = pp2_charset_fact_create(); - if (pp2_charset_fact_define(server->charsets, - n->children, (const char *) n->name)) + if (pp2_charset_fact_define(server->charsets, n, + (const char *) n->name)) { yaz_log(YLOG_FATAL, "ICU chain definition error"); return 0; @@ -1015,66 +1071,73 @@ static void info_service_metadata(struct conf_service *service, WRBUF w) } if (md->sortkey_offset > 0) { wrbuf_puts(w, " sortkey=\""); - switch (service->sortkeys[md->sortkey_offset].type) { - case Metadata_sortkey_relevance: - wrbuf_puts(w, "relevance"); - break; - case Metadata_sortkey_numeric: - wrbuf_puts(w, "numeric"); - break; - case Metadata_sortkey_skiparticle: - wrbuf_puts(w, "skiparticle"); - break; - case Metadata_sortkey_string: - wrbuf_puts(w, "string"); - break; - case Metadata_sortkey_position: - wrbuf_puts(w, "position"); - break; - } - wrbuf_puts(w, "\""); - } - - switch (md->type) { - case Metadata_type_generic: - break; - case Metadata_type_year: - wrbuf_puts(w, " type=\"year\""); - break; - case Metadata_type_date: - wrbuf_puts(w, " type=\"date\""); - break; - } - - switch (md->merge) { - case Metadata_merge_no: - break; - case Metadata_merge_unique: - wrbuf_puts(w, " merge=\"unique\""); + switch (service->sortkeys[md->sortkey_offset].type) + { + case Metadata_type_relevance: + wrbuf_puts(w, "relevance"); break; - case Metadata_merge_longest: - wrbuf_puts(w, " merge=\"longest\""); + case Metadata_type_skiparticle: + wrbuf_puts(w, "skiparticle"); break; - case Metadata_merge_range: - wrbuf_puts(w, " merge=\"range\""); + case Metadata_type_position: + wrbuf_puts(w, "position"); break; - case Metadata_merge_all: - wrbuf_puts(w, " merge=\"all\""); + case Metadata_type_retrieval: + wrbuf_puts(w, "retrieval"); break; - case Metadata_merge_first: - wrbuf_puts(w, " merge=\"first\""); + default: + wrbuf_puts(w, "yes"); break; + } + wrbuf_puts(w, "\""); } - - switch (md->mergekey) { - case Metadata_mergekey_no: - break; - case Metadata_mergekey_optional: - wrbuf_puts(w, " mergekey=\"optional\""); - break; - case Metadata_mergekey_required: - wrbuf_puts(w, " mergekey=\"required\""); - break; + switch (md->type) + { + case Metadata_type_generic: + case Metadata_type_skiparticle: + break; + case Metadata_type_year: + wrbuf_puts(w, " type=\"year\""); + break; + case Metadata_type_date: + wrbuf_puts(w, " type=\"date\""); + break; + case Metadata_type_float: + wrbuf_puts(w, " type=\"float\""); + break; + default: + break; + } + switch (md->merge) + { + case Metadata_merge_no: + break; + case Metadata_merge_unique: + wrbuf_puts(w, " merge=\"unique\""); + break; + case Metadata_merge_longest: + wrbuf_puts(w, " merge=\"longest\""); + break; + case Metadata_merge_range: + wrbuf_puts(w, " merge=\"range\""); + break; + case Metadata_merge_all: + wrbuf_puts(w, " merge=\"all\""); + break; + case Metadata_merge_first: + wrbuf_puts(w, " merge=\"first\""); + break; + } + switch (md->mergekey) + { + case Metadata_mergekey_no: + break; + case Metadata_mergekey_optional: + wrbuf_puts(w, " mergekey=\"optional\""); + break; + case Metadata_mergekey_required: + wrbuf_puts(w, " mergekey=\"required\""); + break; } wrbuf_puts(w, " />\n"); } @@ -1083,40 +1146,38 @@ static void info_service_metadata(struct conf_service *service, WRBUF w) static void info_service_databases(struct conf_service *service, WRBUF w) { - struct database *db; - struct setting *s; - int i; if (service->databases) { + struct database *db; wrbuf_puts(w, " \n"); - for(db = service->databases; db; db = db->next) + for (db = service->databases; db; db = db->next) { + int i; wrbuf_puts(w, " id) { - wrbuf_puts(w, " id=\""); - wrbuf_printf(w, "%s", db->id); - wrbuf_puts(w, "\""); + if (db->id) + { + wrbuf_puts(w, " id=\""); + wrbuf_printf(w, "%s", db->id); + wrbuf_puts(w, "\""); } wrbuf_puts(w, ">\n"); for (i = 0; i < db->num_settings; i++) { - s = db->settings[i]; - while (s != NULL) { - wrbuf_puts(w, " settings[i]; + for (; s; s = s->next) + { + wrbuf_puts(w, " name); wrbuf_puts(w, "\""); wrbuf_puts(w, " value=\""); wrbuf_xmlputs(w, s->value); wrbuf_puts(w, "\""); wrbuf_puts(w, " />\n"); - s = s->next; } } wrbuf_puts(w, " \n"); } - wrbuf_puts(w, " \n"); } } @@ -1125,7 +1186,6 @@ void info_services(struct conf_server *server, WRBUF w) { struct conf_service *s = server->service; int i; - struct setting *S; wrbuf_puts(w, " \n"); for (; s; s = s->next) @@ -1140,34 +1200,30 @@ void info_services(struct conf_server *server, WRBUF w) wrbuf_puts(w, ">\n"); if (s->settings) { - for (i=0; isettings->num_settings; i++) + for (i = 0; i < s->settings->num_settings; i++) { - S = s->settings->settings[i]; - while (S != NULL) { - wrbuf_puts(w, " settings->settings[i]; + for (; S; S = S->next) + { + wrbuf_puts(w, " name); wrbuf_puts(w, "\""); wrbuf_puts(w, " value=\""); wrbuf_xmlputs(w, S->value); wrbuf_puts(w, "\""); - if (S->target) { + if (S->target) + { wrbuf_puts(w, " target=\""); wrbuf_xmlputs(w, S->target); wrbuf_puts(w, "\""); } - wrbuf_puts(w, " />\n"); - - S = S->next; } } } info_service_metadata(s, w); info_service_databases(s, w); - wrbuf_puts(w, " "); - - wrbuf_puts(w, "\n"); + wrbuf_puts(w, " \n"); } wrbuf_puts(w, " \n"); } @@ -1197,6 +1253,24 @@ static int parse_config(struct conf_config *config, xmlNode *root) xmlFree(number); } } + else if (!strcmp((const char *) n->name, "sockets")) + { + xmlChar *number = xmlGetProp(n, (xmlChar *) "max"); + if (number) + { + config->max_sockets = atoi((const char *) number); + xmlFree(number); + } + } + else if (!strcmp((const char *) n->name, "file")) + { + xmlChar *path = xmlGetProp(n, (xmlChar *) "path"); + if (path) + { + config->path = nmem_strdup(config->nmem, (const char *) path); + xmlFree(path); + } + } else if (!strcmp((const char *) n->name, "targetprofiles")) { yaz_log(YLOG_FATAL, "targetprofiles unsupported here. Must be part of service"); @@ -1212,9 +1286,12 @@ static int parse_config(struct conf_config *config, xmlNode *root) return 0; } -struct conf_config *config_create(const char *fname, int verbose) +struct conf_config *config_create(const char *fname) { - xmlDoc *doc = xmlParseFile(fname); + xmlDoc *doc = xmlReadFile(fname, + NULL, + XML_PARSE_XINCLUDE + + XML_PARSE_NSCLEAN + XML_PARSE_NONET); xmlNode *n; const char *p; int r; @@ -1230,11 +1307,20 @@ struct conf_config *config_create(const char *fname, int verbose) return 0; } + // Perform XInclude. + r = xmlXIncludeProcess(doc); + if (r == -1) + { + yaz_log(YLOG_FATAL, "XInclude processing failed"); + return 0; + } + config->nmem = nmem; config->servers = 0; + config->path = nmem_strdup(nmem, "."); config->no_threads = 0; + config->max_sockets = 0; config->iochan_man = 0; - config->database_hosts = database_hosts_create(); config->confdir = wrbuf_alloc(); if ((p = strrchr(fname, @@ -1254,16 +1340,15 @@ struct conf_config *config_create(const char *fname, int verbose) r = yaz_xml_include_simple(n, wrbuf_cstr(config->confdir)); if (r == 0) /* OK */ { - if (verbose) - { - yaz_log(YLOG_LOG, "Configuration %s after include processing", - fname); +#ifndef WIN32 + yaz_log(YLOG_LOG, "Configuration %s after include processing", + fname); #if LIBXML_VERSION >= 20600 - xmlDocFormatDump(yaz_log_file(), doc, 0); + xmlDocFormatDump(yaz_log_file(), doc, 0); #else - xmlDocDump(yaz_log_file(), doc); + xmlDocDump(yaz_log_file(), doc); +#endif #endif - } r = parse_config(config, n); } xmlFreeDoc(doc); @@ -1286,7 +1371,6 @@ void server_destroy(struct conf_server *server) s = s_next; } pp2_charset_fact_destroy(server->charsets); - yaz_log(YLOG_LOG, "server_destroy server=%p", server); http_server_destroy(server->http_server); } @@ -1301,7 +1385,6 @@ void config_destroy(struct conf_config *config) 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); @@ -1339,7 +1422,7 @@ int config_start_listeners(struct conf_config *conf, { struct conf_server *ser; - conf->iochan_man = iochan_man_create(conf->no_threads); + conf->iochan_man = iochan_man_create(conf->no_threads, conf->max_sockets); for (ser = conf->servers; ser; ser = ser->next) { WRBUF w;