nmake: align with pazpar2 WRT icu/libxslt
[idzebra-moved-to-github.git] / index / attribute.c
index 4272aab..92f7fc0 100644 (file)
@@ -1,8 +1,5 @@
-/* $Id: attribute.c,v 1.31 2007-05-08 12:50:04 adam Exp $
-   Copyright (C) 1995-2007
-   Index Data ApS
-
-This file is part of the Zebra server.
+/* This file is part of the Zebra server.
+   Copyright (C) Index Data
 
 Zebra 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
@@ -20,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include <stdio.h>
 
 #include <yaz/log.h>
@@ -69,7 +69,7 @@ static int att_getentbyatt(ZebraHandle zi, const Odr_oid *set, int att,
 ZEBRA_RES zebra_attr_list_get_ord(ZebraHandle zh,
                                   Z_AttributeList *attr_list,
                                   zinfo_index_category_t cat,
-                                  int index_type,
+                                  const char *index_type,
                                   const Odr_oid *curAttributeSet,
                                   int *ord)
 {
@@ -89,7 +89,7 @@ ZEBRA_RES zebra_attr_list_get_ord(ZebraHandle zh,
     {
         /* we have a use attribute and attribute set */
         int r;
-        
+
         r = att_getentbyatt(zh, curAttributeSet, use_value, &use_string);
         if (r == -2)
         {
@@ -98,7 +98,7 @@ ZEBRA_RES zebra_attr_list_get_ord(ZebraHandle zh,
         }
         if (r == -1)
         {
-            zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE,  use_value);
+            zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_value);
             return ZEBRA_FAIL;
         }
     }
@@ -107,22 +107,34 @@ ZEBRA_RES zebra_attr_list_get_ord(ZebraHandle zh,
         zebra_setError(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, 0);
         return ZEBRA_FAIL;
     }
-    *ord = zebraExplain_lookup_attr_str(zh->reg->zei, cat, 
+    *ord = zebraExplain_lookup_attr_str(zh->reg->zei, cat,
                                         index_type, use_string);
     if (*ord == -1)
     {
-        if (use_value < 0)
-            zebra_setError(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_string);
-        else
-            zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_value);
-        return ZEBRA_FAIL;
+        /* attribute 14=1 does not issue a diagnostic even
+           1) the attribute is numeric but listed in .att
+           2) the use attribute is string
+        */
+        AttrType unsup;
+        int unsup_value = 0;
+        attr_init_AttrList(&unsup, attr_list, 14);
+        unsup_value = attr_find(&unsup, 0);
+
+        if (unsup_value != 1)
+        {
+            if (use_value < 0)
+                zebra_setError(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_string);
+            else
+                zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, use_value);
+            return ZEBRA_FAIL;
+        }
     }
     return ZEBRA_OK;
 }
 
 ZEBRA_RES zebra_apt_get_ord(ZebraHandle zh,
                             Z_AttributesPlusTerm *zapt,
-                            int index_type,
+                            const char *index_type,
                             const char *xpath_use,
                             const Odr_oid *curAttributeSet,
                             int *ord)
@@ -137,7 +149,7 @@ ZEBRA_RES zebra_apt_get_ord(ZebraHandle zh,
 
     if (relation_value == 103) /* always matches */
         cat = zinfo_index_category_alwaysmatches;
-    
+
     if (!xpath_use)
     {
         res = zebra_attr_list_get_ord(zh, zapt->attributes,
@@ -146,10 +158,10 @@ ZEBRA_RES zebra_apt_get_ord(ZebraHandle zh,
         /* use attribute not found. But it the relation is
            always matches and the regulare index attribute is found
            return a different diagnostic */
-        if (res != ZEBRA_OK && 
+        if (res != ZEBRA_OK &&
             relation_value == 103
             &&  zebra_attr_list_get_ord(
-                zh, zapt->attributes, 
+                zh, zapt->attributes,
                 zinfo_index_category_index, index_type,
                 curAttributeSet, ord) == ZEBRA_OK)
             zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE, 103);
@@ -160,16 +172,16 @@ ZEBRA_RES zebra_apt_get_ord(ZebraHandle zh,
                                             xpath_use);
         if (*ord == -1)
         {
-            yaz_log(YLOG_LOG, "zebra_apt_get_ord FAILED xpath=%s index_type=%c",
+            yaz_log(YLOG_LOG, "zebra_apt_get_ord FAILED xpath=%s index_type=%s",
                     xpath_use, index_type);
             zebra_setError(zh, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, 0);
             res = ZEBRA_FAIL;
         }
         else
         {
-            yaz_log(YLOG_LOG, "zebra_apt_get_ord OK xpath=%s index_type=%c",
+            yaz_log(YLOG_LOG, "zebra_apt_get_ord OK xpath=%s index_type=%s",
                     xpath_use, index_type);
-            
+
         }
     }
     return res;
@@ -193,7 +205,7 @@ ZEBRA_RES zebra_sort_get_ord(ZebraHandle zh,
     if (zebra_attr_list_get_ord(
             zh, sortAttributes->list,
             zinfo_index_category_sort,
-            -1 /* any index */, yaz_oid_attset_bib_1, ord) == ZEBRA_OK)
+            0 /* any index */, yaz_oid_attset_bib_1, ord) == ZEBRA_OK)
         return ZEBRA_OK;
     return ZEBRA_FAIL;
 }
@@ -202,6 +214,7 @@ ZEBRA_RES zebra_sort_get_ord(ZebraHandle zh,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab