Towards 2.0.12
[idzebra-moved-to-github.git] / index / recgrs.c
index c8bebf9..3137760 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: recgrs.c,v 1.11 2006-11-30 11:03:57 adam Exp $
-   Copyright (C) 1995-2006
+/* $Id: recgrs.c,v 1.16 2007-03-07 21:08:36 adam Exp $
+   Copyright (C) 1995-2007
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include <yaz/log.h>
 #include <yaz/oid.h>
+#include <yaz/diagbib1.h>
 
 #include <d1_absyn.h>
 #include <idzebra/recgrs.h>
@@ -536,7 +537,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
     char tag_path_full[1024];
     int termlist_only = 1;
     data1_termlist *tl;
-    int xpdone = 0;
+
     if (!n->root->u.root.absyn 
         || 
         n->root->u.root.absyn->xpath_indexing == DATA1_XPATH_INDEXING_ENABLE)
@@ -544,12 +545,12 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
        termlist_only = 0;
     }
 
+
     switch (n->which)
     {
     case DATA1N_data:
         wrd->term_buf = n->u.data.data;
         wrd->term_len = n->u.data.len;
-        xpdone = 0;
 
        mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n);
        
@@ -584,7 +585,9 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     fputc ('\n', stdout);
                 }
                 else
+                {
                     (*p->tokenAdd)(&wrd_tl);
+                }
                 if (wrd_tl.seqno > max_seqno)
                     max_seqno = wrd_tl.seqno;
            }
@@ -594,7 +597,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
        }
        /* xpath indexing is done, if there was no termlist given, 
           or no ! in the termlist, and default indexing is enabled... */
-       if (!p->flagShowRecords && !xpdone && !termlist_only)
+       if (!p->flagShowRecords && !termlist_only)
        {
            wrd->index_name = xpath_index;
            wrd->index_type = 'w';
@@ -602,8 +605,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
        }
         break;
     case DATA1N_tag:
-        if (termlist_only)
-            return;
        mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n);
 
         wrd->index_type = '0';
@@ -623,7 +624,8 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
         {
             data1_xattr *xp;
 
-            (*p->tokenAdd)(wrd);   /* index element pag (AKA tag path) */
+            if (!termlist_only)
+                (*p->tokenAdd)(wrd);   /* index element pag (AKA tag path) */
             
             if (xpath_is_start == 1) /* only for the starting tag... */
             {
@@ -638,35 +640,38 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     /* this could be cached as well */
                     sprintf (attr_tag_path_full, "@%s/%s",
                              xp->name, tag_path_full);
-                    
+
                     tll[i] = xpath_termlist_by_tagpath(attr_tag_path_full,n);
                     
-                    /* attribute  (no value) */
-                    wrd->index_type = '0';
-                    wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
-                    wrd->term_buf = xp->name;
-                    wrd->term_len = strlen(xp->name);
-                    
-                    wrd->seqno--;
-                    (*p->tokenAdd)(wrd);
-                    
-                    if (xp->value 
-                        &&
-                        strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2)
+                    if (!termlist_only)
                     {
-                        /* attribute value exact */
-                        strcpy (comb, xp->name);
-                        strcat (comb, "=");
-                        strcat (comb, xp->value);
-                        
-                        wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+                        /* attribute  (no value) */
                         wrd->index_type = '0';
-                        wrd->term_buf = comb;
-                        wrd->term_len = strlen(comb);
-                        wrd->seqno--;
+                        wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+                        wrd->term_buf = xp->name;
+                        wrd->term_len = strlen(xp->name);
                         
+                        wrd->seqno--;
                         (*p->tokenAdd)(wrd);
-                    }                
+                        
+                        if (xp->value 
+                            &&
+                            strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2)
+                        {
+                            /* attribute value exact */
+                            strcpy (comb, xp->name);
+                            strcat (comb, "=");
+                            strcat (comb, xp->value);
+                            
+                            wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+                            wrd->index_type = '0';
+                            wrd->term_buf = comb;
+                            wrd->term_len = strlen(comb);
+                            wrd->seqno--;
+                            
+                            (*p->tokenAdd)(wrd);
+                        }
+                    }     
                     i++;
                 }
                 
@@ -678,7 +683,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     
                     sprintf (attr_tag_path_full, "@%s/%s",
                              xp->name, tag_path_full);
-                    
                     if ((tl = tll[i]))
                     {
                         /* If there is a termlist given (=xelm directive) */
@@ -707,7 +711,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     /* if there was no termlist for the given path, 
                        or the termlist didn't have a ! element, index 
                        the attribute as "w" */
-                    if ((!xpdone) && (!termlist_only))
+                    if (!xpdone && !termlist_only)
                     {
                         index_xpath_attr (attr_tag_path_full, xp->name,
                                           xp->value,  "w", p, wrd);
@@ -1110,7 +1114,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p,
     node = (*grs_read)(&gri);
     if (!node)
     {
-       p->diagnostic = 14;
+       p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
         nmem_destroy (mem);
        return 0;
     }
@@ -1186,7 +1190,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p,
                onode = node;
                if (!(node = data1_map_record(p->dh, onode, map, mem)))
                {
-                   p->diagnostic = 14;
+                   p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
                    nmem_destroy (mem);
                    return 0;
                }
@@ -1215,7 +1219,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p,
                 onode = node;
                 if (!(node = data1_map_record(p->dh, onode, map, mem)))
                 {
-                    p->diagnostic = 14;
+                    p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
                     nmem_destroy (mem);
                     return 0;
                 }