Fixed bad memory reference that could occur if empty key block was to
[idzebra-moved-to-github.git] / index / recgrs.c
index e9283c9..3137760 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: recgrs.c,v 1.10 2006-11-29 18:06: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>
@@ -295,8 +296,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p)
                 res = 0;
                 /* looking for the attribute with a specified name */
                 for (attr = n->u.tag.attributes; attr; attr = attr->next) {
-                    yaz_log(YLOG_DEBUG,"  - attribute %s <-> %s", attname, attr->name );
-                    
                     if (!strcmp(attr->name, attname)) {
                         if (p->u.relation.op[0]) {
                             if (*p->u.relation.op != '=') {
@@ -305,8 +304,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p)
                                 yaz_log(YLOG_WARN, "predicate %s ignored", p->u.relation.name);
                                 res = 1; break;
                             } else {
-                                yaz_log(YLOG_DEBUG,"    - value %s <-> %s", 
-                                     p->u.relation.value, attr->value );
                                 if (!strcmp(attr->value, p->u.relation.value)) {
                                     res = 1; break;
                                 } 
@@ -317,7 +314,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p)
                         }
                     }
                 }
-               yaz_log(YLOG_DEBUG, "return %d", res);
                 return res;
             } else {
                 return 1;
@@ -436,12 +432,8 @@ data1_termlist *xpath_termlist_by_tagpath(char *tagpath, data1_node *n)
                backwards trough xpath location steps ... */
             for (i = xpe->xpath_len - 1; i>0; i--)
            {
-                yaz_log(YLOG_DEBUG, "Checking step %d: %s on tag %s",
-                       i, xp[i].part, nn->u.tag.tag);
-                
                 if (!d1_check_xpath_predicate(nn, xp[i].predicate))
                {
-                    yaz_log(YLOG_DEBUG, "  Predicates didn't match");
                     ok = 0;
                     break;
                 }
@@ -545,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)
@@ -553,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);
        
@@ -593,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;
            }
@@ -603,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';
@@ -611,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';
@@ -632,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... */
             {
@@ -647,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++;
                 }
                 
@@ -687,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) */
@@ -716,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);
@@ -1119,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;
     }
@@ -1195,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;
                }
@@ -1224,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;
                 }