X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fconfig.c;h=f02d169507288020bb3c50eda744aaef1aa0238e;hb=90dcde08cb73241173e22e84362c6acf9ee92276;hp=e6f733d5d8cdcef09ea62aa231af97e0fcde6e72;hpb=9b94aba38a8853bb76733c4a37736a4a40856f92;p=pazpar2-moved-to-github.git diff --git a/src/config.c b/src/config.c index e6f733d..f02d169 100644 --- a/src/config.c +++ b/src/config.c @@ -1,7 +1,5 @@ -/* $Id: config.c,v 1.34 2007-05-23 11:19:31 marc Exp $ - Copyright (c) 2006-2007, Index Data. - -This file is part of Pazpar2. +/* This file is part of Pazpar2. + Copyright (C) 2006-2008 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 @@ -14,12 +12,12 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Pazpar2; see the file LICENSE. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. - */ +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ -/* $Id: config.c,v 1.34 2007-05-23 11:19:31 marc Exp $ */ +/* $Id: config.c,v 1.42 2007-10-31 05:29:08 quinn Exp $ */ #include @@ -35,6 +33,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include +#include #define CONFIG_NOEXTERNS #include "config.h" @@ -51,6 +50,7 @@ struct conf_metadata * conf_metadata_assign(NMEM nmem, const char *name, enum conf_metadata_type type, enum conf_metadata_merge merge, + enum conf_setting_type setting, int brief, int termlist, int rank, @@ -61,11 +61,7 @@ struct conf_metadata * conf_metadata_assign(NMEM nmem, metadata->name = nmem_strdup(nmem, name); - // enforcing that merge_range is always type_year - if (merge == Metadata_merge_range) - metadata->type = Metadata_type_year; - else - metadata->type = type; + metadata->type = type; // enforcing that type_year is always range_merge if (metadata->type == Metadata_type_year) @@ -73,6 +69,7 @@ struct conf_metadata * conf_metadata_assign(NMEM nmem, else metadata->merge = merge; + metadata->setting = setting; metadata->brief = brief; metadata->termlist = termlist; metadata->rank = rank; @@ -127,6 +124,7 @@ struct conf_metadata* conf_service_add_metadata(NMEM nmem, const char *name, enum conf_metadata_type type, enum conf_metadata_merge merge, + enum conf_setting_type setting, int brief, int termlist, int rank, @@ -140,7 +138,7 @@ struct conf_metadata* conf_service_add_metadata(NMEM nmem, //md = &((service->metadata)[field_id]); md = service->metadata + field_id; - md = conf_metadata_assign(nmem, md, name, type, merge, + md = conf_metadata_assign(nmem, md, name, type, merge, setting, brief, termlist, rank, sortkey_offset); return md; } @@ -241,14 +239,16 @@ static struct conf_service *parse_service(xmlNode *node) xmlChar *xml_type = xmlGetProp(n, (xmlChar *) "type"); xmlChar *xml_termlist = xmlGetProp(n, (xmlChar *) "termlist"); xmlChar *xml_rank = xmlGetProp(n, (xmlChar *) "rank"); + xmlChar *xml_setting = xmlGetProp(n, (xmlChar *) "setting"); enum conf_metadata_type type = Metadata_type_generic; enum conf_metadata_merge merge = Metadata_merge_no; + enum conf_setting_type setting = Metadata_setting_no; + enum conf_sortkey_type sk_type = Metadata_sortkey_relevance; int brief = 0; int termlist = 0; int rank = 0; int sortkey_offset = 0; - enum conf_sortkey_type sk_type = Metadata_sortkey_relevance; // now do the parsing logic if (!xml_name) @@ -293,6 +293,8 @@ static struct conf_service *parse_service(xmlNode *node) type = Metadata_type_generic; else if (!strcmp((const char *) xml_type, "year")) type = Metadata_type_year; + else if (!strcmp((const char *) xml_type, "date")) + type = Metadata_type_date; else { yaz_log(YLOG_FATAL, @@ -325,6 +327,22 @@ static struct conf_service *parse_service(xmlNode *node) else merge = Metadata_merge_no; + if (xml_setting) + { + if (!strcmp((const char *) xml_setting, "no")) + setting = Metadata_setting_no; + else if (!strcmp((const char *) xml_setting, "postproc")) + setting = Metadata_setting_postproc; + else if (!strcmp((const char *) xml_setting, "parameter")) + setting = Metadata_setting_parameter; + else + { + yaz_log(YLOG_FATAL, + "Unknown value for medadata/setting: %s", xml_setting); + return 0; + } + } + // add a sortkey if so specified if (xml_sortkey && strcmp((const char *) xml_sortkey, "no")) { @@ -358,7 +376,7 @@ static struct conf_service *parse_service(xmlNode *node) // metadata known, assign values conf_service_add_metadata(nmem, service, md_node, (const char *) xml_name, - type, merge, + type, merge, setting, brief, termlist, rank, sortkey_offset); xmlFree(xml_name); @@ -405,16 +423,12 @@ static struct conf_server *parse_server(xmlNode *node) server->proxy_host = 0; server->proxy_port = 0; server->myurl = 0; - server->zproxy_host = 0; - server->zproxy_port = 0; server->service = 0; server->next = 0; server->settings = 0; - -#ifdef HAVE_ICU - server->icu_chn = 0; -#endif // HAVE_ICU - + server->relevance_pct = 0; + server->sort_pct = 0; + server->mergekey_pct = 0; for (n = node->children; n; n = n->next) { @@ -442,33 +456,10 @@ static struct conf_server *parse_server(xmlNode *node) server->proxy_host = nmem_strdup(nmem, (const char *) host); if (myurl) server->myurl = nmem_strdup(nmem, (const char *) myurl); -#ifdef GAGA - else - { - yaz_log(YLOG_FATAL, "Must specify @myurl for proxy"); - return 0; - } -#endif xmlFree(port); xmlFree(host); xmlFree(myurl); } - else if (!strcmp((const char *) n->name, "zproxy")) - { - xmlChar *port = 0; - xmlChar *host = 0; - - port = xmlGetProp(n, (xmlChar *) "port"); - host = xmlGetProp(n, (xmlChar *) "host"); - - if (port) - server->zproxy_port = atoi((const char *) port); - if (host) - server->zproxy_host = nmem_strdup(nmem, (const char *) host); - - xmlFree(port); - xmlFree(host); - } else if (!strcmp((const char *) n->name, "settings")) { if (server->settings) @@ -479,34 +470,17 @@ static struct conf_server *parse_server(xmlNode *node) if (!(server->settings = parse_settings(n))) return 0; } - else if (!strcmp((const char *) n->name, "icu_chain")) + else if (!strcmp((const char *) n->name, "relevance")) { -#ifdef HAVE_ICU - UErrorCode status = U_ZERO_ERROR; - struct icu_chain *chain = icu_chain_xml_config(n, &status); - if (!chain || U_FAILURE(status)){ - //xmlDocPtr icu_doc = 0; - //xmlChar *xmlstr = 0; - //int size = 0; - //xmlDocDumpMemory(icu_doc, size); - - yaz_log(YLOG_FATAL, "Could not parse ICU chain config:\n" - "<%s>\n ... \n", - n->name, n->name); - return 0; - } - server->icu_chn = chain; -#else // HAVE_ICU - yaz_log(YLOG_FATAL, "Error: ICU support requested with element:\n" - "<%s>\n ... \n", - n->name, n->name); - yaz_log(YLOG_FATAL, - "But no ICU support compiled into pazpar2 server."); - yaz_log(YLOG_FATAL, - "Please install libicu36-dev and icu-doc or similar, " - "re-configure and re-compile"); - return 0; -#endif // HAVE_ICU + server->relevance_pct = pp2_charset_create_xml(n->children); + } + else if (!strcmp((const char *) n->name, "sort")) + { + server->sort_pct = pp2_charset_create_xml(n->children); + } + else if (!strcmp((const char *) n->name, "mergekey")) + { + server->mergekey_pct = pp2_charset_create_xml(n->children); } else if (!strcmp((const char *) n->name, "service")) { @@ -521,13 +495,22 @@ static struct conf_server *parse_server(xmlNode *node) return 0; } } + if (!server->relevance_pct) + server->relevance_pct = pp2_charset_create(0); + if (!server->sort_pct) + server->sort_pct = pp2_charset_create(0); + if (!server->mergekey_pct) + server->mergekey_pct = pp2_charset_create(0); return server; } xsltStylesheet *conf_load_stylesheet(const char *fname) { char path[256]; - sprintf(path, "%s/%s", confdir, fname); + if (*fname == '/') + yaz_snprintf(path, sizeof(path), fname); + else + yaz_snprintf(path, sizeof(path), "%s/%s", confdir, fname); return xsltParseStylesheetFile((xmlChar *) path); } @@ -626,6 +609,8 @@ int read_config(const char *fname) if ((p = strrchr(fname, '/'))) { int len = p - fname; + if (len >= sizeof(confdir)) + len = sizeof(confdir)-1; strncpy(confdir, fname, len); confdir[len] = '\0'; }