Happy new year
[pazpar2-moved-to-github.git] / src / pazpar2_config.c
index 8068b13..92717e2 100644 (file)
@@ -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
@@ -78,7 +78,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);
@@ -207,7 +207,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;
@@ -392,6 +392,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,
@@ -433,7 +435,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;
         }
     }
@@ -441,17 +443,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,
@@ -1013,66 +1027,71 @@ 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\"");
-                    break;
-                case Metadata_merge_longest:
-                    wrbuf_puts(w, " merge=\"longest\"");
+                switch (service->sortkeys[md->sortkey_offset].type)
+                {
+                case Metadata_type_relevance:
+                    wrbuf_puts(w, "relevance");
                     break;
-                case Metadata_merge_range:
-                    wrbuf_puts(w, " merge=\"range\"");
+                case Metadata_type_skiparticle:
+                    wrbuf_puts(w, "skiparticle");
                     break;
-                case Metadata_merge_all:
-                    wrbuf_puts(w, " merge=\"all\"");
+                case Metadata_type_position:
+                    wrbuf_puts(w, "position");
                     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;
+            case Metadata_type_relevance:
+            case Metadata_type_position:
+                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");
         }
@@ -1091,16 +1110,18 @@ static void info_service_databases(struct conf_service *service, WRBUF w)
         for(db = service->databases; db; db = db->next)
         {
             wrbuf_puts(w, "    <database");
-            if (db->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) {
+                while (s != NULL)
+                {
                     wrbuf_puts(w, "     <setting");
                     wrbuf_puts(w, " name=\"");
                     wrbuf_xmlputs(w, s->name);
@@ -1114,7 +1135,6 @@ static void info_service_databases(struct conf_service *service, WRBUF w)
             }
             wrbuf_puts(w, "    </database>\n");
         }
-
         wrbuf_puts(w, "   </databases>\n");
     }
 }