wait a second between stop and start in the restart command. This avoid
[pazpar2-moved-to-github.git] / src / pazpar2_config.c
index 174fe83..169de11 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2008 Index Data
+   Copyright (C) 2006-2009 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
@@ -32,6 +32,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <yaz/yaz-util.h>
 #include <yaz/nmem.h>
 #include <yaz/snprintf.h>
+#include <yaz/tpath.h>
 
 #define CONFIG_NOEXTERNS
 #include "pazpar2_config.h"
@@ -43,6 +44,7 @@ static char confdir[256] = ".";
 struct conf_config *config = 0;
 
 
+static 
 struct conf_metadata * conf_metadata_assign(NMEM nmem, 
                                             struct conf_metadata * metadata,
                                             const char *name,
@@ -52,7 +54,8 @@ struct conf_metadata * conf_metadata_assign(NMEM nmem,
                                             int brief,
                                             int termlist,
                                             int rank,
-                                            int sortkey_offset)
+                                            int sortkey_offset,
+                                            enum conf_metadata_mergekey mt)
 {
     if (!nmem || !metadata || !name)
         return 0;
@@ -72,10 +75,12 @@ struct conf_metadata * conf_metadata_assign(NMEM nmem,
     metadata->termlist = termlist;
     metadata->rank = rank;    
     metadata->sortkey_offset = sortkey_offset;
+    metadata->mergekey = mt;
     return metadata;
 }
 
 
+static
 struct conf_sortkey * conf_sortkey_assign(NMEM nmem, 
                                           struct conf_sortkey * sortkey,
                                           const char *name,
@@ -126,7 +131,8 @@ struct conf_metadata* conf_service_add_metadata(NMEM nmem,
                                                 int brief,
                                                 int termlist,
                                                 int rank,
-                                                int sortkey_offset)
+                                                int sortkey_offset,
+                                                enum conf_metadata_mergekey mt)
 {
     struct conf_metadata * md = 0;
 
@@ -137,7 +143,8 @@ 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, setting,
-                             brief, termlist, rank, sortkey_offset);
+                              brief, termlist, rank, sortkey_offset,
+                              mt);
     return md;
 }
 
@@ -238,11 +245,13 @@ static struct conf_service *parse_service(xmlNode *node)
             xmlChar *xml_termlist = xmlGetProp(n, (xmlChar *) "termlist");
             xmlChar *xml_rank = xmlGetProp(n, (xmlChar *) "rank");
             xmlChar *xml_setting = xmlGetProp(n, (xmlChar *) "setting");
+            xmlChar *xml_mergekey = xmlGetProp(n, (xmlChar *) "mergekey");
 
             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;
+            enum conf_metadata_mergekey mergekey_type = Metadata_mergekey_no;
             int brief = 0;
             int termlist = 0;
             int rank = 0;
@@ -371,11 +380,18 @@ static struct conf_service *parse_service(xmlNode *node)
             else
                 sortkey_offset = -1;
 
+            if (xml_mergekey && strcmp((const char *) xml_mergekey, "no"))
+            {
+                mergekey_type = Metadata_mergekey_yes;
+            }
+
+
             // metadata known, assign values
             conf_service_add_metadata(nmem, service, md_node,
                                       (const char *) xml_name,
                                       type, merge, setting,
-                                      brief, termlist, rank, sortkey_offset);
+                                      brief, termlist, rank, sortkey_offset,
+                                      mergekey_type);
 
             xmlFree(xml_name);
             xmlFree(xml_brief);
@@ -402,7 +418,16 @@ static char *parse_settings(xmlNode *node)
     char *r;
 
     if (src)
-        r = nmem_strdup(nmem, (const char *) src);
+    {
+        if (yaz_is_abspath((const char *) src))
+            r = nmem_strdup(nmem, (const char *) src);
+        else
+        {
+            r = nmem_malloc(nmem,
+                            strlen(confdir) + strlen((const char *) src) + 2);
+            sprintf(r, "%s/%s", confdir, src);
+        }
+    }
     else
     {
         yaz_log(YLOG_FATAL, "Must specify src in targetprofile");
@@ -471,15 +496,21 @@ static struct conf_server *parse_server(xmlNode *node)
         }
         else if (!strcmp((const char *) n->name, "relevance"))
         {
-            server->relevance_pct = pp2_charset_create_xml(n->children);
+            server->relevance_pct = pp2_charset_create_xml(n);
+            if (!server->relevance_pct)
+                return 0;
         }
         else if (!strcmp((const char *) n->name, "sort"))
         {
-            server->sort_pct = pp2_charset_create_xml(n->children);
+            server->sort_pct = pp2_charset_create_xml(n);
+            if (!server->sort_pct)
+                return 0;
         }
         else if (!strcmp((const char *) n->name, "mergekey"))
         {
-            server->mergekey_pct = pp2_charset_create_xml(n->children);
+            server->mergekey_pct = pp2_charset_create_xml(n);
+            if (!server->mergekey_pct)
+                return 0;
         }
         else if (!strcmp((const char *) n->name, "service"))
         {
@@ -506,7 +537,7 @@ static struct conf_server *parse_server(xmlNode *node)
 xsltStylesheet *conf_load_stylesheet(const char *fname)
 {
     char path[256];
-    if (*fname == '/')
+    if (yaz_is_abspath(fname))
         yaz_snprintf(path, sizeof(path), fname);
     else
         yaz_snprintf(path, sizeof(path), "%s/%s", confdir, fname);
@@ -605,7 +636,13 @@ int read_config(const char *fname)
         yaz_log(YLOG_FATAL, "Failed to read %s", fname);
         exit(1);
     }
-    if ((p = strrchr(fname, '/')))
+    if ((p = strrchr(fname, 
+#ifdef WIN32
+                     '\\'
+#else
+                     '/'
+#endif
+             )))
     {
         int len = p - fname;
         if (len >= sizeof(confdir))
@@ -626,7 +663,9 @@ int read_config(const char *fname)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab
  */
+